]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Use different database files
authorElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 13 Feb 2022 16:57:03 +0000 (17:57 +0100)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 13 Feb 2022 16:57:03 +0000 (17:57 +0100)
.gitignore
src/debug_mapgen.sh
src/server/database.c
src/server/database.h
src/server/server.c

index 00abea63c19506f1bacd45f1c7b68fd3395fc03b..ce6db77c320fb8b6757132511178e87588f410cb 100644 (file)
@@ -20,8 +20,8 @@ DragonblocksAlpha
 # Data
 client.conf
 server.conf
-world.sqlite
-world.sqlite-journal
+*.sqlite
+*.sqlite-journal
 screenshot-*.png
 
 # Generated code
index 60865adbe48193f297431d331b82167a228a6eb4..c216dca28e2d9a3e64c16fcfcbbc1c84cdce29e0 100755 (executable)
@@ -1,3 +1,3 @@
 #! /bin/bash
-rm -f world.sqlite
+rm -f map.sqlite
 ./debug.sh
index afac7c8d24ff8f4f68f04008c03c1211c724aa6e..3d9eb92ba689000c7a2c30bbe1a4802dd3d0293d 100644 (file)
 #include "perlin.h"
 #include "util.h"
 
-static sqlite3 *database;
+static sqlite3 *map_database;
+static sqlite3 *meta_database;
+static sqlite3 *players_database;
 
 // utility functions
 
 // prepare a SQLite3 statement
-static inline sqlite3_stmt *prepare_statement(const char *sql)
+static inline sqlite3_stmt *prepare_statement(sqlite3 *database, const char *sql)
 {
        sqlite3_stmt *stmt;
        return sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) == SQLITE_OK ? stmt : NULL;
@@ -24,7 +26,7 @@ static inline sqlite3_stmt *prepare_statement(const char *sql)
 // print SQLite3 error message for failed block SQL statement
 static inline void print_block_error(MapBlock *block, const char *action)
 {
-       fprintf(stderr, "Database error with %s block at (%d, %d, %d): %s\n", action, block->pos.x, block->pos.y, block->pos.z, sqlite3_errmsg(database));
+       fprintf(stderr, "Database error with %s block at (%d, %d, %d): %s\n", action, block->pos.x, block->pos.y, block->pos.z, sqlite3_errmsg(map_database));
 }
 
 // prepare a SQLite3 block statement and bind the position
@@ -32,7 +34,7 @@ static sqlite3_stmt *prepare_block_statement(MapBlock *block, const char *action
 {
        sqlite3_stmt *stmt;
 
-       if (! (stmt = prepare_statement(sql))) {
+       if (! (stmt = prepare_statement(map_database, sql))) {
                print_block_error(block, action);
                return NULL;
        }
@@ -56,27 +58,30 @@ static inline void bind_v3f64(sqlite3_stmt *stmt, int idx, v3f64 pos)
 
 // public functions
 
-// open and initialize world SQLite3 database
-void database_init()
+// open and initialize SQLite3 databases
+bool database_init()
 {
-       char *err;
-
-       if (sqlite3_open_v2("world.sqlite", &database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL) != SQLITE_OK) {
-               fprintf(stderr, "Failed to open database: %s\n", sqlite3_errmsg(database));
-               return;
-       }
-
-       const char *init_stmts[3]= {
-               "CREATE TABLE IF NOT EXISTS map (pos BLOB PRIMARY KEY, generated INTEGER, data BLOB, mgsb BLOB);",
-               "CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value INTEGER);",
-               "CREATE TABLE IF NOT EXISTS players (name TEXT PRIMARY KEY, pos BLOB);"
+       struct {
+               sqlite3 **handle;
+               const char *path;
+               const char *init;
+       } databases[3] = {
+               {&map_database,     "map.sqlite",     "CREATE TABLE IF NOT EXISTS map     (pos  BLOB PRIMARY KEY, generated INTEGER, data BLOB, mgsb BLOB);"},
+               {&meta_database,    "meta.sqlite",    "CREATE TABLE IF NOT EXISTS meta    (key  TEXT PRIMARY KEY, value INTEGER                          );"},
+               {&players_database, "players.sqlite", "CREATE TABLE IF NOT EXISTS players (name TEXT PRIMARY KEY, pos BLOB                               );"},
        };
 
        for (int i = 0; i < 3; i++) {
-               if (sqlite3_exec(database, init_stmts[i], NULL, NULL, &err) != SQLITE_OK) {
-                       fprintf(stderr, "Failed to initialize database: %s\n", err);
+               if (sqlite3_open_v2(databases[i].path, databases[i].handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL) != SQLITE_OK) {
+                       fprintf(stderr, "Failed to open %s: %s\n", databases[i].path, sqlite3_errmsg(*databases[i].handle));
+                       return false;
+               }
+
+               char *err;
+               if (sqlite3_exec(*databases[i].handle, databases[i].init, NULL, NULL, &err) != SQLITE_OK) {
+                       fprintf(stderr, "Failed to initialize %s: %s\n", databases[i].path, err);
                        sqlite3_free(err);
-                       return;
+                       return false;
                }
        }
 
@@ -96,13 +101,18 @@ void database_init()
                set_time_of_day(time_of_day);
        else
                set_time_of_day(12 * MINUTES_PER_HOUR);
+
+       return true;
 }
 
 // close database
 void database_deinit()
 {
        database_save_meta("time_of_day", (s64) get_time_of_day());
-       sqlite3_close(database);
+
+       sqlite3_close(map_database);
+       sqlite3_close(meta_database);
+       sqlite3_close(players_database);
 }
 
 // load a block from map database (initializes state, mgs buffer and data), returns false on failure
@@ -166,8 +176,8 @@ bool database_load_meta(const char *key, s64 *value_ptr)
 {
        sqlite3_stmt *stmt;
 
-       if (! (stmt = prepare_statement("SELECT value FROM meta WHERE key=?"))) {
-               fprintf(stderr, "Database error with loading %s: %s\n", key, sqlite3_errmsg(database));
+       if (! (stmt = prepare_statement(meta_database, "SELECT value FROM meta WHERE key=?"))) {
+               fprintf(stderr, "Database error with loading meta %s: %s\n", key, sqlite3_errmsg(meta_database));
                return false;
        }
 
@@ -179,7 +189,7 @@ bool database_load_meta(const char *key, s64 *value_ptr)
        if (found)
                *value_ptr = sqlite3_column_int64(stmt, 0);
        else if (rc != SQLITE_DONE)
-               fprintf(stderr, "Database error with loading %s: %s\n", key, sqlite3_errmsg(database));
+               fprintf(stderr, "Database error with loading meta %s: %s\n", key, sqlite3_errmsg(meta_database));
 
        sqlite3_finalize(stmt);
        return found;
@@ -190,8 +200,8 @@ void database_save_meta(const char *key, s64 value)
 {
        sqlite3_stmt *stmt;
 
-       if (! (stmt = prepare_statement("REPLACE INTO meta (key, value) VALUES(?1, ?2)"))) {
-               fprintf(stderr, "Database error with saving %s: %s\n", key, sqlite3_errmsg(database));
+       if (! (stmt = prepare_statement(meta_database, "REPLACE INTO meta (key, value) VALUES(?1, ?2)"))) {
+               fprintf(stderr, "Database error with saving meta %s: %s\n", key, sqlite3_errmsg(meta_database));
                return;
        }
 
@@ -199,7 +209,7 @@ void database_save_meta(const char *key, s64 value)
        sqlite3_bind_int64(stmt, 2, value);
 
        if (sqlite3_step(stmt) != SQLITE_DONE)
-               fprintf(stderr, "Database error with saving %s: %s\n", key, sqlite3_errmsg(database));
+               fprintf(stderr, "Database error with saving meta %s: %s\n", key, sqlite3_errmsg(meta_database));
 
        sqlite3_finalize(stmt);
 }
@@ -209,8 +219,8 @@ bool database_load_player(char *name, v3f64 *pos_ptr)
 {
        sqlite3_stmt *stmt;
 
-       if (! (stmt = prepare_statement("SELECT pos FROM players WHERE name=?"))) {
-               fprintf(stderr, "Database error with loading player %s: %s\n", name, sqlite3_errmsg(database));
+       if (! (stmt = prepare_statement(players_database, "SELECT pos FROM players WHERE name=?"))) {
+               fprintf(stderr, "Database error with loading player %s: %s\n", name, sqlite3_errmsg(players_database));
                return false;
        }
 
@@ -222,7 +232,7 @@ bool database_load_player(char *name, v3f64 *pos_ptr)
        if (found)
                v3f64_read(&(Blob) {sqlite3_column_bytes(stmt, 0), (void *) sqlite3_column_blob(stmt, 0)}, pos_ptr);
        else if (rc != SQLITE_DONE)
-               fprintf(stderr, "Database error with loading player %s: %s\n", name, sqlite3_errmsg(database));
+               fprintf(stderr, "Database error with loading player %s: %s\n", name, sqlite3_errmsg(players_database));
 
        sqlite3_finalize(stmt);
        return found;
@@ -233,8 +243,8 @@ void database_create_player(char *name, v3f64 pos)
 {
        sqlite3_stmt *stmt;
 
-       if (! (stmt = prepare_statement("INSERT INTO players (name, pos) VALUES(?1, ?2)"))) {
-               fprintf(stderr, "Database error with creating player %s: %s\n", name, sqlite3_errmsg(database));
+       if (! (stmt = prepare_statement(players_database, "INSERT INTO players (name, pos) VALUES(?1, ?2)"))) {
+               fprintf(stderr, "Database error with creating player %s: %s\n", name, sqlite3_errmsg(players_database));
                return;
        }
 
@@ -242,7 +252,7 @@ void database_create_player(char *name, v3f64 pos)
        bind_v3f64(stmt, 2, pos);
 
        if (sqlite3_step(stmt) != SQLITE_DONE)
-               fprintf(stderr, "Database error with creating player %s: %s\n", name, sqlite3_errmsg(database));
+               fprintf(stderr, "Database error with creating player %s: %s\n", name, sqlite3_errmsg(players_database));
 
        sqlite3_finalize(stmt);
 }
@@ -252,8 +262,8 @@ void database_update_player_pos(char *name, v3f64 pos)
 {
        sqlite3_stmt *stmt;
 
-       if (! (stmt = prepare_statement("UPDATE players SET pos=?1 WHERE name=?2"))) {
-               fprintf(stderr, "Database error with updating player %s position: %s\n", name, sqlite3_errmsg(database));
+       if (! (stmt = prepare_statement(players_database, "UPDATE players SET pos=?1 WHERE name=?2"))) {
+               fprintf(stderr, "Database error with updating position of player %s: %s\n", name, sqlite3_errmsg(players_database));
                return;
        }
 
@@ -261,7 +271,7 @@ void database_update_player_pos(char *name, v3f64 pos)
        sqlite3_bind_text(stmt, 2, name, strlen(name), SQLITE_TRANSIENT);
 
        if (sqlite3_step(stmt) != SQLITE_DONE)
-               fprintf(stderr, "Database error with updating player %s position: %s\n", name, sqlite3_errmsg(database));
+               fprintf(stderr, "Database error with updating player %s position: %s\n", name, sqlite3_errmsg(players_database));
 
        sqlite3_finalize(stmt);
 }
index a2826d2da1aa2cbbdbb8ab96c02cb9ce96c7e0ff..40923b78ffc5feace8256441dba587ae1c4fd83d 100644 (file)
@@ -1,10 +1,11 @@
-#ifndef _MAPDB_H_
-#define _MAPDB_H_
+#ifndef _DATABASE_H_
+#define _DATABASE_H_
 
 #include <stdbool.h>
 #include "map.h"
+#include "types.h"
 
-void database_init();                                     // open and initialize world SQLite3 database
+bool database_init();                                     // open and initialize world SQLite3 database
 void database_deinit();                                   // close database
 bool database_load_block(MapBlock *block);                // load a block from map database (initializes state, mgs buffer and data), returns false on failure
 void database_save_block(MapBlock *block);                // save a block to database
@@ -13,4 +14,5 @@ void database_save_meta(const char *key, s64 value);      // save / update a met
 bool database_load_player(char *name, v3f64 *pos_ptr);    // load player data from database
 void database_create_player(char *name, v3f64 pos);       // insert new player into database
 void database_update_player_pos(char *name, v3f64 pos);   // update player position
+
 #endif
index 22308dea7964a62d134a641cbbde0be3e3ae991f..1a84a521113e453455a8a037050b66c75020f9df 100644 (file)
@@ -70,7 +70,10 @@ int main(int argc, char **argv)
        server->on_recv_type[DRAGONNET_TYPE_ToServerRequestBlock] = (void *) &on_ToServerRequestBlock;
 
        interrupt_init();
-       database_init();
+
+       if (! database_init())
+               return EXIT_FAILURE;
+
        server_map_init();
        server_player_init();