Trying to monitor the database for changes using `...
# squarelibraries
o
Trying to monitor the database for changes using
asFlow
but it only emits for the first result. According to the docs, it emits a new value when the expected result changes.
Copy code
fun main() {
    val driver = HikariDataSource().apply {
        jdbcUrl = "jdbc:<postgresql://localhost:5432/postgres>"
        username = name
        password = pass
    }.asJdbcDriver()
    Database.Schema.create(driver)
    val database = Database(driver)
    runBlocking {
        delay(700)
        launch {
            repeat(10) {
                database.exampleQueries.create("CONTENT$it")
                delay(100)
            }
        }
        launch {
            database.exampleQueries.getAll().asFlow().mapToList(<http://Dispatchers.IO|Dispatchers.IO>).collect { messages ->
                println(messages)
            }
        }
    }
}
Copy code
CREATE TABLE IF NOT EXISTS example (
    content TEXT NOT NULL
);

create:
INSERT INTO example(content) VALUES (?);

getAll:
SELECT * FROM example;
I am using Postgres, and I am not sure what I am doing wrong.
Here is a simple implementation that copies the Android…
Copy code
class JdbcDriverNotify(val driver: SqlDriver) : SqlDriver by driver {
    private val listeners = linkedMapOf<String, MutableSet<Query.Listener>>()

    override fun addListener(vararg queryKeys: String, listener: Query.Listener) {
        synchronized(listeners) {
            queryKeys.forEach {
                listeners.getOrPut(it, { linkedSetOf() }).add(listener)
            }
        }
    }

    override fun removeListener(vararg queryKeys: String, listener: Query.Listener) {
        synchronized(listeners) {
            queryKeys.forEach {
                listeners[it]?.remove(listener)
            }
        }
    }

    override fun notifyListeners(vararg queryKeys: String) {
        val listenersToNotify = linkedSetOf<Query.Listener>()
        synchronized(listeners) {
            queryKeys.forEach { listeners[it]?.let(listenersToNotify::addAll) }
        }
        listenersToNotify.forEach(Query.Listener::queryResultsChanged)
    }
}
Copy code
// delegate to original driver
Copy code
val notifyDriver = JdbcDriverNotify(driver)
Database.Schema.create(notifyDriver)
val database = Database(notifyDriver)
o
Thanks, this was very helpful