📄 fxdb.cpp
字号:
int len = strlen(base64_msg)+100; char *sql = (char*)malloc(sizeof(char)*len); if (!date) sprintf(sql,"insert into fx%ldusr values(\"%ld\",\"%s\",\"%d\",datetime(CURRENT_TIMESTAMP,'localtime'))", usr, uid, base64_msg, msg_len); else sprintf(sql,"insert into fx%ldusr values(\"%ld\",\"%s\",\"%d\",\"%s\")", usr, uid, base64_msg, msg_len, date); if (sqlite3_exec(pdb, sql, 0, 0, 0)!= SQLITE_OK) printf("it is error %s\n", sql); if (sql) free(sql); if (base64_msg) free(base64_msg);}int export_history(long uid, const char* filename){ char **result; char *perrmsg; int nrow, ncol; QString htm_name(filename); QFile htm(htm_name); if(!htm.open(QFile::WriteOnly | QFile::Truncate)) { printf("can not open file \n"); return 2; } if (!init_histroy_db(uid)) { printf("can not find the user \n"); return 1; } memset(sql, 0, SQL_MAXLEN); sprintf(sql,"select * from fx%ldusr", uid); if(SQLITE_OK != sqlite3_get_table(pdb, sql, &result, &nrow, &ncol, &perrmsg)){ printf("slecet flag table error!, the sql is...%s\n", sql); return -1; } QString res=create_result(result, nrow, ncol); sqlite3_free_table(result); QTextStream out(&htm); out << "<html><head><meta http-equiv=Content-Type content=\"text/html;charset=gb2312\"><title>LibFx chatlog</title></head><body>" << res << "</body></html>"; return 0;}bool clean_history(long uid){ char **result; char *perrmsg; int nrow, ncol; if(!init_db()) return false; memset(sql, 0, SQL_MAXLEN); sprintf(sql,"delete from fx%ldusr", uid); if(SQLITE_OK != sqlite3_get_table(pdb, sql, &result, &nrow, &ncol, &perrmsg)){ printf("slecet flag table error!, the sql is...%s\n", sql); return false; } return true;}#if 0int type = 1 //todayint type = 2 //one weekint type = 3 //two weekint type = 4 //one monthint type = 5 //all#endifchar *create_sql_for_histroy(long usr, long uid, HISTORY_DATE type){ char *sql = (char*)malloc(sizeof(char)*1024); switch(type) { case TODAY_HISTORY: sprintf(sql, "select * from fx%ldusr where julianday(date(datetime(CURRENT_TIMESTAMP,'localtime'))) - julianday(date(date_time)) == 0 and uid == \"%ld\" order by date_time asc", usr, uid); break; case ONE_WEEK_HISTORY: sprintf(sql, "select * from fx%ldusr where julianday(date(datetime(CURRENT_TIMESTAMP,'localtime'))) - julianday(date(date_time)) <= 7 and uid == \"%ld\" order by date_time asc", usr, uid); break; case TWO_WEEK_HISTORY: sprintf(sql, "select * from fx%ldusr where julianday(date(datetime(CURRENT_TIMESTAMP,'localtime'))) - julianday(date(date_time)) <= 14 and uid == \"%ld\" order by date_time asc", usr, uid); break; case ONE_MONTH_HISTORY: sprintf(sql, "select * from fx%ldusr where julianday(date(datetime(CURRENT_TIMESTAMP,'localtime'))) - julianday(date(date_time)) <= 30 and uid == \"%ld\" order by date_time asc", usr, uid); break; case ALL_DATE_HISTORY: sprintf(sql,"select * from fx%ldusr where uid == \"%ld\" order by date_time asc", usr, uid); break; default: return NULL; } return sql;}QString selectHistroyMsg(long usr, long uid, HISTORY_DATE type){ QString res; if (!init_histroy_db(usr)) return NULL; int ret, nrow, ncol; char* perrmsg; char **result; char *sql = create_sql_for_histroy(usr, uid, type); if (!sql) return NULL; ret = sqlite3_get_table(pdb, sql, &result, &nrow, &ncol, &perrmsg); if(ret != SQLITE_OK){ printf("slecet flag table error!, the sql is...%s\n", sql); return NULL; } res = create_result(result, nrow, ncol); sqlite3_free_table(result); if (sql) free(sql); return res;}QString create_result(char **result, int nrow, int ncol){ /* * uid result[index] * msg result[index+1] * msg_len result[index+2] * date_time result[index+3] */ QString res; int index = ncol; for(int i = 0; i < nrow; i++) { char *msg, *date; int msg_len = atoi(result [index+2]); msg = decryptXOR(result[index+1], msg_len, KEY); date = result[index+4]; /*printf("get the result %s,msg_len is %d msg is %s \n", result [index+3], msg_len, msg); char *tmp = (char*)malloc(sizeof(char)* (msg_len+1)); memcpy(tmp, msg, msg_len); tmp[msg_len] = '\0'; printf("the tmp msg is %s \n", tmp); if (tmp) free(tmp); */ res += QString::fromUtf8(msg) + "<br>"; if (msg) free(msg); index = index +ncol; } return res;}bool selectSystemMsg(long usr, long uid, const char* msg){ if (!msg || !init_histroy_db(usr)) return false; bool ret = false; int nrow, ncol; char* perrmsg; char **result; int len_msg = strlen(msg); //fixme: here is simple to compile of the msg's len... //maybe it is not very good, but for system message(not important) it is enough.. memset(sql, 0, SQL_MAXLEN); sprintf(sql, "select * from fx%ldusr where msg_len == \"%ld\" and uid == \"%ld\" ", usr, len_msg, uid); if (sqlite3_get_table(pdb, sql, &result, &nrow, &ncol, &perrmsg) != SQLITE_OK) { printf("slecet system table error!, the sql is...%s\n", sql); return false; } sqlite3_free_table(result); if(nrow) ret = true; // when system msg over 20, we will clean system msg { memset(sql, 0, SQL_MAXLEN); sprintf(sql, "select * from fx%ldusr where uid == \"%ld\" ", usr, uid); if (sqlite3_get_table(pdb, sql, &result, &nrow, &ncol, &perrmsg) != SQLITE_OK) { return ret; } sqlite3_free_table(result); if(nrow >= 20) { printf("haha , i will delete all system msg \n"); memset(sql, 0, SQL_MAXLEN); sprintf(sql,"delete from fx%ldusr where uid == \"%ld\" ", usr, uid); //exec the delete table sql sqlite3_exec(pdb, sql, 0, 0, 0); } } return ret;}BOOL init_storeAccountInfo_db(long usr){ static BOOL have_init = FALSE; if (!init_db()) return FALSE; if (have_init) return TRUE; char *perrmsg; memset(sql, 0, SQL_MAXLEN); sprintf(sql,"DROP TABLE IF EXISTS fxACINFO%ldusr ", usr); sqlite3_exec(pdb, sql, 0, 0, &perrmsg); //create the table memset(sql, 0, SQL_MAXLEN); sprintf(sql, "create table fxACINFO%ldusr(uid, online_state, mobilenm, local_name, nickname, impresa, showname)", usr); //exec the create table sql if( sqlite3_exec(pdb, sql, 0, 0, &perrmsg) != SQLITE_OK ) { printf("exel create table %s\n", sql); return FALSE; } //creat index memset(sql, 0, SQL_MAXLEN); sprintf(sql,"create index uid_index on fxACINFO%ldusr(uid)", usr); sqlite3_exec(pdb, sql, 0, 0, &perrmsg); have_init = TRUE; return TRUE;}void saveAccountToDB(Fetion_Account *account, long usr){ if (!account || account->id == usr) return; Fetion_Personal *personal = account->personal; long uid = account->id; int online_state; char *local_name; char *mobilenm; char *nickname; char *impresa; char *showname; online_state = fx_get_online_status_by_account(account); if (account->local_name) local_name = account->local_name; else local_name = ""; if (personal && personal->mobile_no) mobilenm = personal->mobile_no; else mobilenm = ""; if (personal && personal->nickname) nickname= personal->nickname; else nickname= ""; if (personal && personal->impresa) impresa = personal->impresa; else impresa = ""; showname = fx_get_account_show_name(account, TRUE); // insert data to databse memset(sql, 0, SQL_MAXLEN); sprintf(sql,"insert into fxACINFO%ldusr values(\"%ld\", \"%ld\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\")", usr, uid, online_state, mobilenm, local_name, nickname, impresa, showname); sqlite3_exec(pdb, sql, 0, 0, 0); if(showname) free(showname);}void saveAccountInfo(){ char *perrmsg; long usr = (qlonglong)strtol(fx_get_usr_uid(), NULL, 10); if (!init_db() || !init_storeAccountInfo_db(usr)) return ; sqlite3_exec(pdb, "begin transaction", 0, 0, &perrmsg ); Fetion_Account *account = NULL; DList *tmp_account = (DList *)fx_get_account(); while(tmp_account) { account = (Fetion_Account *)tmp_account->data; if(account) saveAccountToDB(account, usr); tmp_account = d_list_next(tmp_account); } sqlite3_exec(pdb, "commit transaction", 0, 0, &perrmsg ); }void create_search_result( QList<QTreeWidgetItem *> *items, char **result, int nrow, int ncol);QList<QTreeWidgetItem *> *searchAccountInfo(char * keyword){ QList<QTreeWidgetItem *> *items = new QList<QTreeWidgetItem *>; if (!init_db()) return items; long usr = (qlonglong)strtol(fx_get_usr_uid(), NULL, 10); int ret, nrow, ncol; char* perrmsg; char **result; sprintf(sql, "select * from fxACINFO%ldusr where uid like \'%s%%\' or mobilenm like \'%s%%\' or local_name like \'%%%s%%\' or nickname like \'%%%s%%\' or impresa like \'%%%s%%\'", usr, keyword, keyword, keyword, keyword, keyword); ret = sqlite3_get_table(pdb, sql, &result, &nrow, &ncol, &perrmsg); if(ret != SQLITE_OK){ printf("slecet flag table error!, the sql is...%s\n", sql); return items; } create_search_result(items,result, nrow, ncol); sqlite3_free_table(result); return items;}void create_search_result( QList<QTreeWidgetItem *> *items, char **result, int nrow, int ncol){// QList<QTreeWidgetItem *> items; /* long uid; int online_state; char *local_name; char *mobilenm; char *nickname; char *impresa; char *showname; */ //uid, online_state, mobilenm, local_name, nickname, impresa /* * uid result[index] * online_state result[index+1] * mobilenm result[index+2] * local_name result[index+3] * nickname result[index+4] * impresa result[index+5] * showname result[index+6] */ QString res; int index = ncol; for(int i = 0; i < nrow; i++) { Account_Info * ac_info = new Account_Info; ac_info->accountID = atol(result [index]); ac_info->onlinestate = atoi(result [index+1]); ac_info->accountName = QString::fromUtf8(result[index+6]); QTreeWidgetItem *accountItem = new QTreeWidgetItem; accountItem->setText(0, ac_info->accountName);#if MS_VC6 QVariant Var((uint)ac_info);#else QVariant Var; Var.setValue (ac_info); //vc7 up#endif accountItem->setData(0, Qt::UserRole, Var); accountItem->setIcon(0, getOnlineStatusIcon(ac_info->onlinestate)); QString tips; QString tmp; QString info; if (fx_is_pc_user_by_id(ac_info->accountID)){ info = QObject::tr("fetion_no:"); info += "<b style=\"color:red; \">"+QString("%1").arg(ac_info->accountID)+"</b>"; tips += info +"<br>"; } tmp = QString::fromUtf8( result[index+2]); if (!tmp.isEmpty()) { info = QObject::tr("mobile no:"); info += "<b style=\"color:red; \">" + tmp +"</b>"; tips += info +"<br>"; } tmp = QString::fromUtf8( result[index+3]); if (!tmp.isEmpty()) { info = QObject::tr("local_name:"); info += "<b style=\"color:red; \">" + tmp +"</b>"; tips += info +"<br>"; } tmp = QString::fromUtf8( result[index+4]); if (!tmp.isEmpty()) { info = QObject::tr("nickname:"); info += "<b style=\"color:red; \">" + tmp +"</b>"; tips += info +"<br>"; } tmp = QString::fromUtf8(result[index+5]); if (!tmp.isEmpty()) { info = QObject::tr("impresa:"); info += "<b style=\"color:red; \">" + tmp +"</b>"; tips += info +"<br>"; } //remov the last "<br>" tips = tips.remove( tips.size() - strlen("<br>"), strlen("<br>")); accountItem->setToolTip(0, tips); index = index +ncol; items->append(accountItem); }// printf("the nrow is %d ncol is %d \n", nrow, ncol); //return items;}#if WIN_DEBUG char buf_sd[1024*10];void qt_debug(char* fmt, ...){ int tmp; va_list va; va_start (va, fmt);#ifdef WIN32 tmp = _vsnprintf (buf_sd, sizeof(buf_sd) - 1, fmt, va);#else tmp = vsnprintf (buf_sd, sizeof(buf_sd) - 1, fmt, va);#endif buf_sd[tmp] = '\0'; va_end(va);#ifdef WIN32#if 1 static int isInit = 0; if (!isInit) { // open_log(); AllocConsole(); isInit = 1; } HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); DWORD n, m; WriteConsoleA(h, buf_sd, strlen(buf_sd), &n, &m); //call non-unicode // logit(buf_sd);#endif#if _MSC_VER > 1000// ::OutputDebugString(buf);#endif#endif printf("%s", buf_sd); // printf("--[%s,%s,%d]--%s", __FUNCTION__, __FILE__, __LINE__, buf); }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -