Skip to content

Commit c3c0796

Browse files
committed
Binder updates
1 parent 9831b53 commit c3c0796

File tree

4 files changed

+156
-51
lines changed

4 files changed

+156
-51
lines changed

SQLager/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
kotlin.code.style=official
1818

1919
GROUP=co.touchlab
20-
VERSION_NAME=0.1.0-SNAPSHOT
20+
VERSION_NAME=0.1.1-SNAPSHOT
2121

2222
STATELY_VERSION=0.4.0-SNAPSHOT
2323
SQLITER_VERSION=0.4.3-SNAPSHOT

SQLager/src/commonMain/kotlin/co/touchlab/sqlager/user/Binder.kt

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,55 @@ package co.touchlab.sqlager.user
22

33
interface Binder{
44
fun bytes(
5-
bytes: ByteArray?,
6-
index: Int = AUTO_INDEX,
7-
name: String? = null
5+
index: Int,
6+
bytes: ByteArray?
87
)
98

109
fun double(
11-
double: Double?,
12-
index: Int = AUTO_INDEX,
13-
name: String? = null
10+
index: Int,
11+
double: Double?
1412
)
1513

1614
fun long(
17-
long: Long?,
18-
index: Int = AUTO_INDEX,
19-
name: String? = null
15+
index: Int,
16+
long: Long?
2017
)
2118

2219
fun string(
23-
string: String?,
24-
index: Int = AUTO_INDEX,
25-
name: String? = null
20+
index: Int,
21+
string: String?
2622
)
2723

2824
fun nullArg(
29-
index: Int = AUTO_INDEX,
30-
name: String? = null
25+
index: Int
3126
)
27+
28+
fun bindParameterIndex(name:String):Int
3229
}
3330

34-
fun Binder.int(
35-
int: Int?,
36-
index: Int = AUTO_INDEX,
37-
name: String? = null
38-
){
39-
long(int?.toLong(), index, name)
31+
fun Binder.bytes(bytes: ByteArray?) = bytes(AUTO_INDEX, bytes)
32+
fun Binder.double(double: Double?) = double(AUTO_INDEX, double)
33+
fun Binder.long(long: Long?) = long(AUTO_INDEX, long)
34+
fun Binder.string(string: String?) = string(AUTO_INDEX, string)
35+
fun Binder.nullArg() = nullArg(AUTO_INDEX)
36+
fun Binder.bytes(name:String, bytes: ByteArray?) = bytes(bindParameterIndex(name), bytes)
37+
fun Binder.double(name:String, double: Double?) = double(bindParameterIndex(name), double)
38+
fun Binder.long(name:String, long: Long?) = long(bindParameterIndex(name), long)
39+
fun Binder.string(name:String, string: String?) = string(bindParameterIndex(name), string)
40+
fun Binder.nullArg(name:String) = nullArg(bindParameterIndex(name))
41+
42+
fun Binder.int(index: Int,int: Int?){
43+
long(index, int?.toLong())
4044
}
4145

42-
fun Binder.float(
43-
float: Float?,
44-
index: Int = AUTO_INDEX,
45-
name: String? = null
46-
){
47-
double(float?.toDouble(), index, name)
46+
fun Binder.int(int: Int?) = int(AUTO_INDEX, int)
47+
fun Binder.int(name:String, int: Int?) = int(bindParameterIndex(name), int)
48+
49+
fun Binder.float(index: Int, float: Float?){
50+
double(index, float?.toDouble())
4851
}
4952

53+
fun Binder.float(float: Float?) = double(AUTO_INDEX, float?.toDouble())
54+
fun Binder.float(name:String, float: Float?) = double(bindParameterIndex(name), float?.toDouble())
55+
5056
internal val AUTO_INDEX = -1

SQLager/src/commonMain/kotlin/co/touchlab/sqlager/user/BinderStatement.kt

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
11
package co.touchlab.sqlager.user
22

33
import co.touchlab.sqliter.*
4+
import co.touchlab.stately.concurrency.AtomicBoolean
45
import co.touchlab.stately.concurrency.AtomicInt
56

67
class BinderStatement internal constructor(internal val sql:String, internal val statement: Statement):
78
Binder {
9+
override fun bytes(index: Int, bytes: ByteArray?) {
10+
statement.bindBlob(bindIndex(index), bytes)
11+
}
812

9-
private val indexCounter = AtomicInt(0)
10-
11-
override fun bytes(bytes: ByteArray?, index: Int, name: String?) {
12-
statement.bindBlob(bindIndex(index, name), bytes)
13+
override fun double(index: Int, double: Double?) {
14+
statement.bindDouble(bindIndex(index), double)
1315
}
1416

15-
override fun double(double: Double?, index: Int, name: String?) {
16-
statement.bindDouble(bindIndex(index, name), double)
17+
override fun long(index: Int, long: Long?) {
18+
statement.bindLong(bindIndex(index), long)
1719
}
1820

19-
override fun long(long: Long?, index: Int, name: String?) {
20-
statement.bindLong(bindIndex(index, name), long)
21+
override fun string(index: Int, string: String?) {
22+
statement.bindString(bindIndex(index), string)
2123
}
2224

23-
override fun string(string: String?, index: Int, name: String?) {
24-
statement.bindString(bindIndex(index, name), string)
25+
override fun nullArg(index: Int) {
26+
statement.bindNull(bindIndex(index))
2527
}
2628

27-
override fun nullArg(index: Int, name: String?) {
28-
statement.bindNull(bindIndex(index, name))
29+
override fun bindParameterIndex(name: String): Int {
30+
return statement.bindParameterIndex(name)
2931
}
3032

33+
private val indexCounter = AtomicInt(0)
34+
private val indexedCount = AtomicBoolean(false)
35+
3136
fun execute() {
3237
try {
3338
statement.execute()
@@ -56,16 +61,16 @@ class BinderStatement internal constructor(internal val sql:String, internal val
5661
statement.resetStatement()
5762
statement.clearBindings()
5863
indexCounter.value = 0
64+
indexedCount.value = false
5965
}
6066

61-
private fun bindIndex(paramIndex:Int, paramName:String?):Int{
62-
if(paramName != null){
63-
return statement.bindParameterIndex(paramName)
64-
}
65-
67+
private fun bindIndex(paramIndex:Int):Int{
6668
return if(paramIndex == AUTO_INDEX) {
69+
if(indexedCount.value)
70+
throw IllegalArgumentException("Cannot mix indexed and auto binding")
6771
indexCounter.addAndGet(1)
6872
}else{
73+
indexedCount.value = true
6974
paramIndex
7075
}
7176
}
Lines changed: 101 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,116 @@
11
package co.touchlab.sqlager.user
22

33
import kotlin.test.Test
4+
import kotlin.test.assertFails
45

56
class BinderTest{
67
@Test
78
fun namedBindings(){
8-
testDatabase(createSql = "CREATE TABLE test (" +
9-
"ival INTEGER NOT NULL, " +
10-
"dval REAL NOT NULL, " +
11-
"bval BLOB, " +
12-
"sval TEXT NOT NULL)") {database ->
9+
testBindingsDb { database ->
1310
database.insert("insert into test(ival, dval, bval, sval)" +
1411
"values(:ibind, :dbind, :bbind, :sbind)"){
15-
long(123L, name = ":lbind")
12+
long(":ibind", 123L)
13+
double(":dbind", 2.0)
14+
bytes(":bbind", null)
15+
string(":sbind", "two")
16+
}
17+
}
18+
}
19+
20+
@Test
21+
fun namedBindingsFail(){
22+
testBindingsDb { database ->
23+
assertFails {
24+
database.insert(
25+
"insert into test(ival, dval, bval, sval)" +
26+
"values(:ibind, :dbind, :bbind, :sbind)"
27+
) {
28+
long(":hibind", 123L)
29+
}
30+
}
31+
}
32+
}
33+
34+
@Test
35+
fun numericIndex(){
36+
testBindingsDb { database ->
37+
database.insert("insert into test(ival, dval, bval, sval)" +
38+
"values(?, ?, ?, ?)"){
39+
long(1, 123L)
40+
double(2, 2.0)
41+
bytes(3, null)
42+
string(4, "two")
43+
}
44+
}
45+
}
46+
47+
@Test
48+
fun numericIndexFail(){
49+
testBindingsDb { database ->
50+
assertFails {
51+
database.insert(
52+
"insert into test(ival, dval, bval, sval)" +
53+
"values(?, ?, ?, ?)"
54+
) {
55+
long(0, 123L)
56+
}
57+
}
58+
}
59+
}
60+
61+
@Test
62+
fun noIndex(){
63+
testBindingsDb { database ->
64+
database.insert("insert into test(ival, dval, bval, sval)" +
65+
"values(?, ?, ?, ?)"){
66+
long(123L)
1667
double(2.0)
17-
// bytes(it)
68+
bytes(null)
1869
string("two")
1970
}
2071
}
2172
}
73+
74+
@Test
75+
fun noIndexTooMany(){
76+
testBindingsDb { database ->
77+
assertFails {
78+
database.insert(
79+
"insert into test(ival, dval, bval, sval)" +
80+
"values(?, ?, ?, ?)"
81+
) {
82+
long(123L)
83+
double(2.0)
84+
bytes(null)
85+
string("two")
86+
string("two")
87+
}
88+
}
89+
}
90+
}
91+
92+
@Test
93+
fun mixIndexAndAutoFails(){
94+
testBindingsDb { database ->
95+
assertFails {
96+
database.insert(
97+
"insert into test(ival, dval, bval, sval)" +
98+
"values(?, ?, ?, ?)"
99+
) {
100+
long(1, 123L)
101+
double(2.0)
102+
}
103+
}
104+
}
105+
}
106+
107+
private fun testBindingsDb(block:(Database)->Unit){
108+
testDatabase(createSql = "CREATE TABLE test (" +
109+
"ival INTEGER NOT NULL, " +
110+
"dval REAL NOT NULL, " +
111+
"bval BLOB, " +
112+
"sval TEXT NOT NULL)") {database ->
113+
block(database)
114+
}
115+
}
22116
}

0 commit comments

Comments
 (0)