Skip to content

Commit 78b2ca9

Browse files
author
Gerrit Garbereder
committed
Add SQL TaskCollection
1 parent acd4c67 commit 78b2ca9

File tree

13 files changed

+202
-0
lines changed

13 files changed

+202
-0
lines changed

.github/workflows/build.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ jobs:
5252
./gradlew check &&
5353
./gradlew publishToMavenLocal &&
5454
55+
cd ../Task-Tracker-Usecases-SQLite-Impl &&
56+
ln -s ../gradle &&
57+
ln -s ../gradlew &&
58+
./gradlew check &&
59+
./gradlew publishToMavenLocal &&
60+
5561
cd ../Task-Tracker-CLI &&
5662
ln -s ../gradle &&
5763
ln -s ../gradlew &&
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
plugins {
2+
kotlin("multiplatform") version "1.8.22"
3+
id("maven-publish")
4+
id("app.cash.sqldelight") version "2.0.0-rc01"
5+
}
6+
7+
group = "com.garbereder.tasktracker.usecases.sqlite"
8+
version = "1.0-SNAPSHOT"
9+
10+
repositories {
11+
mavenLocal()
12+
mavenCentral()
13+
}
14+
15+
sqldelight {
16+
databases {
17+
create("Database") {
18+
packageName.set("com.garbereder.tasktracker.usecases.sqlite")
19+
}
20+
}
21+
}
22+
23+
kotlin {
24+
jvm {
25+
jvmToolchain(17)
26+
withJava()
27+
testRuns["test"].executionTask.configure {
28+
useJUnitPlatform()
29+
}
30+
}
31+
val hostOs = System.getProperty("os.name")
32+
val isMingwX64 = hostOs.startsWith("Windows")
33+
val nativeTarget = when {
34+
hostOs == "Mac OS X" -> macosX64("native")
35+
hostOs == "Linux" -> linuxX64("native")
36+
isMingwX64 -> mingwX64("native")
37+
else -> throw GradleException("Host OS is not supported in Kotlin/Native.")
38+
}
39+
40+
41+
sourceSets {
42+
val commonMain by getting {
43+
dependencies {
44+
implementation("com.garbereder.tasktracker.usecases:Task-Tracker-Usecases:1.0-SNAPSHOT")
45+
implementation("com.garbereder.tasktracker.entities:Task-Tracker-Entities:1.0-SNAPSHOT")
46+
implementation("com.garbereder.tasktracker.entities-impl:Task-Tracker-Entities-Impl:1.0-SNAPSHOT")
47+
}
48+
}
49+
val commonTest by getting {
50+
dependencies {
51+
implementation(kotlin("test"))
52+
}
53+
}
54+
val jvmMain by getting{
55+
dependencies {
56+
implementation("app.cash.sqldelight:sqlite-driver:2.0.0-rc01")
57+
}
58+
}
59+
val jvmTest by getting
60+
val nativeMain by getting {
61+
dependencies {
62+
implementation("app.cash.sqldelight:native-driver:2.0.0-rc01")
63+
}
64+
}
65+
val nativeTest by getting
66+
}
67+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
kotlin.code.style=official
2+
kotlin.js.compiler=ir
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
rootProject.name = "Task-Tracker-Usecases-SQLite-Impl"
3+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.garbereder.tasktracker.usecases
2+
3+
import com.garbereder.tasktracker.entities.Task
4+
import com.garbereder.tasktracker.entities.TaskCollection
5+
import com.garbereder.tasktracker.usecases.sqlite.Database
6+
7+
class DBAwareTaskCollection(private val baseCollection: TaskCollection, private val database: Database):
8+
TaskCollection {
9+
override fun add(task: Task) {
10+
database.transaction {
11+
database.tasksQueries.insert(task.id, task.name)
12+
baseCollection.add(task)
13+
}
14+
}
15+
16+
override fun iterator(): Iterator<Task> = baseCollection.iterator()
17+
18+
override fun remove(task: Task) {
19+
database.transaction {
20+
database.tasksQueries.deleteById(task.id)
21+
baseCollection.remove(task)
22+
}
23+
}
24+
override fun size(): Int = baseCollection.size()
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.garbereder.tasktracker.usecases
2+
3+
import com.garbereder.tasktracker.entities.Task
4+
import com.garbereder.tasktracker.entities.TaskCollection
5+
import com.garbereder.tasktracker.entities.TaskCollectionImpl
6+
import com.garbereder.tasktracker.usecases.sqlite.Database
7+
import com.garbereder.tasktracker.usecases.sqlite.DriverFactory
8+
import com.garbereder.tasktracker.usecases.tasks.TaskCollectionReader
9+
10+
class DBTaskCollectionReader internal constructor(private val driverFactory: DriverFactory) : TaskCollectionReader {
11+
override fun read(): TaskCollection {
12+
val database = Database(driverFactory.createDriver())
13+
val tasks = database.tasksQueries.selectAll()
14+
val taskList = tasks.executeAsList()
15+
val collection = TaskCollectionImpl()
16+
taskList.forEach { t -> collection.add(Task(t.task_id, t.name)) }
17+
return DBAwareTaskCollection(collection, database)
18+
}
19+
}
20+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.garbereder.tasktracker.usecases
2+
3+
import com.garbereder.tasktracker.usecases.tasks.TaskCollectionReader
4+
import com.garbereder.tasktracker.usecases.tasks.TaskCollectionReaderFactory
5+
6+
expect class DBTaskCollectionReaderFactory : TaskCollectionReaderFactory {
7+
override fun create(): TaskCollectionReader
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.garbereder.tasktracker.usecases.sqlite
2+
3+
import app.cash.sqldelight.db.SqlDriver
4+
5+
expect class DriverFactory {
6+
fun createDriver(): SqlDriver
7+
}
8+
9+
fun createDatabase(driverFactory: DriverFactory): Database {
10+
val driver = driverFactory.createDriver()
11+
val database = Database(driver)
12+
return database
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
CREATE TABLE IF NOT EXISTS Task (
2+
task_id TEXT NOT NULL,
3+
name TEXT NOT NULL
4+
);
5+
6+
CREATE UNIQUE INDEX IF NOT EXISTS task_id_ix ON Task(task_id);
7+
8+
selectAll:
9+
SELECT *
10+
FROM Task;
11+
12+
insert:
13+
INSERT INTO Task(task_id, name)
14+
VALUES (?, ?);
15+
16+
deleteById:
17+
DELETE FROM Task
18+
WHERE task_id = ?;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.garbereder.tasktracker.usecases
2+
3+
import com.garbereder.tasktracker.usecases.sqlite.DriverFactory
4+
import com.garbereder.tasktracker.usecases.tasks.TaskCollectionReader
5+
import com.garbereder.tasktracker.usecases.tasks.TaskCollectionReaderFactory
6+
7+
actual class DBTaskCollectionReaderFactory : TaskCollectionReaderFactory {
8+
actual override fun create(): TaskCollectionReader = DBTaskCollectionReader(DriverFactory())
9+
}

0 commit comments

Comments
 (0)