]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Simplify database handling
authorElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 24 Aug 2021 14:43:57 +0000 (16:43 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 24 Aug 2021 14:43:57 +0000 (16:43 +0200)
src/server/database.c
src/server/database.h
src/server/mapgen.c
src/server/server.c
src/server/server.h
src/server/server_map.c
src/server/server_map.h

index 2b5b457da4f9bca68944e01c1eed49578aa9e1e8..6bd3e7b750bbbd639983ebc6ea4beded82faad34 100644 (file)
@@ -2,26 +2,28 @@
 #include <endian.h>
 #include <stdlib.h>
 #include <string.h>
-#include <assert.h>
+#include <sqlite3.h>
 #include "server/database.h"
 #include "server/server_map.h"
 #include "util.h"
 
+static sqlite3 *database;
+
 // utility functions
 
 // print SQLite3 error message for failed block SQL statement
-static void print_error(sqlite3 *db, MapBlock *block, const char *action)
+static void print_block_error(MapBlock *block, const char *action)
 {
-       printf("Database error with %s block at (%d, %d, %d): %s\n", action, block->pos.x, block->pos.y, block->pos.z, sqlite3_errmsg(db));
+       printf("Database error with %s block at (%d, %d, %d): %s\n", action, block->pos.x, block->pos.y, block->pos.z, sqlite3_errmsg(database));
 }
 
 // prepare a SQLite3 block statement and bind the position
-static sqlite3_stmt *prepare_statement(sqlite3 *db, MapBlock *block, const char *action, const char *sql)
+static sqlite3_stmt *prepare_block_statement(MapBlock *block, const char *action, const char *sql)
 {
        sqlite3_stmt *stmt;
 
-       if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) {
-               print_error(db, block, action);
+       if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) != SQLITE_OK) {
+               print_block_error(block, action);
                return NULL;
        }
 
@@ -38,28 +40,31 @@ static sqlite3_stmt *prepare_statement(sqlite3 *db, MapBlock *block, const char
 
 // public functions
 
-// open and initialize SQLite3 database at path
-sqlite3 *database_open(const char *path)
+// open and initialize world SQLite3 database
+void database_init()
 {
-       sqlite3 *db;
        char *err;
 
-       if (sqlite3_open_v2(path, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL) != SQLITE_OK) {
-               printf("Failed to open database: %s\n", sqlite3_errmsg(db));
-       } else if (sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS map (pos BLOB PRIMARY KEY, generated INT, size INT, data BLOB, mgsb_size INT, mgsb_data BLOB);", NULL, NULL, &err) != SQLITE_OK) {
+       if (sqlite3_open_v2("world.sqlite", &database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL) != SQLITE_OK) {
+               printf("Failed to open database: %s\n", sqlite3_errmsg(database));
+       } else if (sqlite3_exec(database, "CREATE TABLE IF NOT EXISTS map (pos BLOB PRIMARY KEY, generated INT, size INT, data BLOB, mgsb_size INT, mgsb_data BLOB);", NULL, NULL, &err) != SQLITE_OK) {
                printf("Failed to initialize database: %s\n", err);
                sqlite3_free(err);
        }
+}
 
-       return db;
+// close database
+void database_deinit()
+{
+       sqlite3_close(database);
 }
 
 // load a block from map database (initializes state, mgs buffer and data), returns false on failure
-bool database_load_block(sqlite3 *db, MapBlock *block)
+bool database_load_block(MapBlock *block)
 {
        sqlite3_stmt *stmt;
 
-       if (! (stmt = prepare_statement(db, block, "loading", "SELECT generated, size, data, mgsb_size, mgsb_data FROM map WHERE pos=?")))
+       if (! (stmt = prepare_block_statement(block, "loading", "SELECT generated, size, data, mgsb_size, mgsb_data FROM map WHERE pos=?")))
                return false;
 
        int rc = sqlite3_step(stmt);
@@ -81,7 +86,7 @@ bool database_load_block(sqlite3 *db, MapBlock *block)
                if (! map_deserialize_block(block, extra->data, extra->size))
                        printf("Error with deserializing block at (%d, %d, %d)\n", block->pos.x, block->pos.y, block->pos.z);
        } else if (rc != SQLITE_DONE) {
-               print_error(db, block, "loading");
+               print_block_error(block, "loading");
        }
 
        sqlite3_finalize(stmt);
@@ -89,11 +94,11 @@ bool database_load_block(sqlite3 *db, MapBlock *block)
 }
 
 // save a block to database
-void database_save_block(sqlite3 *db, MapBlock *block)
+void database_save_block(MapBlock *block)
 {
        sqlite3_stmt *stmt;
 
-       if (! (stmt = prepare_statement(db, block, "saving", "REPLACE INTO map (pos, generated, size, data, mgsb_size, mgsb_data) VALUES(?1, ?2, ?3, ?4, ?5, ?6)")))
+       if (! (stmt = prepare_block_statement(block, "saving", "REPLACE INTO map (pos, generated, size, data, mgsb_size, mgsb_data) VALUES(?1, ?2, ?3, ?4, ?5, ?6)")))
                return;
 
        MapBlockExtraData *extra = block->extra;
@@ -113,7 +118,7 @@ void database_save_block(sqlite3 *db, MapBlock *block)
        sqlite3_bind_blob(stmt, 6, mgsb_data, mgsb_size, &free);
 
        if (sqlite3_step(stmt) != SQLITE_DONE)
-               print_error(db, block, "saving");
+               print_block_error(block, "saving");
 
        sqlite3_finalize(stmt);
 }
index f401f2e89ee87250b7e79443ef91b2010abd2af0..56ddfd0a4ed9acf1221a8889e0119d7e3a6c21cb 100644 (file)
@@ -1,12 +1,12 @@
 #ifndef _MAPDB_H_
 #define _MAPDB_H_
 
-#include <sqlite3.h>
 #include <stdbool.h>
 #include "map.h"
 
-sqlite3 *database_open(const char *path);                              // open and initialize SQLite3 database at path
-bool database_load_block(sqlite3 *db, MapBlock *block);        // load a block from map database (initializes state, mgs buffer and data), returns false on failure
-void database_save_block(sqlite3 *db, MapBlock *block);        // save a block to database
+void 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
 
 #endif
index b596ffd113fe85721b3ae2b97f25e143779183e6..9f51fa9b35dd7508fdab12c2d85e6ae2e48cfbc9 100644 (file)
@@ -1,4 +1,3 @@
-#include <stdio.h>
 #include <math.h>
 #include <stdlib.h>
 #include "environment.h"
@@ -20,8 +19,6 @@ void mapgen_set_node(v3s32 pos, MapNode node, MapgenStage mgs, List *changed_blo
 // generate a block (does not manage block state or threading)
 void mapgen_generate_block(MapBlock *block, List *changed_blocks)
 {
-       printf("Generating block at (%d, %d, %d)\n", block->pos.x, block->pos.y, block->pos.z);
-
        MapBlockExtraData *extra = block->extra;
 
        v3s32 block_node_pos = {block->pos.x * MAPBLOCK_SIZE, block->pos.y * MAPBLOCK_SIZE, block->pos.z * MAPBLOCK_SIZE};
index c5c8838dd01d0cb1ff87ea23d0a063cc293ffef0..90f67f9769eef6a347329fe1116d91d827518566 100644 (file)
@@ -3,6 +3,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <netdb.h>
+#include "server/database.h"
 #include "server/server.h"
 #include "server/server_map.h"
 #include "signal_handlers.h"
@@ -75,7 +76,7 @@ static void server_run(int fd)
        pthread_rwlock_init(&server.players_rwlck, NULL);
        server.players = list_create(&list_compare_string);
 
-       server.db = database_open("world.sqlite");
+       database_init();
        server_map_init(&server);
 
        while (! interrupted)
@@ -98,8 +99,7 @@ static void server_run(int fd)
        close(server.sockfd);
 
        server_map_deinit();
-
-       sqlite3_close(server.db);
+       database_deinit();
 
        exit(EXIT_SUCCESS);
 }
index f53289221a8b6bf6145d343a3205a5c9800cbb81..639190a0429260a9f5b219bfeafcbb09773a873c 100644 (file)
@@ -6,7 +6,6 @@
 #include <dragontype/number.h>
 #include <dragontype/list.h>
 #include "client/client_commands.h"
-#include "server/database.h"
 #include "server/server_commands.h"
 #include "network.h"
 
@@ -17,7 +16,6 @@ typedef struct
        List clients;                                   // Client * -> NULL map with all connected clients
        pthread_rwlock_t players_rwlck; // lock to protect player list
        List players;                                   // char * -> Client * map with clients that have finished auth
-       sqlite3 *db;
        struct {
                u32 simulation_distance;        // perimeter of the cube that players can see blocks in is simulation_distance * 2 + 1
        } config;                                               // configuration, ToDo: read from config file
index a337b6ea04f26e4099b427def401cf9608d5e9f8..bf2d262cb2ba88aaa0d7ff2fb70174898f0aa553 100644 (file)
@@ -34,7 +34,7 @@ static void send_block_to_near(MapBlock *block)
                return;
 
        map_serialize_block(block, &extra->data, &extra->size);
-       database_save_block(server->db, block);
+       database_save_block(block);
 
        if (extra->state == MBS_CREATED)
                return;
@@ -115,7 +115,7 @@ static void on_create_block(MapBlock *block)
 {
        MapBlockExtraData *extra = block->extra = malloc(sizeof(MapBlockExtraData));
 
-       if (! database_load_block(server->db, block)) {
+       if (! database_load_block(block)) {
                extra->state = MBS_CREATED;
                extra->data = NULL;
 
index f65b789e8d71403e6131f2c5f73b2b814d9d7946..d7a1905de761fe8401ca76aebd8377997a136e2f 100644 (file)
@@ -40,7 +40,6 @@ typedef struct
 
 extern struct ServerMap {
        Map *map;                                                               // map object, data is stored here
-       sqlite3 *db;                                                    // SQLite3 database to save data to database
        bool shutting_down;                                             // is a shutdown in progress?
        List mapgen_threads;                                    // a list of mapgen threads (need to be joined before shutdown)
        pthread_mutex_t mapgen_threads_mtx;             // mutex to protect mapgen thread list