Skip to content

Commit

Permalink
Merge pull request #87 from infinum/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
bojankoma authored Apr 25, 2021
2 parents bfcc3f4 + 8b12dd5 commit e0c7c2f
Show file tree
Hide file tree
Showing 42 changed files with 335 additions and 93 deletions.
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,20 @@
Changelog
=========

## Version 5.3.2

_2021-04-26_

* Fix crash on editor history.

## Version 5.3.1

_2021-04-25_

* Remove Timber dependency.
* Implement an optional logger.
* Update dependencies to more stable releases.

## Version 5.3.0

_2021-04-10_
Expand Down
28 changes: 24 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ With this library you can:
* drop view or trigger
* search table, view or trigger
* sort table, view or trigger per column
* execute any valid SQL command in editor per database connection

## Getting started
To include _DbInspector_ in your project, you have to add buildscript dependencies in your project level `build.gradle` or `build.gradle.kts`:
Expand All @@ -43,13 +44,13 @@ Then add the following dependencies in your app `build.gradle` or `build.gradle.

**Groovy**
```groovy
debugImplementation "com.infinum.dbinspector:dbinspector:5.3.0"
releaseImplementation "com.infinum.dbinspector:dbinspector-no-op:5.3.0"
debugImplementation "com.infinum.dbinspector:dbinspector:5.3.2"
releaseImplementation "com.infinum.dbinspector:dbinspector-no-op:5.3.2"
```
**KotlinDSL**
```kotlin
debugImplementation("com.infinum.dbinspector:dbinspector:5.3.0")
releaseImplementation("com.infinum.dbinspector:dbinspector-no-op:5.3.0")
debugImplementation("com.infinum.dbinspector:dbinspector:5.3.2")
releaseImplementation("com.infinum.dbinspector:dbinspector-no-op:5.3.2")
```

### Usage
Expand Down Expand Up @@ -78,6 +79,25 @@ If you use _DbInspector_ for a specific flavor and need to override merged in la
Please do mind and copy over the suppression comment line too, if you need it.
Further modification can be done according to rules of [manifest merging](https://developer.android.com/studio/build/manifest-merge) and attributes of [activity-alias](https://developer.android.com/guide/topics/manifest/activity-alias-element) XML node.

## Editor

![Editor](editor.png)

_DbInspector_ has a build in editor scoped per database connection currently used.
It offers autocomplete of SQLite3 keywords and functions, current table and column names.
Built in editor also provides a history of executed statements, not matter if they were successful or not.
Hisotry of statements is persisted between sessions and can be cleared on demand at any point.
Panes between editors' input and result are scalable and can be adjusted by dragging the splitter between them.
Landscape mode is supported too for better result preview of large datasets.

## Logging
_DbInspector_ provides a independent and built in logger mechanism. Per default logger is initiated as an `EmptyLogger` omitting any output whatsoever.
In case logs output is required, `AndroidLogger` should be used as shown below:
```kotlin
DbInspector.show(logger = AndroidLogger())
```
Additionally, `AndroidLogger` uses `Level` to filter out between info, debug, error or no messages at all.

## Requirements
Minimum required API level to use _DbInspector_ is **21** known as [Android 5.0, Lollipop](https://www.android.com/versions/lollipop-5-0/).
As of 4.0.0 version, AndroidX is required. If you cannot unfortunately migrate your project, keep the previous version until you get the opportunity to migrate to AndroidX.
Expand Down
4 changes: 2 additions & 2 deletions config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ ext {
]
releaseConfig = [
"group" : "com.infinum.dbinspector",
"version" : "5.3.0",
"versionCode": 5 * 100 * 100 + 3 * 100 + 0
"version" : "5.3.2",
"versionCode": 5 * 100 * 100 + 3 * 100 + 2
]
}
13 changes: 13 additions & 0 deletions dbinspector-no-op/proguard-rules.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
-keep public class com.infinum.dbinspector.DbInspector {
public protected *;
}
-keep public class com.infinum.dbinspector.data.models.memory.logger.Level {
public protected *;
}
-keep public class com.infinum.dbinspector.data.sources.memory.logger.Logger {
public protected *;
}
-keep public class com.infinum.dbinspector.data.sources.memory.logger.EmptyLogger {
public protected *;
}
-keep public class com.infinum.dbinspector.data.sources.memory.logger.AndroidLogger {
public protected *;
}

Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
@file:Suppress("UNUSED_PARAMETER")

package com.infinum.dbinspector

import com.infinum.dbinspector.data.sources.memory.logger.EmptyLogger
import com.infinum.dbinspector.data.sources.memory.logger.Logger

@Suppress("UnusedPrivateMember")
public object DbInspector {

@JvmStatic
public fun show(): Unit = Unit
public fun show(logger: Logger = EmptyLogger()): Unit = Unit
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.infinum.dbinspector.data.models.memory.logger

public enum class Level {
DEBUG,
INFO,
ERROR,
NONE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.infinum.dbinspector.data.sources.memory.logger

import android.util.Log
import com.infinum.dbinspector.data.models.memory.logger.Level

public class AndroidLogger(
level: Level = Level.INFO
) : Logger(level) {

override fun log(level: Level, message: String) {
if (this.level <= level) {
logOnLevel(message, level)
}
}

private fun logOnLevel(message: String, level: Level) {
when (level) {
Level.DEBUG -> Log.d(tag(), message)
Level.INFO -> Log.i(tag(), message)
Level.ERROR -> Log.e(tag(), message)
else -> Log.e(tag(), message)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.infinum.dbinspector.data.sources.memory.logger

import com.infinum.dbinspector.data.models.memory.logger.Level

internal class EmptyLogger : Logger(Level.NONE) {

override fun log(level: Level, message: String) = Unit
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.infinum.dbinspector.data.sources.memory.logger

import com.infinum.dbinspector.data.models.memory.logger.Level

public abstract class Logger(
public var level: Level = Level.INFO
) {

public companion object {
internal const val DEFAULT_LOG_TAG = "[DbInspector]"
}

@Suppress("MemberVisibilityCanBePrivate")
public var tag: String? = null

public abstract fun log(level: Level, message: String)

public fun debug(message: String) {
doLog(Level.DEBUG, message)
}

public fun info(message: String) {
doLog(Level.INFO, message)
}

public fun error(message: String) {
doLog(Level.ERROR, message)
}

protected fun tag(): String = tag ?: DEFAULT_LOG_TAG

private fun canLog(level: Level): Boolean = this.level <= level

private fun doLog(level: Level, message: String) {
if (canLog(level)) {
log(level, message)
}
}
}
2 changes: 0 additions & 2 deletions dbinspector/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ android {
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
freeCompilerArgs += [
'-Xopt-in=org.koin.core.component.KoinApiExtension',
'-Xexplicit-api=strict'
]
useIR = true
Expand All @@ -65,7 +64,6 @@ dependencies {
implementation libs.protobuf.javalite
implementation libs.material
implementation libs.koin
implementation libs.timber
implementation libs.fuzzy
}

Expand Down
14 changes: 14 additions & 0 deletions dbinspector/proguard-rules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,20 @@
-keep public class com.infinum.dbinspector.DbInspector {
public protected *;
}
-keep public class com.infinum.dbinspector.data.models.memory.logger.Level {
public protected *;
}

-keep public class com.infinum.dbinspector.data.sources.memory.logger.Logger {
public protected *;
}

-keep public class com.infinum.dbinspector.data.sources.memory.logger.EmptyLogger {
public protected *;
}
-keep public class com.infinum.dbinspector.data.sources.memory.logger.AndroidLogger {
public protected *;
}
-keep class androidx.datastore.*.* {*;}
-keepclassmembers class * extends androidx.datastore.* {
<fields>;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
package com.infinum.dbinspector

import android.content.Intent
import com.infinum.dbinspector.data.sources.memory.logger.EmptyLogger
import com.infinum.dbinspector.data.sources.memory.logger.Logger
import com.infinum.dbinspector.ui.Presentation
import com.infinum.dbinspector.ui.databases.DatabasesActivity
import timber.log.Timber
import timber.log.Timber.DebugTree

public object DbInspector {

init {
if (BuildConfig.DEBUG) {
Timber.plant(DebugTree())
}
}

@JvmStatic
public fun show(): Unit =
public fun show(logger: Logger = EmptyLogger()) {
Presentation.setLogger(logger)
with(Presentation.applicationContext()) {
this.startActivity(
Intent(
Expand All @@ -26,4 +21,5 @@ public object DbInspector {
}
)
}
}
}
25 changes: 14 additions & 11 deletions dbinspector/src/main/kotlin/com/infinum/dbinspector/data/Data.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@ import com.infinum.dbinspector.data.Data.Constants.Name.PROTO_FILENAME_HISTORY
import com.infinum.dbinspector.data.Data.Constants.Name.PROTO_FILENAME_SETTINGS
import com.infinum.dbinspector.data.models.local.proto.output.HistoryEntity
import com.infinum.dbinspector.data.models.local.proto.output.SettingsEntity
import com.infinum.dbinspector.data.source.local.cursor.PragmaSource
import com.infinum.dbinspector.data.source.local.cursor.RawQuerySource
import com.infinum.dbinspector.data.source.local.cursor.SchemaSource
import com.infinum.dbinspector.data.source.local.proto.history.HistoryDataStore
import com.infinum.dbinspector.data.source.local.proto.history.HistorySerializer
import com.infinum.dbinspector.data.source.local.proto.settings.SettingsDataStore
import com.infinum.dbinspector.data.source.local.proto.settings.SettingsSerializer
import com.infinum.dbinspector.data.source.memory.connection.AndroidConnectionSource
import com.infinum.dbinspector.data.source.memory.pagination.CursorPaginator
import com.infinum.dbinspector.data.source.memory.pagination.Paginator
import com.infinum.dbinspector.data.source.raw.AndroidDatabasesSource
import com.infinum.dbinspector.data.sources.local.cursor.PragmaSource
import com.infinum.dbinspector.data.sources.local.cursor.RawQuerySource
import com.infinum.dbinspector.data.sources.local.cursor.SchemaSource
import com.infinum.dbinspector.data.sources.local.proto.history.HistoryDataStore
import com.infinum.dbinspector.data.sources.local.proto.history.HistorySerializer
import com.infinum.dbinspector.data.sources.local.proto.settings.SettingsDataStore
import com.infinum.dbinspector.data.sources.local.proto.settings.SettingsSerializer
import com.infinum.dbinspector.data.sources.memory.connection.AndroidConnectionSource
import com.infinum.dbinspector.data.sources.memory.pagination.CursorPaginator
import com.infinum.dbinspector.data.sources.memory.pagination.Paginator
import com.infinum.dbinspector.data.sources.raw.AndroidDatabasesSource
import com.infinum.dbinspector.extensions.dataStoreFile
import org.koin.core.module.Module
import org.koin.core.qualifier.StringQualifier
Expand Down Expand Up @@ -145,6 +145,7 @@ internal object Data {
get(qualifier = Qualifiers.Schema.TRIGGERS),
get(qualifier = Qualifiers.Schema.TRIGGER_BY_NAME),
get(qualifier = Qualifiers.Schema.DROP_TRIGGER),
get(),
get()
)
}
Expand All @@ -154,13 +155,15 @@ internal object Data {
get(qualifier = Qualifiers.Pragma.TABLE_INFO),
get(qualifier = Qualifiers.Pragma.FOREIGN_KEYS),
get(qualifier = Qualifiers.Pragma.INDEXES),
get(),
get()
)
}

factory<Sources.Local.RawQuery> {
RawQuerySource(
get(qualifier = Qualifiers.Schema.RAW_QUERY),
get(),
get()
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.infinum.dbinspector.data.models.memory.logger

public enum class Level {
DEBUG,
INFO,
ERROR,
NONE
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.infinum.dbinspector.data.source.local.cursor
package com.infinum.dbinspector.data.sources.local.cursor

import com.infinum.dbinspector.data.Sources
import com.infinum.dbinspector.data.models.local.cursor.exceptions.CursorException
Expand All @@ -8,8 +8,9 @@ import com.infinum.dbinspector.data.models.local.cursor.output.Field
import com.infinum.dbinspector.data.models.local.cursor.output.FieldType
import com.infinum.dbinspector.data.models.local.cursor.output.QueryResult
import com.infinum.dbinspector.data.models.local.cursor.output.Row
import com.infinum.dbinspector.data.source.local.cursor.shared.CursorSource
import com.infinum.dbinspector.data.source.memory.pagination.Paginator
import com.infinum.dbinspector.data.sources.local.cursor.shared.CursorSource
import com.infinum.dbinspector.data.sources.memory.logger.Logger
import com.infinum.dbinspector.data.sources.memory.pagination.Paginator
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlinx.coroutines.suspendCancellableCoroutine
Expand All @@ -18,8 +19,9 @@ internal class PragmaSource(
private val tableInfoPaginator: Paginator,
private val foreignKeysPaginator: Paginator,
private val indexesPaginator: Paginator,
private val store: Sources.Local.Settings
) : CursorSource(), Sources.Local.Pragma {
private val store: Sources.Local.Settings,
logger: Logger
) : CursorSource(logger), Sources.Local.Pragma {

override suspend fun getUserVersion(query: Query): QueryResult =
store.current().let {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.infinum.dbinspector.data.source.local.cursor
package com.infinum.dbinspector.data.sources.local.cursor

import com.infinum.dbinspector.data.Sources
import com.infinum.dbinspector.data.models.local.cursor.exceptions.CursorException
Expand All @@ -8,16 +8,18 @@ import com.infinum.dbinspector.data.models.local.cursor.output.Field
import com.infinum.dbinspector.data.models.local.cursor.output.FieldType
import com.infinum.dbinspector.data.models.local.cursor.output.QueryResult
import com.infinum.dbinspector.data.models.local.cursor.output.Row
import com.infinum.dbinspector.data.source.local.cursor.shared.CursorSource
import com.infinum.dbinspector.data.source.memory.pagination.Paginator
import com.infinum.dbinspector.data.sources.local.cursor.shared.CursorSource
import com.infinum.dbinspector.data.sources.memory.logger.Logger
import com.infinum.dbinspector.data.sources.memory.pagination.Paginator
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlinx.coroutines.suspendCancellableCoroutine

internal class RawQuerySource(
private val rawQueryPaginator: Paginator,
private val store: Sources.Local.Settings
) : CursorSource(), Sources.Local.RawQuery {
private val store: Sources.Local.Settings,
logger: Logger
) : CursorSource(logger), Sources.Local.RawQuery {

override suspend fun rawQueryHeaders(query: Query): QueryResult =
store.current().let {
Expand Down
Loading

0 comments on commit e0c7c2f

Please sign in to comment.