/* dbRW Copyright (c) 2005-2009 Robert Rainwater This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "dbrw.h" PLUGININFOEX pluginInfo = { sizeof(PLUGININFOEX), "dbRW SQLite DB Driver", PLUGIN_MAKE_VERSION(DBRW_VER_MAJOR,DBRW_VER_MINOR,0,0), #ifdef DBRW_DEBUG #ifdef DBRW_VER_ALPHA "Miranda IM database driver engine powered by SQLite v" SQLITE_VERSION " [Debug Build Alpha #" DBRW_VER_ALPHA "]", #else "Miranda IM database driver engine powered by SQLite v" SQLITE_VERSION " [Debug Build]", #endif #else #ifdef DBRW_VER_ALPHA "Miranda IM database driver engine powered by SQLite v" SQLITE_VERSION " [Alpha #" DBRW_VER_ALPHA "]", #else "Miranda IM database driver engine powered by SQLite v" SQLITE_VERSION, #endif #endif "Robert Rainwater", "rainwater@miranda-im.org", "Copyright © 2005-2011 Robert Rainwater", "http://www.miranda-im.org/", 0, DEFMOD_DB, {0xf3ca0e5e, 0x249a, 0x40f0, {0x8d, 0x74, 0x80, 0xa8, 0xe, 0xf0, 0xc8, 0x3d}} // {F3CA0E5E-249A-40f0-8D74-80A80EF0C83D} }; HINSTANCE g_hInst; struct MM_INTERFACE mmi; struct UTF8_INTERFACE utfi; struct LIST_INTERFACE li; sqlite3 *g_sqlite; char g_szDbPath[MAX_PATH]; HANDLE hSettingChangeEvent; HANDLE hContactDeletedEvent; HANDLE hContactAddedEvent; HANDLE hEventFilterAddedEvent; HANDLE hEventAddedEvent; HANDLE hEventDeletedEvent; PLUGINLINK *pluginLink; enum { DBRW_TABLE_SETTINGS = 0, DBRW_TABLE_CONTACTS, DBRW_TABLE_EVENTS, DBRW_TABLE_CORE, DBRW_TABLE_COUNT }; char *dbrw_tables[DBRW_TABLE_COUNT] = { "create table dbrw_settings (id integer, module varchar(255), setting varchar(255), type integer, val any, primary key(id,module,setting));", "create table dbrw_contacts (id integer primary key,createtime integer);", "create table dbrw_events (id integer primary key,eventtime integer,flags integer,eventtype integer, blob any, blobsize integer, contactid integer,modulename varchar(255),inserttime integer);", "create table dbrw_core (setting varchar(255) primary key not null, val any);" }; static int dbrw_getCaps(int flags); static int dbrw_getFriendlyName(char *buf, size_t cch, int shortName); static int dbrw_makeDatabase(char *profile, int *error); static int dbrw_grokHeader(char *profile, int *error); static int dbrw_Load(char *profile, void *link); static int dbrw_Unload(int wasLoaded); DATABASELINK dblink = { sizeof(DATABASELINK), dbrw_getCaps, dbrw_getFriendlyName, dbrw_makeDatabase, dbrw_grokHeader, dbrw_Load, dbrw_Unload }; char* utf8_encode(const char* src) { size_t len; char* result; wchar_t* tempBuf; if (src==NULL) return NULL; len = strlen(src); result = (char*)malloc(len*3+1); if (result==NULL) return NULL; tempBuf = (wchar_t*)alloca((len+1)*sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, 0, src, -1, tempBuf, (int)len); tempBuf[len] = 0; { wchar_t* s = tempBuf; BYTE* d = (BYTE*)result; while(*s) { int U = *s++; if (U<0x80) { *d++ = (BYTE)U; } else if (U<0x800) { *d++ = 0xC0+((U>>6)&0x3F); *d++ = 0x80+(U&0x003F); } else { *d++ = 0xE0+(U>>12); *d++ = 0x80+((U>>6)&0x3F); *d++ = 0x80+(U&0x3F); } } *d = 0; } return result; } static int dbrw_getCaps(int flags) { return 0; } static int dbrw_getFriendlyName(char *buf, size_t cch, int shortName) { strncpy(buf, shortName?"dbRW Driver":pluginInfo.shortName, cch); return 0; } static int dbrw_makeDatabase(char *profile, int *error) { sqlite3 *sql = NULL; int rc; char *szPath = utf8_encode(profile); rc = sqlite3_open(szPath, &sql); free(szPath); if (rc==SQLITE_OK) { int x; sqlite3_exec(sql, "PRAGMA page_size = 8192;", NULL, NULL, NULL); for (x=0;x