2019-05-06 19:03:28 +02:00
|
|
|
package com.topjohnwu.magisk.data.database.base
|
|
|
|
|
|
|
|
import androidx.annotation.StringDef
|
|
|
|
import com.topjohnwu.magisk.data.database.base.Order.Companion.ASC
|
|
|
|
import com.topjohnwu.magisk.data.database.base.Order.Companion.DESC
|
|
|
|
|
|
|
|
interface MagiskQueryBuilder {
|
|
|
|
|
|
|
|
val requestType: String
|
|
|
|
var table: String
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
inline operator fun <reified Builder : MagiskQueryBuilder> invoke(builder: Builder.() -> Unit): MagiskQuery =
|
|
|
|
Builder::class.java.newInstance()
|
|
|
|
.apply(builder)
|
|
|
|
.toString()
|
2019-05-23 19:17:41 +02:00
|
|
|
.let {
|
|
|
|
MagiskQuery(it)
|
|
|
|
}
|
2019-05-06 19:03:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
class Delete : MagiskQueryBuilder {
|
|
|
|
override val requestType: String = "DELETE FROM"
|
|
|
|
override var table = ""
|
|
|
|
|
|
|
|
private var condition = ""
|
|
|
|
|
|
|
|
fun condition(builder: Condition.() -> Unit) {
|
|
|
|
condition = Condition().apply(builder).toString()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun toString(): String {
|
2019-06-06 09:39:24 +02:00
|
|
|
return listOf(requestType, table, condition).joinToString(" ")
|
2019-05-06 19:03:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class Select : MagiskQueryBuilder {
|
|
|
|
override val requestType: String get() = "SELECT $fields FROM"
|
|
|
|
override lateinit var table: String
|
|
|
|
|
|
|
|
private var fields = "*"
|
|
|
|
private var condition = ""
|
|
|
|
private var orderField = ""
|
|
|
|
|
|
|
|
fun fields(vararg newFields: String) {
|
|
|
|
if (newFields.isEmpty()) {
|
|
|
|
fields = "*"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fields = newFields.joinToString(", ")
|
|
|
|
}
|
|
|
|
|
|
|
|
fun condition(builder: Condition.() -> Unit) {
|
|
|
|
condition = Condition().apply(builder).toString()
|
|
|
|
}
|
|
|
|
|
|
|
|
fun orderBy(field: String, @OrderStrict order: String) {
|
|
|
|
orderField = "ORDER BY $field $order"
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun toString(): String {
|
2019-06-06 09:39:24 +02:00
|
|
|
return listOf(requestType, table, condition, orderField).joinToString(" ")
|
2019-05-06 19:03:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class Replace : Insert() {
|
|
|
|
override val requestType: String = "REPLACE INTO"
|
|
|
|
}
|
|
|
|
|
|
|
|
open class Insert : MagiskQueryBuilder {
|
|
|
|
override val requestType: String = "INSERT INTO"
|
|
|
|
override lateinit var table: String
|
|
|
|
|
|
|
|
private val keys get() = _values.keys.joinToString(",")
|
2019-06-06 09:39:24 +02:00
|
|
|
private val values get() = _values.values.joinToString(",") {
|
|
|
|
if (it is String) "\"$it\"" else it.toString()
|
|
|
|
}
|
|
|
|
private var _values: Map<String, Any> = mapOf()
|
2019-05-06 19:03:28 +02:00
|
|
|
|
2019-06-06 09:39:24 +02:00
|
|
|
fun values(vararg pairs: Pair<String, Any>) {
|
2019-05-06 19:03:28 +02:00
|
|
|
_values = pairs.toMap()
|
|
|
|
}
|
|
|
|
|
2019-06-06 09:39:24 +02:00
|
|
|
fun values(values: Map<String, Any>) {
|
2019-05-06 19:03:28 +02:00
|
|
|
_values = values
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun toString(): String {
|
2019-06-06 09:39:24 +02:00
|
|
|
return listOf(requestType, table, "($keys) VALUES($values)").joinToString(" ")
|
2019-05-06 19:03:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class Condition {
|
|
|
|
|
|
|
|
private val conditionWord = "WHERE %s"
|
|
|
|
private var condition: String = ""
|
|
|
|
|
2019-05-12 18:34:28 +02:00
|
|
|
fun equals(field: String, value: Any) {
|
|
|
|
condition = when (value) {
|
|
|
|
is String -> "$field=\"$value\""
|
|
|
|
else -> "$field=$value"
|
|
|
|
}
|
2019-05-06 19:03:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
fun greaterThan(field: String, value: String) {
|
|
|
|
condition = "$field > $value"
|
|
|
|
}
|
|
|
|
|
|
|
|
fun lessThan(field: String, value: String) {
|
|
|
|
condition = "$field < $value"
|
|
|
|
}
|
|
|
|
|
|
|
|
fun greaterOrEqualTo(field: String, value: String) {
|
|
|
|
condition = "$field >= $value"
|
|
|
|
}
|
|
|
|
|
|
|
|
fun lessOrEqualTo(field: String, value: String) {
|
|
|
|
condition = "$field <= $value"
|
|
|
|
}
|
|
|
|
|
|
|
|
fun and(builder: Condition.() -> Unit) {
|
2019-05-23 19:17:41 +02:00
|
|
|
condition = "($condition AND ${Condition().apply(builder).condition})"
|
2019-05-06 19:03:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
fun or(builder: Condition.() -> Unit) {
|
2019-05-23 19:17:41 +02:00
|
|
|
condition = "($condition OR ${Condition().apply(builder).condition})"
|
2019-05-06 19:03:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun toString(): String {
|
|
|
|
return conditionWord.format(condition)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class Order {
|
|
|
|
|
|
|
|
@set:OrderStrict
|
|
|
|
var order = DESC
|
|
|
|
var field = ""
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
const val ASC = "ASC"
|
|
|
|
const val DESC = "DESC"
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@StringDef(ASC, DESC)
|
|
|
|
@Retention(AnnotationRetention.SOURCE)
|
|
|
|
annotation class OrderStrict
|