#include #include #include #include #include #include "sqlite3.h" PLUGINLINK *pluginLink; sqlite3* db; char* db_err = 0; SERVICE dbWriteSetting(WPARAM w, LPARAM l); SERVICE dbGetSetting(WPARAM w, LPARAM l); SERVICE dbDeleteSetting(WPARAM w, LPARAM l); HINSTANCE hInst; BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { hInst = hinstDLL; return TRUE; } PLUGININFO pluginInfo = { sizeof(PLUGININFO), (char*)"SQLite database support plugin", (char*)"Support for data storage in local sql database through libsqlite", (char*)"sss", (char*)"sss123next@list.ru", PLUGIN_MAKE_VERSION(0,0,0,1), F_DB_PLUGIN }; extern "C" __declspec(dllexport) PLUGININFO* SetPluginInfo() { return &pluginInfo; } extern "C" int __declspec(dllexport) Load(PLUGINLINK *link) { pluginLink = link; CreateServiceFunction("Db/WriteSetting", (SERVICE)dbWriteSetting); CreateServiceFunction("Db/GetSetting", (SERVICE)dbGetSetting); CreateServiceFunction("Db/DeleteSetting", (SERVICE)dbDeleteSetting); if(!sqlite3_open_v2(".\\database.sql3", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) MessageBoxA(0, "dbsqlite plugin loaded", "INFO", MB_OK); return 0; } extern "C" int __declspec(dllexport) OnModulesLoaded() { sqlite3_exec(db, "CREATE TABLE 'data' (id INTEGER PRYMARY KEY, module TEXT, setting TEXT, string TEXT, number INT, binary BLOB);", 0, 0, &db_err); sqlite3_exec(db, "CREATE GENERATOR generator_;", 0, 0, &db_err); sqlite3_exec(db, "CREATE TRIGGER index_updater FOR data BEFORE INSERT POSITION 0 AS BEGIN NEW.id = GEN_ID(generator_, 1) END;", 0, 0, &db_err); for(;;) Sleep(1000); return 0; } extern "C" int __declspec(dllexport) Unload() { while(sqlite3_close(db) == SQLITE_BUSY) Sleep(1000); MessageBoxA(0, "Database succesfuly unloaded", "INFO", MB_OK); return 0; } SERVICE dbWriteSetting(WPARAM w, LPARAM l) { PLUGININFO *info = (PLUGININFO*)w; DATA *data = (DATA*)l; switch (data->wType) { char buf[512], tmp[32]; case D_INT: itoa((int&)data->pData, tmp, 10); strcpy(buf, "INSERT INTO 'data' (module, setting, number) VALUES ('"); strcat(buf, info->shortName); strcat(buf, "', '"); strcat(buf, data->szSetting); strcat(buf, "', "); strcat(buf, tmp); strcat(buf, ");"); sqlite3_exec(db, buf, 0, 0, &db_err); MessageBoxA(0, db_err, "INFO", MB_OK); break; case D_STRING: strcpy(buf, "INSERT INTO 'data' (module, setting, string) VALUES ('"); strcat(buf, info->shortName); strcat(buf, "', '"); strcat(buf, data->szSetting); strcat(buf, "', '"); strcat(buf, (char*)data->pData); strcat(buf, "');"); sqlite3_exec(db, buf, 0, 0, &db_err); MessageBoxA(0, db_err, "INFO", MB_OK); break; case D_BLOB: break; default: break; } } SERVICE dbGetSetting(WPARAM w, LPARAM l) { PLUGININFO *info = (PLUGININFO*)w; DATA *data = (DATA*)l; } SERVICE dbDeleteSetting(WPARAM w, LPARAM l) { PLUGININFO *info = (PLUGININFO*)w; DATA *data = (DATA*)l; char buf[512]; strcpy(buf, "DELETE FROM data WHERE module = '"); strcat(buf, info->shortName); strcat(buf, "' AND setting = '"); strcat(buf, data->szSetting); strcat(buf, "';"); sqlite3_exec(db, buf, 0, 0, &db_err); MessageBoxA(0, db_err, "INFO", MB_OK); }