// DescriptionHere - gameDB.cpp
// Created by John Ryland (jryland@xiaofrog.com), 02/11/2017
// Copyright (c) 2017 InvertedLogic
// All rights reserved.
#include <sqlite3.h>
#include "gameDB.h"
static int patternsCallback(void* user, int argc, char **argv, char **azColName)
{
char* end;
if (!user || argc != 5 || strcmp(azColName[0],"id") != 0)
return -1;
GameDB* gameDB = (GameDB*)user;
Pattern pattern;
pattern.m_id = atoi(argv[0]);
pattern.m_tiles = atoi(argv[1]);
pattern.m_score = atoi(argv[2]);
pattern.m_offsets = strtoull(argv[3], &end, 10);
pattern.m_lengths = strtoull(argv[4], &end, 10);
gameDB->m_patterns.push_back(pattern);
return 0;
}
static int assetCallback(void* user, int argc, char **argv, char **azColName)
{
if (!user || argc != 2 || strcmp(azColName[0],"id") != 0)
return -1;
GameDB* gameDB = (GameDB*)user;
Asset asset;
asset.m_id = atoi(argv[0]);
asset.m_name = argv[1];
gameDB->m_assets.push_back(asset);
return 0;
}
/*
static int tileTypeCallback(void* user, int argc, char **argv, char **azColName)
{
if (!user || argc != 3 || strcmp(azColName[0],"id") != 0)
return -1;
GameDB* gameDB = (GameDB*)user;
TileType tileType;
tileType.m_id = atoi(argv[0]);
//tileType.m_flags = atoi(argv[1]);
tileType.m_assetId = atoi(argv[2]);
gameDB->m_tileTypes.push_back(tileType);
return 0;
}
*/
class SqlDB
{
public:
SqlDB(const char* a_fileName)
{
okay = sqlite3_open(a_fileName, &db) == SQLITE_OK;
if (!okay)
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
}
~SqlDB()
{
sqlite3_close(db);
}
bool execute(const char* query, int (*callback)(void*,int,char**,char**), void* user)
{
char *zErrMsg = 0;
int rc = sqlite3_exec(db, query, callback, user, &zErrMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
return false;
}
return true;
}
operator bool() { return okay; }
private:
sqlite3 *db;
bool okay;
#if 0
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
void sqlite3_free_table(char **result);
#endif
};
bool loadGameDB(GameDB& a_gameDB)//, const char* a_fileName)
{
// TODO: build shouldn't be in the path here
SqlDB db("build/gameDB.db");
if (!db)
return false;
if (!db.execute("select * from patterns", patternsCallback, (void*)&a_gameDB))
return false;
if (!db.execute("select * from assets", assetCallback, (void*)&a_gameDB))
return false;
//if (!db.execute("select * from sprites", tileTypeCallback, (void*)&a_gameDB))
//if (!db.execute("select * from tiletypes", tileTypeCallback, (void*)&a_gameDB))
//return false;
return true;
}