From 48540940b6c28bb4378abfeb500ec45a625b37b6 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Tue, 15 May 2012 10:38:20 +0000 Subject: initial commit git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/dbrw/utils.c | 209 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 plugins/dbrw/utils.c (limited to 'plugins/dbrw/utils.c') diff --git a/plugins/dbrw/utils.c b/plugins/dbrw/utils.c new file mode 100644 index 0000000000..7288e50e34 --- /dev/null +++ b/plugins/dbrw/utils.c @@ -0,0 +1,209 @@ +/* +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" + +#ifdef DBRW_LOGGING +static FILE *fp = NULL; +static int disableLogging = 0; + +void utils_log_init() { + char szPath[MAX_PATH], szFullPath[MAX_PATH]; + char *str2; + + disableLogging = utils_private_setting_get_int("DisableLogging", 0); + if (disableLogging) + return; + GetModuleFileName(GetModuleHandle(NULL), szPath, sizeof(szPath)-1); + str2 = strrchr(szPath,'\\'); + if(str2!=NULL) + *str2 = 0; + mir_snprintf(szFullPath, sizeof(szFullPath), "%s\\dbx_rw.log", szPath); + fp = fopen(szFullPath,"wt"); +} + +void utils_log_destroy() { + if (fp) + fclose(fp); +} + +void utils_log_fmt(const char *file,int line,const char *fmt,...) { + if (fp) { + va_list vararg; + char str[1024]; + + va_start(vararg,fmt); + mir_vsnprintf(str,sizeof(str),fmt,vararg); + va_end(vararg); + fprintf(fp,"%u: %s %d: %s\n",(unsigned int)GetTickCount(),file,line,str); + } +} +#endif + +INT_PTR utils_setSafetyMode(WPARAM wParam, LPARAM lParam) { + int safeMode = (int)wParam; + + log1("db_setSafetyMode: %s", safeMode?"On":"Off"); + if (safeMode) + sql_exec(g_sqlite, "PRAGMA synchronous = NORMAL;"); + else + sql_exec(g_sqlite, "PRAGMA synchronous = OFF;"); + return 0; +} + +INT_PTR utils_encodeString(WPARAM wParam,LPARAM lParam) { + char *msg = (char*)lParam; + int i; + + for (i=0; msg[i]; i++) { + msg[i] = msg[i] + DBRW_ROT; + } + return 0; +} + +INT_PTR utils_decodeString(WPARAM wParam,LPARAM lParam) { + char *msg = (char*)lParam; + int i; + + for (i=0; msg[i]; i++) { + msg[i] = msg[i] - DBRW_ROT; + } + return 0; +} + +DWORD utils_hashString(const char *szStr) { + DWORD hash = 0; + int i; + int shift = 0; + + for(i=0; szStr[i]; i++) { + hash ^= szStr[i]<24) + hash ^= (szStr[i]>>(32-shift))&0x7F; + shift = (shift+5)&0x1F; + } + return hash; +} + +int utils_private_setting_get_int(const char *setting, int defval) { + sqlite3_stmt *stmt; + int rc = defval; + + if (setting==NULL) + return rc; + sql_prepare(g_sqlite, "SELECT val FROM dbrw_core where setting = ?;", &stmt); + sqlite3_bind_text(stmt, 1, setting, -1, SQLITE_STATIC); + if (sql_step(stmt)==SQLITE_ROW) { + rc = sqlite3_column_int(stmt, 0); + } + sql_finalize(stmt); + return rc; +} + +int utils_private_setting_set_int(const char *setting, int val) { + sqlite3_stmt *stmt; + int rc = 0; + + if (setting==NULL) + return rc; + sql_prepare(g_sqlite, "REPLACE INTO dbrw_core VALUES(?,?);", &stmt); + sqlite3_bind_text(stmt, 1, setting, -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 2, val); + if (sql_step(stmt)==SQLITE_DONE) { + rc = 1; + } + sql_finalize(stmt); + return rc; +} + +static time_t utils_private_setting_get_time(const char *setting, time_t defval) { + sqlite3_stmt *stmt; + time_t rc = defval; + + if (setting==NULL) + return rc; + sql_prepare(g_sqlite, "SELECT val FROM dbrw_core where setting = ?;", &stmt); + sqlite3_bind_text(stmt, 1, setting, -1, SQLITE_STATIC); + if (sql_step(stmt)==SQLITE_ROW) { + rc = (time_t)sqlite3_column_int(stmt, 0); + } + sql_finalize(stmt); + return rc; +} + +static int utils_private_setting_set_time(const char *setting, time_t val) { + sqlite3_stmt *stmt; + int rc = 0; + + if (setting==NULL) + return rc; + sql_prepare(g_sqlite, "REPLACE INTO dbrw_core VALUES(?,?);", &stmt); + sqlite3_bind_text(stmt, 1, setting, -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 2, val); + if (sql_step(stmt)==SQLITE_DONE) { + rc = 1; + } + sql_finalize(stmt); + return rc; +} + +static HWND hwndVacuum; +#define DM_VACUUM (WM_USER+1) +#define DBRW_VACUUM_KEY "LastCompact" + +static void __cdecl utils_vacuum_thread(void *args) { + sql_exec(g_sqlite, "VACUUM;"); + if (IsWindow(hwndVacuum)) + SendMessage(hwndVacuum, DM_VACUUM, 0, 0); +} + +static INT_PTR CALLBACK utils_vacuum_proc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { + switch (msg) { + case WM_INITDIALOG: + hwndVacuum = hwndDlg; + SetDlgItemTextA(hwndDlg, IDC_TEXT, Translate("Your Miranda IM profile is being compacted. Please wait...")); + mir_forkthread(utils_vacuum_thread, 0); + break; + case DM_VACUUM: + DestroyWindow(hwndDlg); + break; + } + return FALSE; +} + +void utils_vacuum_check() { + time_t lastC = utils_private_setting_get_time(DBRW_VACUUM_KEY, 0); + time_t now = time(NULL); + + if (lastC) { + if (lastC>now) { + log0("System time changed. Resetting LastCompact key."); + utils_private_setting_set_time(DBRW_VACUUM_KEY, now); + } + else if ((now-lastC)>(60*60*24*DBRW_COMPACT_DAYS)) { + log0("Compacting database"); + DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_INFODLG), 0, utils_vacuum_proc,(LPARAM)0); + hwndVacuum = NULL; + utils_private_setting_set_time(DBRW_VACUUM_KEY, now); + } + } + else { + utils_private_setting_set_time(DBRW_VACUUM_KEY, now); + } +} -- cgit v1.2.3