Skip to content

Commit ddd3c6b

Browse files
committed
Bug fixing
1 parent fa7b7aa commit ddd3c6b

File tree

15 files changed

+89
-30
lines changed

15 files changed

+89
-30
lines changed

SQLager/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ buildscript {
1313
apply plugin: 'org.jetbrains.kotlin.multiplatform'
1414

1515
repositories {
16+
mavenLocal()
1617
mavenCentral()
1718
maven {
1819
url 'https://oss.sonatype.org/content/repositories/snapshots/'

SQLager/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ GROUP=co.touchlab
2020
VERSION_NAME=0.1.0-SNAPSHOT
2121

2222
STATELY_VERSION=0.3.9-SNAPSHOT
23-
SQLITER_VERSION=0.4.2-SNAPSHOT
23+
SQLITER_VERSION=0.4.3-SNAPSHOT
2424
KOTLIN_VERSION=1.3.10
2525

2626
POM_URL=https://github.com/touchlab/SQLiter

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

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

33
import co.touchlab.sqliter.Statement
4+
import co.touchlab.stately.concurrency.AtomicInt
45

56
class BinderStatement internal constructor(internal val sql:String, internal val statement: Statement):
67
Binder {
78

8-
private var indexCounter = 0
9+
private val indexCounter = AtomicInt(0)
910

1011
override fun bytes(bytes: ByteArray, index: Int, name: String?) {
1112
statement.bindBlob(bindIndex(index, name), bytes)
@@ -54,7 +55,7 @@ class BinderStatement internal constructor(internal val sql:String, internal val
5455
internal fun reset(){
5556
statement.resetStatement()
5657
statement.clearBindings()
57-
indexCounter = 0
58+
indexCounter.value = 0
5859
}
5960

6061
private fun bindIndex(paramIndex:Int, paramName:String?):Int{
@@ -63,7 +64,7 @@ class BinderStatement internal constructor(internal val sql:String, internal val
6364
}
6465

6566
return if(paramIndex == AUTO_INDEX) {
66-
++indexCounter
67+
indexCounter.addAndGet(1)
6768
}else{
6869
paramIndex
6970
}

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package co.touchlab.sqlager.user
22

33
import co.touchlab.sqliter.DatabaseManager
4+
import co.touchlab.stately.collections.AbstractSharedLinkedList
5+
import co.touchlab.stately.collections.SharedLinkedList
46
import co.touchlab.stately.collections.frozenLinkedList
57
import co.touchlab.stately.concurrency.QuickLock
68
import co.touchlab.stately.concurrency.withLock
@@ -11,26 +13,28 @@ class Database(
1113
private val instances: Int = 1
1214
) : Operations {
1315

14-
private val databaseInstances = frozenLinkedList<DatabaseInstance>()
16+
internal val databaseInstances = frozenLinkedList<DatabaseInstance>() as SharedLinkedList<DatabaseInstance>
1517

1618
private val accessLock = QuickLock()
1719
internal inline fun <R> localInstance(block: DatabaseInstance.() -> R): R {
18-
val instance: DatabaseInstance = accessLock.withLock {
20+
val instanceNode: AbstractSharedLinkedList.Node<DatabaseInstance> = accessLock.withLock {
1921
if (databaseInstances.size < instances) {
20-
val inst = DatabaseInstance(databaseManager.createConnection(), cacheSize)
21-
databaseInstances.add(inst)
22-
inst
22+
val connection = databaseManager.createConnection()
23+
val inst = DatabaseInstance(connection, cacheSize)
24+
databaseInstances.addNode(inst)
2325
} else {
24-
val inst = databaseInstances.removeAt(0)
25-
databaseInstances.add(inst)
26-
inst
26+
val inst = databaseInstances.get(0)//databaseInstances.removeAt(0)
27+
val node = databaseInstances.nodeIterator().next()
28+
node.readd()
29+
node
2730
}
2831
}
2932
try {
30-
return instance.block()
33+
return instanceNode.nodeValue.block()
3134
} finally {
3235
accessLock.withLock {
33-
databaseInstances.add(0, instance)
36+
instanceNode.remove()
37+
databaseInstances.add(0, instanceNode.nodeValue)
3438
}
3539
}
3640
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal class DatabaseInstance internal constructor(
1414
private val cacheSize: Int
1515
) : Operations {
1616

17-
private val closed = AtomicBoolean(false)
17+
internal val closed = AtomicBoolean(false)
1818
internal val statementCache = frozenLruCache<String, BinderStatement>(cacheSize) {
1919
it.value.statement.finalizeStatement()
2020
}
@@ -95,7 +95,7 @@ internal class DatabaseInstance internal constructor(
9595
private fun makeStatement(sql: String): BinderStatement = cacheLock.withLock {
9696
if (closed.value)
9797
throw IllegalStateException("Cannot use a closed connection")
98-
statementCache.remove(sql) ?: return@withLock BinderStatement(
98+
statementCache.remove(key = sql, skipCallback = true) ?: return@withLock BinderStatement(
9999
sql,
100100
connection.createStatement(sql)
101101
)
@@ -113,7 +113,10 @@ internal class DatabaseInstance internal constructor(
113113
statement.statement.finalizeStatement()
114114
} else {
115115
statement.reset()
116-
statementCache.put(statement.sql, statement)
116+
val existing = statementCache.put(statement.sql, statement)
117+
if(existing != null)
118+
existing.statement.finalizeStatement()
119+
Unit
117120
}
118121
}
119122
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package co.touchlab.sqlager.user
2+
3+
expect fun printException(e:Throwable)

SQLager/src/commonTest/kotlin/co/touchlab/sqlager/user/BasicTest.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
package co.touchlab.sqlager.user
22

33
import co.touchlab.sqliter.DatabaseConfiguration
4-
import kotlin.test.AfterTest
5-
import kotlin.test.BeforeTest
6-
import kotlin.test.Test
7-
import kotlin.test.assertEquals
4+
import kotlin.test.*
85

96
class BasicTest{
107
lateinit var database: Database
118

129
@BeforeTest
1310
fun setup(){
1411
val man = createDatabaseManager(DatabaseConfiguration(
15-
name = "testdb",
12+
name = makeDbName(),
1613
version = 1,
1714
inMemory = true,
1815
create = {
@@ -26,7 +23,7 @@ class BasicTest{
2623

2724
@AfterTest
2825
fun tearDown(){
29-
database.close()
26+
assertTrue(database.close())
3027
}
3128

3229
@Test

SQLager/src/commonTest/kotlin/co/touchlab/sqlager/user/DatabaseInstanceTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class DatabaseInstanceTest {
99
@BeforeTest
1010
fun setup() {
1111
val man = createDatabaseManager(DatabaseConfiguration(
12-
name = "testdb",
12+
name = makeDbName(),
1313
version = 1,
1414
inMemory = true,
1515
create = {
@@ -23,7 +23,7 @@ class DatabaseInstanceTest {
2323

2424
@AfterTest
2525
fun tearDown() {
26-
database.close()
26+
assertTrue(database.close())
2727
}
2828

2929
@Test
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package co.touchlab.sqlager.user
2+
3+
import co.touchlab.sqliter.DatabaseConfiguration
4+
import kotlin.test.Test
5+
import kotlin.test.assertEquals
6+
import kotlin.test.assertTrue
7+
8+
class DatabaseTest{
9+
@Test
10+
fun testInstances(){
11+
val man = createDatabaseManager(DatabaseConfiguration(
12+
name = makeDbName(),
13+
version = 1,
14+
inMemory = true,
15+
create = {
16+
val instance = wrapDatabaseInstance(it)
17+
instance.execute(TWO_COL)
18+
}
19+
))
20+
21+
val database = Database(databaseManager = man, instances = 3)
22+
23+
for(i in 0 until 10){
24+
database.insert("insert into test(num, str)values(?, ?)"){
25+
long(i.toLong())
26+
string("Val $i")
27+
}
28+
}
29+
30+
assertEquals(3, database.databaseInstances.size)
31+
assertTrue(database.close())
32+
database.databaseInstances.forEach { assertTrue { it.closed.value } }
33+
}
34+
35+
}
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
package co.touchlab.sqlager.user
22

33
val TWO_COL = "CREATE TABLE test (num INTEGER NOT NULL, " +
4-
"str TEXT NOT NULL)"
4+
"str TEXT NOT NULL)"
5+
6+
var dbCount = 0
7+
8+
/**
9+
* If the database doesn't close right we'll screw up the rest of the tests, so we need different
10+
* names
11+
*/
12+
fun makeDbName() = "testdb${dbCount++}"

0 commit comments

Comments
 (0)