diff --git a/server/src/db/_init_sql.cpp b/server/src/db/_init_sql.cpp index 7d03c35..1f9f0ba 100644 --- a/server/src/db/_init_sql.cpp +++ b/server/src/db/_init_sql.cpp @@ -9,15 +9,16 @@ const char* _mem_db_sql = "`PORT` INTEGER NOT NULL" ");\n"; -const std::vector _hard_db_sql = { - /** START MIGRATION 0 **/ +const char* _hard_db_init_migration_sql = "CREATE TABLE `MIGRATIONS` (" "`ID` INTEGER NOT NULL," "`SQL_HASH` TEXT NOT NULL," "`DATE_RAN` INTEGER NOT NULL," "PRIMARY KEY(`ID`)" - ") WITHOUT ROWID;\n" + ") WITHOUT ROWID;\n"; +const std::vector _hard_db_sql = { + /** START MIGRATION 0 **/ "CREATE TABLE `SERVER_LICENSES` (" "`KEY_ID` TEXT NOT NULL UNIQUE," "`SECRET` TEXT NOT NULL UNIQUE," diff --git a/server/src/db/database.cpp b/server/src/db/database.cpp index 601ac7f..c1f1ec8 100644 --- a/server/src/db/database.cpp +++ b/server/src/db/database.cpp @@ -17,26 +17,51 @@ bool sosc::db::init_databases(std::string* error) { sqlite3_open("scape.db", &_ctx.hard_db); - int32_t result = db::Query::ScalarInt32( + int32_t migrationsExist = db::Query::ScalarInt32( "SELECT COUNT(*) FROM SQLITE_MASTER WHERE TBL_NAME = 'MIGRATIONS'" ); - if(result == 0) + if(migrationsExist == 0) + db::Query::NonQuery(_hard_db_init_migration_sql); - - result = db::Query::ScalarInt32("SELECT MAX(ID) FROM MIGRATIONS"); - if(result > _hard_db_sql.size()) { + int32_t lastMig = db::Query::ScalarInt32("SELECT MAX(ID) FROM MIGRATIONS"); + if(lastMig > _hard_db_sql.size()) { *error = "HARD DB: RECORDED MIGRATION COUNT TOO HIGH"; return false; } - Query hasMigration("SELECT COUNT(*) FROM MIGRATIONS WHERE ID = ?"), - getMigration("SELECT SQL_HASH FROM MIGRATIONS WHERE ID = ?"); + int id; + Query insertMigration( + "INSERT INTO MIGRATIONS (ID, SQL_HASH, DATE_RAN) " + "VALUES (?, ?, NOW())" + ); + Query getMigration("SELECT SQL_HASH FROM MIGRATIONS WHERE ID = ?"); + for(id = 0; id < _hard_db_sql.size(); ++id) { + getMigration.BindInt32(id, 0); - for(int i = 0; i < _hard_db_sql.size(); ++i) { + std::string hash = getMigration.ScalarText(); + if(hash.empty()) { + if(id < lastMig) { + *error = "HARD DB: MIGRATION RECORDS NOT CONTINUOUS"; + return false; + } + Query::NonQuery(_hard_db_sql[id]); + + insertMigration.BindInt32(id, 0); + insertMigration.BindText(cgc::sha1(_hard_db_sql[id]), 1); + insertMigration.NonQuery(); + } else { + if(hash != cgc::sha1(_hard_db_sql[id])) { + *error = "HARD DB: MIGRATION SQL HASH MISMATCH"; + return false; + } + } + + insertMigration.Reset(); + getMigration.Reset(); } - hasMigration.Close(); + insertMigration.Close(); getMigration.Close(); _ctx.ready = true; diff --git a/server/src/hosts/master.hpp b/server/src/hosts/master.hpp index 3197461..a4a172f 100644 --- a/server/src/hosts/master.hpp +++ b/server/src/hosts/master.hpp @@ -33,7 +33,7 @@ protected: class MasterIntra { public: - MasterIntra(IntraClient client); + MasterIntra(const IntraClient& client); bool Process(); bool Close(); diff --git a/server/src/hosts/master_intra.cpp b/server/src/hosts/master_intra.cpp index 3fa43d2..8e7e3f0 100644 --- a/server/src/hosts/master_intra.cpp +++ b/server/src/hosts/master_intra.cpp @@ -1,6 +1,6 @@ #include "master.hpp" -sosc::MasterIntra::MasterIntra(IntraClient client) { +sosc::MasterIntra::MasterIntra(const IntraClient& client) { this->sock = client; } diff --git a/server/src/hosts/slave.cpp b/server/src/hosts/slave.cpp index 0d07541..82aa144 100644 --- a/server/src/hosts/slave.cpp +++ b/server/src/hosts/slave.cpp @@ -1,6 +1,6 @@ #include "slave.hpp" -sosc::SlaveClient::SlaveClient(ScapeConnection client) { +sosc::SlaveClient::SlaveClient(const ScapeConnection& client) { this->sock = client; } diff --git a/server/src/hosts/slave.hpp b/server/src/hosts/slave.hpp index 7dc5efb..9ec5ee2 100644 --- a/server/src/hosts/slave.hpp +++ b/server/src/hosts/slave.hpp @@ -7,7 +7,7 @@ namespace sosc { class SlaveClient { public: - SlaveClient(ScapeConnection client); + SlaveClient(const ScapeConnection& client); private: ScapeConnection sock; }; diff --git a/server/src/sock/scapesock.cpp b/server/src/sock/scapesock.cpp index 087707a..269c3b7 100644 --- a/server/src/sock/scapesock.cpp +++ b/server/src/sock/scapesock.cpp @@ -48,7 +48,7 @@ int sosc::ScapeConnection::Handshake() { } } - if(websocket_key == "") { + if(websocket_key.empty()) { this->Close(); return SOSC_SHAKE_ERR; } diff --git a/server/src/utils/net.cpp b/server/src/utils/net.cpp index a327dd0..9845582 100644 --- a/server/src/utils/net.cpp +++ b/server/src/utils/net.cpp @@ -53,7 +53,7 @@ bool sosc::net::IpAddress::ParseIPv4Parts std::string part = str::trim(parts[i]); int part_int; - if(part == "") + if(part.empty()) return false; else if(part == "*") { part_int = 0; @@ -77,7 +77,7 @@ bool sosc::net::IpAddress::ParseIPv4Parts int sosc::net::IpAddress::ParseIPv6Part (const std::string& addr_part, bool from_start) { - if(str::trim(addr_part) == "") + if(str::trim(addr_part).empty()) return 0; auto parts = str::split(addr_part, ':');