diff --git a/modules/database/database_connection.cpp b/modules/database/database_connection.cpp index d81cc6283..81a5250d9 100644 --- a/modules/database/database_connection.cpp +++ b/modules/database/database_connection.cpp @@ -73,16 +73,11 @@ Ref DatabaseConnection::get_owner() { int DatabaseConnection::get_table_version(const String &table) { ensure_version_table_exists(); - //get_query_builder() - //TODO - return 0; } void DatabaseConnection::set_table_version(const String &table, const int version) { - //TODO } void DatabaseConnection::ensure_version_table_exists() { - //TODO } void DatabaseConnection::set_owner(Database *owner) { diff --git a/modules/database_sqlite/sqlite3_connection.cpp b/modules/database_sqlite/sqlite3_connection.cpp index c243ea4fc..7625b9e8a 100644 --- a/modules/database_sqlite/sqlite3_connection.cpp +++ b/modules/database_sqlite/sqlite3_connection.cpp @@ -106,6 +106,98 @@ void SQLite3DatabaseConnection::escape_to(const String &str, String *to) { } } +int SQLite3DatabaseConnection::get_table_version(const String &table) { + ensure_version_table_exists(); + + Ref qb = get_query_builder(); + + qb->select("version"); + qb->from("table_versions"); + qb->where(); + qb->wps("table_name", table); + qb->end_command(); + Ref res = qb->run(); + + if (!res->next_row()) { + return 0; + } + + return res->get_next_cell_int(); +} +void SQLite3DatabaseConnection::set_table_version(const String &table, const int version) { + ensure_version_table_exists(); + + Ref qb = get_query_builder(); + + qb->select("id"); + qb->from("table_versions"); + qb->where(); + qb->wps("table_name", table); + qb->end_command(); + Ref res = qb->run(); + + qb->reset(); + + if (!res->next_row()) { + if (version == -1) { + return; + } + + qb->insert("table_versions", "table_name,version"); + qb->values(); + qb->vals(table); + qb->vali(version); + qb->cvalues(); + qb->end_command(); + qb->run_query(); + } else { + int id = res->get_next_cell_int(); + + if (version != -1) { + qb->update("table_versions"); + qb->sets(); + qb->setpi("version", version); + qb->cset(); + qb->where()->wpi("id", id); + qb->run_query(); + } else { + qb->del("table_versions"); + qb->where()->wpi("id", id); + qb->run_query(); + } + } +} +void SQLite3DatabaseConnection::ensure_version_table_exists() { + // https://www.sqlite.org/fileformat2.html#storage_of_the_sql_database_schema + Ref qb = get_query_builder(); + + qb->select("count(*)"); + qb->from("sqlite_master"); + qb->where(); + qb->wps("type", "table"); + qb->land(); + qb->wps("name", "table_versions"); + qb->end_command(); + Ref res = qb->run(); + + ERR_FAIL_COND(!res->next_row()); + + int c = res->get_next_cell_int(); + + if (c == 0) { + Ref tb = get_table_builder(); + + tb->create_table("table_versions"); + tb->integer("id")->auto_increment()->next_row(); + tb->varchar("table_name", 256)->not_null()->next_row(); + tb->integer("version")->next_row(); + tb->primary_key("id"); + tb->ccreate_table(); + tb->run_query(); + // tb->print(); + } +} + SQLite3DatabaseConnection::SQLite3DatabaseConnection() { conn = nullptr; } diff --git a/modules/database_sqlite/sqlite3_connection.h b/modules/database_sqlite/sqlite3_connection.h index dd5904d90..73ef5e1ff 100644 --- a/modules/database_sqlite/sqlite3_connection.h +++ b/modules/database_sqlite/sqlite3_connection.h @@ -15,16 +15,20 @@ class SQLite3DatabaseConnection : public DatabaseConnection { public: friend class SQLite3PreparedStatement; - Error database_connect(const String &connection_str); - Ref query(const String &query); - void query_run(const String &query); + virtual Error database_connect(const String &connection_str); + virtual Ref query(const String &query); + virtual void query_run(const String &query); - Ref get_query_builder(); - Ref get_table_builder(); - Ref create_prepared_statement(); + virtual Ref get_query_builder(); + virtual Ref get_table_builder(); + virtual Ref create_prepared_statement(); - String escape(const String &str); - void escape_to(const String &str, String *to); + virtual String escape(const String &str); + virtual void escape_to(const String &str, String *to); + + virtual int get_table_version(const String &table); + virtual void set_table_version(const String &table, const int version); + virtual void ensure_version_table_exists(); SQLite3DatabaseConnection(); ~SQLite3DatabaseConnection();