1 Star 2 Fork 0

龙雨城 / RH_Douyin

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
dbOperations.cpp 76.81 KB
一键复制 编辑 原始数据 按行查看 历史
龙雨城 提交于 2022-05-10 16:02 . 完善了日志
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175
#include<iostream>
#include<vector>
#include<string>
#include<unordered_map>
#include <sstream>
#include"sqlite3.h"
#include"getUserID.h"
#include"helptool.h"
#include"dbOperations.h"
#include "json.hpp"
#define _Get_FileName_(x) strrchr(x,'\\')?strrchr(x,'\\')+1:x
#define log(type,AMsg,ExID) wlog((type), (AMsg), _Get_FileName_(__FILE__), (__LINE__))
/*
* 参数:string:需要建立Total表和TotalSQL表的主控数据库路径
* 作者:龙向洋
* 说明:用于建立Total表和TotalSQL表,返回true则建表成功
*/
int createTotalDB(std::wstring& dbpath) {
sqlite3* ptrdb = nullptr;
int dbisexist = m_sqlite3_open(dbpath, &ptrdb);
std::string logstr = "Start create: Total and Total Sql";
log((char*)"INFO", (char*)(logstr).c_str(), (char*)"");
// 创建TOTAL表
std::string createTotalDB = "create table if not exists T_DouYin_TOTAL"\
"(_id integer primary key not null,"\
"fatherID integer not null,"\
"treeName text not null, "\
"count number(20),"\
"sonTableName text not null,"\
"subGroupID text,"\
"icon text default 0,"\
"profileID text,"\
"state number(1),"\
"type number(1),"\
"session number(1),"\
"isDownload number(1),"\
"supportMode number(1),"\
"previewType number(1),"\
"addCount number(20));";
if (sqlite3_exec(ptrdb, createTotalDB.c_str(), nullptr, nullptr, nullptr) != SQLITE_OK) {
logstr.clear();
logstr = "Fail to create Total";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -1;
}
// 创建TotalSQL表
std::string createTotalSQLDB = "create table if not exists T_DouYin_TOTAL_SQL"\
"(_id INTEGER primary key not null,"\
"sqlstr TEXT,"\
"TableName TEXT,"\
"HtmlSqlstr TEXT,"\
"ColumnWidth TEXT,"\
"Columns number(3),"\
"HtmlSqlstr_simple TEXT,"\
"ColumnWidth_simple TEXT,"\
"Columns_simple number(3),"\
"Type number(1),"\
"Rows number(3),"\
"SimuSql TEXT);";
if (sqlite3_exec(ptrdb, createTotalSQLDB.c_str(), nullptr, nullptr, nullptr) != SQLITE_OK) {
logstr.clear();
logstr = "Fail to create Total_Sql";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -2;
}
sqlite3_close(ptrdb);
return 1;
}
/*
* 参数:数据库路径及ID对应表
* 作者:龙向洋
* 说明:写入信息表账号信息(T_WEB_ACCOUNT)的信息:ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, REGIS_NICKNAME
*/
int writeT_WEB_ACCOUNT(std::wstring origindbpath, std::wstring savedbpath, const std::unordered_map<std::string, std::string>& idpairs) {
// 获取主控数据库连接
std::string logstr = "Start write: T_WEB_ACCOUNT";
log((char*)"INFO", (char*)(logstr).c_str(), (char*)"");
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr.clear();
logstr = "Fail to connect MainDB when write T_WEB_ACCOUNT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -1;
}
// 存入账号信息表T_WEB_ACCOUNT
// 清空
std::wstring sql = L"";
sql.clear();
sql += L"delete from T_WEB_ACCOUNT where TOTAL_NAME = 'T_DouYin_TOTAL';";
m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
sql.clear();
// 存入
int countACCOUNT = 0;
// 读取手机里的账号库,一个APP可能存在多个登陆过的用户
//std::cout << "success !!!" << std::endl;
for (auto& pair : idpairs) {
countACCOUNT++;
std::wstring im_bizdbpath = origindbpath;
im_bizdbpath += L"\\im_biz_";
im_bizdbpath += stringToWstring(pair.first);
im_bizdbpath += L".db";
//std::wstring im_bizdbpath_test = L"F:\\RH-8800\\Phones\\案件(2022041416402222222)\\vivo X27 Pro 全网通版(20220414164007)\\FileSystem\\data\\data\\com.ss.android.ugc.aweme\\databases\\im_biz_245913698180439.db";
// 建立当前用户数据库连接
sqlite3* originptrdb = nullptr;
int originDBIsExist = m_sqlite3_open(im_bizdbpath, &originptrdb);
if (originDBIsExist != SQLITE_OK) {
logstr.clear();
logstr = "Fail to connect im_bizDB when write T_WEB_ACCOUNT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -2;
}
// 读取和插入的SQL对象语句
sqlite3_stmt* stmt_select = nullptr;
sqlite3_stmt* stmt_insert = nullptr;
// 读取 NICK_NAME、UNIQUE_ID
sql.clear();
sql += L"select NICK_NAME, UNIQUE_ID from SIMPLE_USER where UID = ?;";
// 读取当前用户数据库的信息
int retselect = m_sqlite3_prepare_v2(originptrdb, sql, -1, &stmt_select, nullptr);
if (SQLITE_OK != retselect)
{
logstr.clear();
logstr = "Fail to select im_bizDB when write T_WEB_ACCOUNT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
sqlite3_finalize(stmt_select);
return -3;
}
sqlite3_bind_text(stmt_select, 1, pair.first.c_str(), strlen(pair.first.c_str()), nullptr);
int se1 = sqlite3_step(stmt_select);
if (se1 == SQLITE_ROW) {
sql.clear();
sql += L"insert into T_WEB_ACCOUNT (ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, REGIS_NICKNAME) values (?, ?, ?, ?, ?, ?)";
int retinsert = m_sqlite3_prepare_v2(saveptrdb, sql, -1, &stmt_insert, NULL);
if (retinsert != SQLITE_OK) {
logstr.clear();
logstr = "Fail to insert T_WEB_ACCOUNT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
sqlite3_finalize(stmt_insert);
return -4;
}
// 给stmt_insert语句赋值
std::wstring ID = std::to_wstring(countACCOUNT);
std::wstring APP_NAME = L"抖音";
std::wstring TOTAL_NAME = L"T_DouYin_TOTAL";
std::wstring ACCOUNT = stringToWstring(pair.first);
// 获取传参的ACCOUNT_ID
std::string account_id((const char*)sqlite3_column_text(stmt_select, 1));
std::wstring ACCOUNT_ID = stringToWstring(account_id);
// 获取传参的:昵称
std::string nickname((const char*)sqlite3_column_text(stmt_select, 0));
std::wstring REGIS_NICKNAME = stringToWstring(nickname);
m_sqlite3_bind_text(stmt_insert, 1, ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 2, APP_NAME, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 3, TOTAL_NAME, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 4, ACCOUNT_ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 5, ACCOUNT, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 6, REGIS_NICKNAME, -1, nullptr);
sqlite3_step(stmt_insert);
sqlite3_finalize(stmt_insert);
}
sqlite3_finalize(stmt_select);
sqlite3_close(originptrdb);
}
// 关闭数据库连接
sqlite3_close(saveptrdb);
return 1;
}
/*
* 参数:数据库路径及ID对应表
* 作者:龙向洋
* 说明:写入信息表(T_IM_CONTACT)的信息:ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, FRIEND_ID, FRIEND_ACCOUNT, FRIEND_NICKNAME, SIGN_NAME
*/
int writeT_IM_CONTACT(std::wstring origindbpath, std::wstring savedbpath, const std::unordered_map<std::string, std::string>& idpairs) {
std::string logstr = "Start write: T_IM_CONTACT";
log((char*)"INFO", (char*)(logstr).c_str(), (char*)"");
// 获取主控数据库连接
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr.clear();
logstr = "Fail to connect MainDB when write T_IM_CONTACT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -1;
}
// 清空
std::wstring sql = L"";
sql.clear();
sql += L"delete from T_IM_CONTACT where TOTAL_NAME = 'T_DouYin_TOTAL';";
m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
sql.clear();
// 行ID
int count = 0;
// 读取手机里的账号库,一个APP可能存在多个登陆过的用户
//std::cout << "success !!!" << std::endl;
for (auto& pair : idpairs) {
std::wstring im_bizdbpath = origindbpath;
im_bizdbpath += L"\\im_biz_";
im_bizdbpath += stringToWstring(pair.first);
im_bizdbpath += L".db";
//std::wstring im_bizdbpath_test = L"F:\\RH-8800\\Phones\\案件(2022041416402222222)\\vivo X27 Pro 全网通版(20220414164007)\\FileSystem\\data\\data\\com.ss.android.ugc.aweme\\databases\\im_biz_245913698180439.db";
// 建立当前用户数据库连接
sqlite3* originptrdb = nullptr;
int originDBIsExist = m_sqlite3_open(im_bizdbpath, &originptrdb);
if (originDBIsExist != SQLITE_OK) {
logstr.clear();
logstr = "Fail to connect im_bizDB when write T_IM_CONTACT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -2;
}
// 读取和插入的SQL对象语句
sqlite3_stmt* stmt_select_UNIQUE_ID = nullptr;
sqlite3_stmt* stmt_select = nullptr;
sqlite3_stmt* stmt_insert = nullptr;
// -----------读取 当前账号的 UNIQUE_ID(也就是ACCOUNT_ID)
sql.clear();
sql += L"select UNIQUE_ID from SIMPLE_USER where UID = ?;";
int prepareUNIQUE_ID = m_sqlite3_prepare_v2(originptrdb, sql, -1, &stmt_select_UNIQUE_ID, nullptr);
if (SQLITE_OK != prepareUNIQUE_ID) {
sqlite3_finalize(stmt_select_UNIQUE_ID);
logstr.clear();
logstr = "Fail to select im_bizDB when write T_IM_CONTACT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -3;
}
sqlite3_bind_text(stmt_select_UNIQUE_ID, 1, pair.first.c_str(), strlen(pair.first.c_str()), nullptr);
int selectUNIQUE_ID = sqlite3_step(stmt_select_UNIQUE_ID);
std::wstring curUserACCOUNT_ID;
if (selectUNIQUE_ID == SQLITE_ROW) {
std::string account_id((const char*)sqlite3_column_text(stmt_select_UNIQUE_ID, 0));
curUserACCOUNT_ID = stringToWstring(account_id);
}
sqlite3_finalize(stmt_select_UNIQUE_ID);
// -----------读取 FRIEND_ID, FRIEND_ACCOUNT, FRIEND_NICKNAME, SIGN_NAME, REMARK_NAME, FOLLOW_STATUS
sql.clear();
sql += L"select UNIQUE_ID, UID, NICK_NAME, SIGNATURE, REMARK_NAME, FOLLOW_STATUS from SIMPLE_USER where UID != ?;";
// 读取当前用户数据库的信息
int prepareselect = m_sqlite3_prepare_v2(originptrdb, sql, -1, &stmt_select, nullptr);
if (SQLITE_OK != prepareselect) {
sqlite3_finalize(stmt_select);
logstr.clear();
logstr = "Fail to select SIMPLE_USER when write T_IM_CONTACT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -4;
}
sqlite3_bind_text(stmt_select, 1, pair.first.c_str(), strlen(pair.first.c_str()), nullptr);
//int ret = sqlite3_column_count(stmt_select);
//std::cout << "调试sqlite3_column_count " << ret << std::endl;
sql.clear();
sql += L"insert into T_IM_CONTACT (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, FRIEND_ID, FRIEND_ACCOUNT, FRIEND_NICKNAME, FRIEND_REMARK, SIGN_NAME, RH_FRIEND_TYPE) values(? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ?);";
while (sqlite3_step(stmt_select) == SQLITE_ROW) {
count++;
int retinsert = m_sqlite3_prepare_v2(saveptrdb, sql, -1, &stmt_insert, nullptr);
if (retinsert != SQLITE_OK) {
sqlite3_finalize(stmt_insert);
logstr.clear();
logstr = "Fail to insert T_IM_CONTACT";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -5;
}
std::wstring ID = std::to_wstring(count);
std::wstring PROFILE_ID = stringToWstring(pair.second);
std::wstring APP_NAME = L"抖音";
std::wstring TOTAL_NAME = L"T_DouYin_TOTAL";
// ACCOUNT_ID
std::wstring ACCOUNT_ID = curUserACCOUNT_ID;
// ACCOUNT
std::wstring ACCOUNT = stringToWstring(pair.first);
// 获取传参的FRIEND_ID,stmt_select位置0
std::string friend_id((const char*)sqlite3_column_text(stmt_select, 0));
std::wstring FRIEND_ID = stringToWstring(friend_id);
// 获取传参的FRIEND_ACCOUNT,stmt_select位置1
std::string friend_account((const char*)sqlite3_column_text(stmt_select, 1));
std::wstring FRIEND_ACCOUNT = stringToWstring(friend_account);
// 获取传参的FRIEND_NICKNAME,stmt_select位置2
std::string nickname((const char*)sqlite3_column_text(stmt_select, 2));
std::wstring REGIS_NICKNAME = stringToWstring(nickname);
// 获取传参的SIGN_NAME,stmt_select位置3
std::string sign_name((const char*)sqlite3_column_text(stmt_select, 3));
std::wstring SIGN_NAME;
UTF8ToUnicode(sign_name, SIGN_NAME);
// 获取传参的REMARK_NAME,stmt_select位置4
std::string remarkname((const char*)sqlite3_column_text(stmt_select, 4));
std::wstring REMARK_NAME = stringToWstring(remarkname);
// 获取传参的FOLLOW_STATUS,stmt_select位置5
//std::string follow_status((const char*)sqlite3_column_text(stmt_select, 5));
int FOLLOW_STATUS = sqlite3_column_int(stmt_select, 5);
m_sqlite3_bind_text(stmt_insert, 1, ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 2, PROFILE_ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 3, APP_NAME, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 4, TOTAL_NAME, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 5, ACCOUNT_ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 6, ACCOUNT, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 7, FRIEND_ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 8, FRIEND_ACCOUNT, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 9, REGIS_NICKNAME, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 10, REMARK_NAME, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 11, SIGN_NAME, -1, nullptr);
sqlite3_bind_int(stmt_insert, 12, FOLLOW_STATUS);
sqlite3_step(stmt_insert);
sqlite3_reset(stmt_insert);
}
sqlite3_finalize(stmt_insert);
sqlite3_finalize(stmt_select);
sqlite3_close(originptrdb);
}
// 关闭数据库连接
sqlite3_close(saveptrdb);
return 1;
}
/*
* 参数:数据库路径及ID对应表
* 作者:龙向洋
* 说明:写入群组(T_IM_GROUP)的信息:ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, GROUP_NAME, GROUP_MEMBER_COUNT, GROUPPHOTO
*/
int writeT_IM_GROUP(std::wstring origindbpath, std::wstring savedbpath, std::wstring savefilepath, const std::unordered_map<std::string, std::string>& idpairs) {
std::string logstr = "Start write: T_IM_GROUP";
log((char*)"INFO", (char*)(logstr).c_str(), (char*)"");
// 获取主控数据库连接
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr.clear();
logstr = "Fail to connect MainDB when write T_IM_GROUP";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -1;
}
// 清空
std::wstring sql = L"";
sql.clear();
sql += L"delete from T_IM_GROUP where TOTAL_NAME = 'T_DouYin_TOTAL';";
m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
sql.clear();
// 行ID
int count = 0;
for (auto& pair : idpairs) {
// 获取账号的ACCOUNT_ID
std::wstring im_bizdbpath = origindbpath;
im_bizdbpath += L"\\im_biz_";
im_bizdbpath += stringToWstring(pair.first);
im_bizdbpath += L".db";
sql.clear();
sql += L"select UNIQUE_ID from SIMPLE_USER where UID = '";
sql += stringToWstring(pair.first);
sql += L"';";
auto tempinfo = getSingleInfo(im_bizdbpath, sql);
std::wstring account_id = tempinfo[0];
// 建立当前用户数据库连接
std::wstring num_impath = origindbpath;
num_impath += L"\\";
num_impath += stringToWstring(pair.first);
num_impath += L"_im.db";
sqlite3* originptrdb = nullptr;
int originDBIsExist = m_sqlite3_open(num_impath, &originptrdb);
if (originDBIsExist != SQLITE_OK) {
logstr.clear();
logstr = "Fail to connect _imDB when write T_IM_GROUP";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -2;
}
sqlite3_stmt* stmt_select_conid_memcount = nullptr;
sql.clear();
sql += L"SELECT conversation_id, member_count from conversation_list where type= 2;";
int prepareconid_memcount = m_sqlite3_prepare_v2(originptrdb, sql, -1, &stmt_select_conid_memcount, nullptr);
if (SQLITE_OK != prepareconid_memcount) {
sqlite3_finalize(stmt_select_conid_memcount);
logstr.clear();
logstr = "Fail to select conversation_list when write T_IM_GROUP";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -3;
}
// PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT
std::wstring PROFILE_ID = stringToWstring(pair.second);
std::wstring APP_NAME = L"抖音";
std::wstring TOTAL_NAME = L"T_DouYin_TOTAL";
std::wstring ACCOUNT_ID = account_id;
std::wstring ACCOUNT = stringToWstring(pair.first);
std::wstring insertsql = L"insert into T_IM_GROUP (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, GROUP_NAME, GROUP_MEMBER_COUNT, GROUPPHOTO) values (?,?,?,?,?,?,?,?,?);";
sqlite3_stmt* stmt_insert = nullptr;
while (sqlite3_step(stmt_select_conid_memcount) == SQLITE_ROW) {
count++;
// ID
std::wstring ID = std::to_wstring(count);
// 群会话id
std::string conversation_id((const char*)sqlite3_column_text(stmt_select_conid_memcount, 0));
// 群成员数量
int member_count = sqlite3_column_int(stmt_select_conid_memcount, 1);
// 读群聊名称、群头像
sql.clear();
sql += L"SELECT name, icon from conversation_core where conversation_id = '";
sql += stringToWstring(conversation_id);
sql += L"';";
auto tempgroupinfos = getSingleInfo(num_impath, sql);
// 群聊名称
std::wstring Group_Name = tempgroupinfos[0];
// 群成员数目
std::wstring GROUP_MEMBER_COUNT = std::to_wstring(member_count);
// 群头像
std::wstring GROUPPHOTOURL = tempgroupinfos[1];
std::wstring tempsavefile = L"\\msg_files";
tempsavefile += L"\\";
tempsavefile += ACCOUNT;
tempsavefile += L"_";
tempsavefile += ID;
tempsavefile += L".jpg";
ImageDownloader(wstring2string(GROUPPHOTOURL), wstring2string(savefilepath + tempsavefile));
int retinsert = m_sqlite3_prepare_v2(saveptrdb, insertsql, -1, &stmt_insert, nullptr);
if (retinsert != SQLITE_OK) {
sqlite3_finalize(stmt_insert);
logstr.clear();
logstr = "Fail to insert T_IM_GROUP";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -4;
}
m_sqlite3_bind_text(stmt_insert, 1, ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 2, PROFILE_ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 3, APP_NAME, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 4, TOTAL_NAME, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 5, ACCOUNT_ID, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 6, ACCOUNT, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 7, Group_Name, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 8, GROUP_MEMBER_COUNT, -1, nullptr);
m_sqlite3_bind_text(stmt_insert, 9, tempsavefile, -1, nullptr);
sqlite3_step(stmt_insert);
sqlite3_reset(stmt_insert);
}
sqlite3_finalize(stmt_insert);
sqlite3_close(originptrdb);
}
sqlite3_close(saveptrdb);
return 1;
}
/*
* 参数:数据库路径及ID对应表
* 作者:龙向洋
* 说明:写入信息表(T_IM_GROUP_MSG)的信息:
* * (1)账号基础信息 :ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, GROUP_NAME,
* * (2)聊天人信息 :FRIEND_ID, FRIEND_ACCOUNT, FRIEND_NICKNAME,
* * (3)聊天内容 :CONTENT, RH_TEXT_MSG, FILE_PATH, MAIL_SEND_TIME, LOCAL_ACTION, TALK_ID, MEDIA_TYPE, CITY_CODE, COMPANY_ADDRESS, LONGITUDE, LATITUDE, DUAL_TIME, RH_MSG_TYPE
*/
int writeT_IM_GROUP_MSG(std::wstring origindbpath, std::wstring savedbpath, std::wstring savefilepath, const std::unordered_map<std::string, std::string>& idpairs) {
// 获取群名、群会话id
// 当前账号下有多个群会话,所以有多个群会话id
// 对应关系为:{当前账号:[群会话id1,群会话id2,...]}
// 根据会话id读取msg表,要以聊天记录的时间排序读取
std::string logstr = "Start write: T_IM_GROUP_MSG";
log((char*)"INFO", (char*)(logstr).c_str(), (char*)"");
// 获取主控数据库连接
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr.clear();
logstr = "Fail to connect MainDB when write T_IM_GROUP_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -1;
}
// 清空
std::wstring sql = L"";
sql.clear();
sql += L"delete from T_IM_GROUP_MSG where TOTAL_NAME = 'T_DouYin_TOTAL';";
m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
sql.clear();
// 行ID
int count = 0;
// 遍历登录过的账户
for (auto& pair: idpairs) {
// 获取账号的ACCOUNT_ID
std::wstring im_bizdbpath = origindbpath;
im_bizdbpath += L"\\im_biz_";
im_bizdbpath += stringToWstring(pair.first);
im_bizdbpath += L".db";
sql.clear();
sql += L"select UNIQUE_ID from SIMPLE_USER where UID = '";
sql += stringToWstring(pair.first);
sql += L"';";
auto tempinfo = getSingleInfo(im_bizdbpath, sql);
std::wstring account_id = tempinfo[0];
// PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT
std::wstring PROFILE_ID = stringToWstring(pair.second);
std::wstring APP_NAME = L"抖音";
std::wstring TOTAL_NAME = L"T_DouYin_TOTAL";
std::wstring ACCOUNT_ID = account_id;
std::wstring ACCOUNT = stringToWstring(pair.first);
// 当前用户数据库路径,包含msg表
std::wstring num_impath = origindbpath;
num_impath += L"\\";
num_impath += stringToWstring(pair.first);
num_impath += L"_im.db";
sqlite3* originptrdb = nullptr;
int originDBIsExist = m_sqlite3_open(num_impath, &originptrdb);
if (originDBIsExist != SQLITE_OK) {
logstr.clear();
logstr = "Fail to connect _imDB when write T_IM_GROUP_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -2;
}
// 联系人数据库,包含 simple_user 表
std::wstring accountdbpath = origindbpath;
accountdbpath += L"\\im_biz_";
accountdbpath += stringToWstring(pair.first);
accountdbpath += L".db";
// 获取当前账号下的所有的群会话id
sqlite3_stmt* stmt_select_conid = nullptr;
sql.clear();
sql += L"SELECT conversation_id from conversation_list where type= 2;";
int prepareconid_memcount = m_sqlite3_prepare_v2(originptrdb, sql, -1, &stmt_select_conid, nullptr);
if (SQLITE_OK != prepareconid_memcount) {
sqlite3_finalize(stmt_select_conid);
logstr.clear();
logstr = "Fail to select conversation_list when write T_IM_GROUP_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -3;
}
while (sqlite3_step(stmt_select_conid) == SQLITE_ROW) {
// 群会话id
std::string conversation_id((const char*)sqlite3_column_text(stmt_select_conid, 0));
// 根据会话id读群名称 GROUP_NAME
sql.clear();
sql += L"SELECT name from conversation_core where conversation_id = '";
sql += stringToWstring(conversation_id);
sql += L"';";
auto tempgroupinfos = getSingleInfo(num_impath, sql);
std::wstring Group_Name = tempgroupinfos[0];
// 根据会话id读取msg表的:msg_uuid, created_time, sender
sql.clear();
sql += L"SELECT msg_uuid, created_time, sender, content FROM msg WHERE conversation_id = '";
sql += stringToWstring(conversation_id);
sql += L"' ORDER BY index_in_conversation_v2;";
// 读当前会话下的聊天信息
sqlite3_stmt* stmt_select_msg = nullptr;
int preparemsg = m_sqlite3_prepare_v2(originptrdb, sql, -1, &stmt_select_msg, nullptr);
if (SQLITE_OK != preparemsg) {
sqlite3_finalize(stmt_select_msg);
logstr.clear();
logstr = "Fail to select msg when write T_IM_GROUP_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -4;
}
while (sqlite3_step(stmt_select_msg) == SQLITE_ROW) {
count++;
// ID
std::wstring ID = std::to_wstring(count);
std::string msg_uuid((const char*)sqlite3_column_text(stmt_select_msg, 0));
std::string created_time((const char*)sqlite3_column_text(stmt_select_msg, 1));
std::string sender((const char*)sqlite3_column_text(stmt_select_msg, 2));
std::string content((const char*)sqlite3_column_text(stmt_select_msg, 3));
// msg_uuid,即 TALK_ID
std::wstring TALK_ID = stringToWstring(msg_uuid);
// created_time, 即 MAIL_SEND_TIME
std::wstring MAIL_SEND_TIME = stringToWstring(created_time);
// sender,即 FRIEND_ACCOUNT
std::wstring FRIEND_ACCOUNT = stringToWstring(sender);
// 获取sender的 FRIEND_ID, FRIEND_NICKNAME,
sql.clear();
sql += L"SELECT UNIQUE_ID, NICK_NAME FROM SIMPLE_USER where UID = '";
sql += FRIEND_ACCOUNT;
sql += L"';";
auto tempaccountinfos = getSingleInfo(accountdbpath, sql);
std::wstring FRIEND_ID = L"";
std::wstring FRIEND_NICKNAME = L"";
if (tempaccountinfos.size() == 2) {
if (!tempaccountinfos[0].empty()) {
FRIEND_ID = tempaccountinfos[0];
}
else {
FRIEND_ID = L"info: UNIQUE_ID is empty!";
}
if (!tempaccountinfos[1].empty()) {
FRIEND_NICKNAME = tempaccountinfos[1];
}
else {
FRIEND_NICKNAME = L"info: NICK_NAME is empty!";
}
}
//printWstring();
// -------------------------------
// 存放插入内容
std::vector<std::wstring> insertInfo;
// ID
insertInfo.push_back(ID);
// PROFILE_ID
insertInfo.push_back(PROFILE_ID);
// APP_NAME
insertInfo.push_back(APP_NAME);
// TOTAL_NAME
insertInfo.push_back(TOTAL_NAME);
// ACCOUNT_ID
insertInfo.push_back(ACCOUNT_ID);
// ACCOUNT
insertInfo.push_back(ACCOUNT);
// GROUP_NAME
insertInfo.push_back(Group_Name);
// FRIEND_ID
insertInfo.push_back(FRIEND_ID);
//FRIEND_ACCOUNT
insertInfo.push_back(FRIEND_ACCOUNT);
// FRIEND_NICKNAME
insertInfo.push_back(FRIEND_NICKNAME);
// -------------------------解析内容----------------------
std::wstring tempsavefile = L"\\msg_files";
tempsavefile += L"\\";
tempsavefile += ACCOUNT;
tempsavefile += L"_";
tempsavefile += ID;
std::vector<std::wstring> analysis_res;
std::vector<std::wstring> nullanalysis_res(10, L"");
using json = nlohmann::json;
if (json::accept(content)) {
analysis_res = analyszeContent(content, savefilepath + tempsavefile);
}
else {
analysis_res.assign(nullanalysis_res.begin(), nullanalysis_res.end());
}
// 返回形式为:{0:CONTENT, 1:RH_TEXT_MSG, 2:FILE_PATH, 3:MEDIA_TYPE, 4:CITY_CODE, 5:COMPANY_ADDRESS, 6:LONGITUDE, 7:LATITUDE, 8:DUAL_TIME, 9:RH_MSG_TYPE}
//for (auto& it : analysis_res) {
// printWstring(it);
//}
std::wstring CONTENT = L"";
std::wstring FILE_PATH = L"";
// CONTENT
CONTENT = analysis_res[0];
if (analysis_res[9] == L"02") {
CONTENT = tempsavefile + analysis_res[2];
}
// FILE_PATH
if (analysis_res[9] == L"02" || analysis_res[9] == L"05") {
FILE_PATH = tempsavefile + analysis_res[2];
}
insertInfo.push_back(CONTENT);
insertInfo.push_back(analysis_res[1]);
insertInfo.push_back(FILE_PATH);
// MAIL_SEND_TIME
insertInfo.push_back(MAIL_SEND_TIME);
// LOCAL_ACTION
std::wstring LOCAL_ACTION = (WStringToString(FRIEND_ACCOUNT) == pair.first) ? L"02" : L"01";
insertInfo.push_back(LOCAL_ACTION);
// TALK_ID
insertInfo.push_back(TALK_ID);
insertInfo.push_back(analysis_res[3]);
//CITY_CODE, COMPANY_ADDRESS, LONGITUDE, LATITUDE, DUAL_TIME, RH_MSG_TYPE
insertInfo.push_back(analysis_res[4]);
insertInfo.push_back(analysis_res[5]);
insertInfo.push_back(analysis_res[6]);
insertInfo.push_back(analysis_res[7]);
insertInfo.push_back(analysis_res[8]);
insertInfo.push_back(analysis_res[9]);
// 插入的 SQL 语句
sql.clear();
sql += L"insert into T_IM_GROUP_MSG (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, GROUP_NAME, FRIEND_ID, FRIEND_ACCOUNT, FRIEND_NICKNAME, CONTENT, RH_TEXT_MSG, FILE_PATH, MAIL_SEND_TIME, LOCAL_ACTION, TALK_ID, MEDIA_TYPE, CITY_CODE, COMPANY_ADDRESS, LONGITUDE, LATITUDE, DUAL_TIME, RH_MSG_TYPE) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
int insertres = insertSingleInfo(savedbpath, sql, insertInfo);
/*if (insertres != 1) {
std::cout << "Insert Error Code = " << insertres << std::endl;
return -5;
}*/
content.clear();
insertInfo.clear();
}
sqlite3_finalize(stmt_select_msg);
}
sqlite3_finalize(stmt_select_conid);
sqlite3_close(originptrdb);
}
sqlite3_close(saveptrdb);
return 1;
}
/*
* 参数:数据库路径及ID对应表
* 作者:龙向洋
* 说明:写入信息表(T_IM_CONTACT_MSG)的信息:
* * (1)账号基础信息 :ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, REGIS_NICKNAME,
* * (2)聊天人信息 :FRIEND_ID, FRIEND_ACCOUNT, FRIEND_NICKNAME,
* * (3)聊天内容 :CONTENT, RH_TEXT_MSG, FILE_PATH, MAIL_SEND_TIME, LOCAL_ACTION
* 需要解析出聊天内容,(1)和(2)都容易读到
*/
int writeT_IM_CONTACT_MSG(std::wstring origindbpath, std::wstring savedbpath, std::wstring savefilepath, const std::unordered_map<std::string, std::string>& idpairs) {
// 聊天人信息:“数字_im.db” 库的 participant 表中,读取到一个列表,因为当前联系人可能跟很多人聊天,根据 conversation_id 读取某个聊天的所有上下文信息
// 聊天内容比较复杂:
// (1)解析json文件,当前内容的类型:文本、语音通话等
// (2)读取聊天内容要排序根据: index_in_conversation_v2
// (3)判断发送方、接收方
std::string logstr = "Start write: T_IM_CONTACT_MSG";
log((char*)"INFO", (char*)(logstr).c_str(), (char*)"");
// 获取主控数据库连接
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr.clear();
logstr = "Fail to connect MainDB when write T_IM_CONTACT_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -1;
}
// 清空
std::wstring sql = L"";
sql.clear();
sql += L"delete from T_IM_CONTACT_MSG where TOTAL_NAME = 'T_DouYin_TOTAL';";
m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
sql.clear();
// 行ID
int count = 0;
// 获取包括本账号的会话人,以字典存放会话人的账号以及当前会话id
std::unordered_map<std::string, std::string> account_conversation;
for (auto& pair : idpairs) {
if (pair.first.empty()) {
continue;
}
// 读取 participant 表,先建立连接
std::wstring participantdbpath = origindbpath;
participantdbpath += L"\\";
participantdbpath += stringToWstring(pair.first);
participantdbpath += L"_im.db";
sqlite3* participantdb = nullptr;
int participantDBIsExist = m_sqlite3_open(participantdbpath, &participantdb);
if (SQLITE_OK != participantDBIsExist) {
logstr.clear();
logstr = "Fail to connect _imDB when write T_IM_CONTACT_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -2;
}
// 读取 会话聊天人的id 以及 当前会话id
sql.clear();
sql += L"SELECT user_id, conversation_id FROM participant WHERE (conversation_id like'0:1:%');";
sqlite3_stmt* stmt_select_participant = nullptr;
int prepareparticipant = m_sqlite3_prepare_v2(participantdb, sql, -1, &stmt_select_participant, nullptr);
if (SQLITE_OK != prepareparticipant) {
sqlite3_finalize(stmt_select_participant);
logstr.clear();
logstr = "Fail to select participant when write T_IM_CONTACT_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -3;
}
// 当前用户可能与多个人聊天,所以可能存在多个行记录
while (sqlite3_step(stmt_select_participant) == SQLITE_ROW) {
std::string account((const char*)sqlite3_column_text(stmt_select_participant, 0));
std::string account_conversation_id((const char*)sqlite3_column_text(stmt_select_participant, 1));
if (account_conversation.find(account) == account_conversation.end()) {
account_conversation.emplace(account, account_conversation_id);
}
}
// std::cout << "调试account_conversation 大小 = " << account_conversation.size() << std::endl;
sqlite3_finalize(stmt_select_participant);
sqlite3_close(participantdb);
// 读取账号的 ACCOUNT_ID, ACCOUNT, REGIS_NICKNAME,存放形式为:字典
// 字典的key为: ACCOUNT
// 字典的val为: 数组 [ACCOUNT_ID, REGIS_NICKNAME],后面根据索引读值
std::unordered_map<std::string, std::vector<std::string>> accountinfo;
// 读取表,先建立连接
std::wstring accountdbpath = origindbpath;
accountdbpath += L"\\im_biz_";
accountdbpath += stringToWstring(pair.first);
accountdbpath += L".db";
sqlite3* accountdb = nullptr;
int accountDBIsExist = m_sqlite3_open(accountdbpath, &accountdb);
if (SQLITE_OK != accountDBIsExist) {
logstr.clear();
logstr = "Fail to connect im_bizDB when write T_IM_CONTACT_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -4;
}
for (auto& acc : account_conversation) {
// 读取 会话聊天人的id 以及 当前会话id
sql.clear();
sql += L"SELECT UNIQUE_ID, NICK_NAME FROM SIMPLE_USER where UID = ?;";
sqlite3_stmt* stmt_select_account = nullptr;
int prepareaccount = m_sqlite3_prepare_v2(accountdb, sql, -1, &stmt_select_account, nullptr);
if (SQLITE_OK != prepareaccount) {
sqlite3_finalize(stmt_select_account);
logstr.clear();
logstr = "Fail to select SIMPLE_USER when write T_IM_CONTACT_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -5;
}
sqlite3_bind_text(stmt_select_account, 1, acc.first.c_str(), strlen(acc.first.c_str()), nullptr);
if (sqlite3_step(stmt_select_account) == SQLITE_ROW) {
std::string UNIQUE_ID((const char*)sqlite3_column_text(stmt_select_account, 0));
std::string NICK_NAME((const char*)sqlite3_column_text(stmt_select_account, 1));
// 有的账号并没有UNIQUE_ID,这里就是空的
if (UNIQUE_ID.empty()) {
UNIQUE_ID = "info: UNIQUE_ID is empty!";
}
if (NICK_NAME.empty()) {
NICK_NAME = "info: NICK_NAME is empty!";
}
auto accountval = { UNIQUE_ID, NICK_NAME };
accountinfo.emplace(acc.first, accountval);
}
sqlite3_finalize(stmt_select_account);
}
sqlite3_close(accountdb);
// std::cout << "调试accountinfo 大小 = " << accountinfo.size() << "////" << std::endl;
// 根据会话id读取msg表,要以聊天记录的时间排序读取,方便还原聊天页面
// participantdbpath与msg在同一个库,所有沿用地址
sqlite3* msgdb = nullptr;
int msgDBIsExist = m_sqlite3_open(participantdbpath, &msgdb);
if (SQLITE_OK != msgDBIsExist) {
logstr.clear();
logstr = "Fail to connect msg when write T_IM_CONTACT_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -6;
}
// 当前账号有多个聊天会话
for (auto& it : account_conversation) {
// 读取msg表的:msg_uuid, created_time, sender, content
sql.clear();
sql += L"SELECT msg_uuid, created_time, sender, content FROM msg WHERE conversation_id = ? ORDER BY index_in_conversation_v2;";
sqlite3_stmt* stmt_select_msg = nullptr;
int preparemsg = m_sqlite3_prepare_v2(msgdb, sql, -1, &stmt_select_msg, nullptr);
if (SQLITE_OK != preparemsg) {
sqlite3_finalize(stmt_select_msg);
logstr.clear();
logstr = "Fail to select msg when write T_IM_CONTACT_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -7;
}
if (it.first.empty()) {
continue;
}
// 不需要读本账号的会话id
if (it.first == pair.first) {
continue;
}
// std::cout << "调试会话id = " << it.second << std::endl;
sqlite3_bind_text(stmt_select_msg, 1, it.second.c_str(), strlen(it.second.c_str()), nullptr);
// 开始逐行读取,并存入T_IM_CONTACT_MSG
// T_IM_CONTACT_MSG表的连接为 saveptrdb ,已经建立
sqlite3_stmt* stmt_insert = nullptr;
sql.clear();
sql += L"insert into T_IM_CONTACT_MSG (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT_ID, ACCOUNT, REGIS_NICKNAME, FRIEND_ID, FRIEND_ACCOUNT, FRIEND_NICKNAME, CONTENT, RH_TEXT_MSG, FILE_PATH, MAIL_SEND_TIME, LOCAL_ACTION, TALK_ID, MEDIA_TYPE, CITY_CODE, COMPANY_ADDRESS, LONGITUDE, LATITUDE, DUAL_TIME, RH_MSG_TYPE) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
while (sqlite3_step(stmt_select_msg) == SQLITE_ROW) {
std::string msg_uuid((const char*)sqlite3_column_text(stmt_select_msg, 0));
std::string created_time((const char*)sqlite3_column_text(stmt_select_msg, 1));
std::string sender((const char*)sqlite3_column_text(stmt_select_msg, 2));
std::string content((const char*)sqlite3_column_text(stmt_select_msg, 3));
// 将读取到的信息填入 T_IM_CONTACT_MSG
count++;
int retinsert = m_sqlite3_prepare_v2(saveptrdb, sql, -1, &stmt_insert, nullptr);
if (retinsert != SQLITE_OK) {
sqlite3_finalize(stmt_insert);
logstr.clear();
logstr = "Fail to insert T_IM_CONTACT_MSG";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -8;
}
// 存放插入内容
std::vector<std::wstring> insertInfo;
// ID
std::wstring ID = std::to_wstring(count);
insertInfo.push_back(ID);
// PROFILE_ID
std::wstring PROFILE_ID = stringToWstring(pair.second);
insertInfo.push_back(PROFILE_ID);
// APP_NAME
std::wstring APP_NAME = L"抖音";
insertInfo.push_back(APP_NAME);
// TOTAL_NAME
std::wstring TOTAL_NAME = L"T_DouYin_TOTAL";
insertInfo.push_back(TOTAL_NAME);
// ACCOUNT_ID
std::wstring ACCOUNT_ID = stringToWstring(accountinfo[pair.first][0]);
insertInfo.push_back(ACCOUNT_ID);
// ACCOUNT
std::wstring ACCOUNT = stringToWstring(pair.first);
insertInfo.push_back(ACCOUNT);
// REGIS_NICKNAME
std::wstring REGIS_NICKNAME = stringToWstring(accountinfo[pair.first][1]);
insertInfo.push_back(REGIS_NICKNAME);
// FRIEND_ID
std::wstring FRIEND_ID = stringToWstring(accountinfo[it.first][0]);
insertInfo.push_back(FRIEND_ID);
//FRIEND_ACCOUNT
std::wstring FRIEND_ACCOUNT = stringToWstring(it.first);
insertInfo.push_back(FRIEND_ACCOUNT);
// FRIEND_NICKNAME
std::wstring FRIEND_NICKNAME = stringToWstring(accountinfo[it.first][1]);
insertInfo.push_back(FRIEND_NICKNAME);
// -------------------------解析内容----------------------
std::wstring tempsavefile = L"\\msg_files";
tempsavefile += L"\\";
tempsavefile += ACCOUNT;
tempsavefile += L"_";
tempsavefile += ID;
std::vector<std::wstring> analysis_res;
std::vector<std::wstring> nullanalysis_res(10, L"");
using json = nlohmann::json;
if (json::accept(content)) {
analysis_res = analyszeContent(content, savefilepath + tempsavefile);
}
else {
analysis_res.assign(nullanalysis_res.begin(), nullanalysis_res.end());
}
// 返回形式为:{0:CONTENT, 1:RH_TEXT_MSG, 2:FILE_PATH, 3:MEDIA_TYPE, 4:CITY_CODE, 5:COMPANY_ADDRESS, 6:LONGITUDE, 7:LATITUDE, 8:DUAL_TIME, 9:RH_MSG_TYPE}
std::wstring CONTENT = L"";
std::wstring FILE_PATH = L"";
// CONTENT
CONTENT = analysis_res[0];
if (analysis_res[9] == L"02") {
CONTENT = tempsavefile + analysis_res[2];
}
// FILE_PATH
if (analysis_res[9] == L"02" || analysis_res[9] == L"05") {
FILE_PATH = tempsavefile + analysis_res[2];
}
insertInfo.push_back(CONTENT);
insertInfo.push_back(analysis_res[1]);
insertInfo.push_back(FILE_PATH);
// MAIL_SEND_TIME
std::wstring MAIL_SEND_TIME = stringToWstring(created_time);
insertInfo.push_back(MAIL_SEND_TIME);
// LOCAL_ACTION
std::wstring LOCAL_ACTION = (sender == pair.first) ? L"02" : L"01";
insertInfo.push_back(LOCAL_ACTION);
// TALK_ID
std::wstring TALK_ID = stringToWstring(msg_uuid);
insertInfo.push_back(TALK_ID);
insertInfo.push_back(analysis_res[3]);
//CITY_CODE, COMPANY_ADDRESS, LONGITUDE, LATITUDE, DUAL_TIME, RH_MSG_TYPE
insertInfo.push_back(analysis_res[4]);
insertInfo.push_back(analysis_res[5]);
insertInfo.push_back(analysis_res[6]);
insertInfo.push_back(analysis_res[7]);
insertInfo.push_back(analysis_res[8]);
insertInfo.push_back(analysis_res[9]);
int len = insertInfo.size();
for (int i(0); i < len; i++) {
m_sqlite3_bind_text(stmt_insert, i + 1, insertInfo[i], -1, nullptr);
}
content.clear();
insertInfo.clear();
sqlite3_step(stmt_insert);
sqlite3_reset(stmt_insert);
}
sqlite3_finalize(stmt_insert);
sqlite3_finalize(stmt_select_msg);
}
sqlite3_close(msgdb);
// 本次遍历最后的操作:下一个账号,清空这两个字典
account_conversation.clear();
accountinfo.clear();
}
return 1;
}
/*
* 参数:主控数据库路径,ID对应表
* 作者:龙向洋
* 说明:写入TOTAL表和TOTAL_SQL表,这里只需要连接主控数据库即可,读写都在主库的各个表里
*/
int writeTOTALandTOTAL_SQL(std::wstring savedbpath, const std::unordered_map<std::string, std::string>& idpairs) {
std::string logstr = "Start write: two TOTAL TABLEs";
log((char*)"INFO", (char*)(logstr).c_str(), (char*)"");
// 获取主控数据库连接
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr.clear();
logstr = "Fail to connect MainDB when write two TOTAL TABLEs";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -1;
}
// 清空 T_DouYin_TOTAL
std::wstring sql = L"";
sql.clear();
sql += L"DELETE FROM T_DouYin_TOTAL;";
int delTOTAL = m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
if (delTOTAL != SQLITE_OK) {
logstr.clear();
logstr = "Fail to delete T_DouYin_TOTAL when write two TOTAL TABLEs";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -2;
}
sql.clear();
// 清空 T_DouYin_TOTAL_SQL
sql.clear();
sql += L"DELETE FROM T_DouYin_TOTAL_SQL ;";
int delTOTAL_SQL = m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
if (delTOTAL_SQL != SQLITE_OK) {
logstr.clear();
logstr = "Fail to delete T_DouYin_TOTAL_SQL when write two TOTAL TABLEs";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -3;
}
sql.clear();
sqlite3_close(saveptrdb);
// 定义一个自增的count,可以充当两个TOTAL表的ID字段,TOTAL表的行数据表示主控某个节点,该节点的具体信息通过TOTAL_SQL表对应的行读出
// 只要对表有插入操作,就应该自增
int count = 0;
/*
* 各个节点的_id标识为:"id_节点名",下一级子节点的fatherID标识为:"son_节点名",节点信息数目标识为:"c_节点名"
*
* 抖音(数目) douyinNode [c_douyinNode]
* * 账号ID(昵称)(数目) accountNicknameNode, [c_accountNicknameNode] saved
* * 账号信息(数目) accountInfoNode (type = 1) [c_accountInfoNode] saved
* * 联系人列表(数目) contactInfoNode [c_contactInfoNode] saved
* * 关注 followNode (type = 1) [c_followNode] saved
* * 粉丝 fanNode (type = 1) [c_fanNode] saved
* * 群组列表(数目) groupListNode (type = 1) [c_groupListNode] saved
* * 聊天记录(数目) msgNode [c_msgNode] saved
* * 好友聊天记录 contactMsgNode [c_contactMsgNode] saved
* * 好友1 msgaccountNode (type = 1) saved
* * 好友2 msgaccountNode (type = 1) saved
* * ... saved
* * 群聊天记录 groupMsgNode [c_groupMsgNode] saved
* * 群聊1 groupNode (type = 1) saved
* * 群聊2 groupNode (type = 1) saved
* * ... saved
* * 搜索记录(数目) searchInfoNode (type = 1) [c_searchInfoNode]
*/
// 每次同时对TOTAL表和TOTAL_SQL表进行插入,分两步
// 1. INSERT INTO T_DouYin_TOTAL
// 2. INSERT INTO T_DouYin_TOTAL_SQL
// T_DouYin_TOTAL 的数据插入格式如下,采用数组
// 0:_id, 1:fatherID, 2:treeName, 3:Count, 4:sonTableName, 5:subGroupID, 6:Icon, 7:profileID, 8:State, :9:Type, 10:Session, 11:previewType
std::vector<std::wstring> insertinfo(12, L"");
std::vector<std::wstring> nullinfo(12, L"");
// T_DouYin_TOTAL_SQL 的数据插入格式如下,采用数组
// 0:_id(与Total表对应),1:sqlstr,2:TableName,3:HtmlSqlstr,4:Rows,5:SimuSql
std::vector<std::wstring> sqlinsertinfo(6, L"");
std::vector<std::wstring> nullsqlinsertinfo(6, L"");
// 【节点】:抖音(数目) douyinNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_douyinNode = ++count;
int son_douyinNode = id_douyinNode;
insertinfo[0] = std::to_wstring(id_douyinNode);
insertinfo[1] = L"0";
insertinfo[2] = L"抖音";
insertinfo[3] = L"0";
insertinfo[4] = L"T_DouYin_TOTAL";
insertinfo[6] = L"DouYin";
insertinfo[8] = L"0";
insertinfo[9] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
// 2. INSERT INTO T_DouYin_TOTAL_SQL
std::wstring sqlstr = L"SELECT _id,treeName||'('||count||')' As treename From T_DouYin_TOTAL where fatherid = 1;";
sqlinsertinfo[0] = std::to_wstring(id_douyinNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_DouYin_TOTAL";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// --------------
int c_followNode = 0;
int c_fanNode = 0;
int c_contactMsgNode = 0;
int c_groupMsgNode = 0;
int c_contactInfoNode = 0;
int c_groupListNode = 0;
int c_msgNode = 0;
int c_accountInfoNode = 1;
int c_searchInfoNode = 0;
int c_accountNicknameNode = 0;
int c_douyinNode = 0;
for (auto &acc: idpairs) {
// 【节点】:账号ID(昵称)(数目) accountNicknameNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_accountNicknameNode = ++count;
int son_accountNicknameNode = id_accountNicknameNode;
std::wstring treename = stringToWstring(acc.first);
treename += L"(";
treename += getNickname(savedbpath, acc.first);
treename += L")";
insertinfo[0] = std::to_wstring(id_accountNicknameNode);
insertinfo[1] = std::to_wstring(son_douyinNode);
insertinfo[2] = treename;
insertinfo[4] = L"T_DouYin_TOTAL";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"SELECT _id,treeName||'('||count||')' As treename From T_DouYin_TOTAL where fatherid = ";
sqlstr += std::to_wstring(son_accountNicknameNode);
sqlstr += L";";
sqlinsertinfo[0] = std::to_wstring(id_accountNicknameNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_DouYin_TOTAL";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 【节点】:账号信息(数目) accountInfoNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_accountInfoNode = ++count;
int son_accountInfoNode = id_accountInfoNode;
insertinfo[0] = std::to_wstring(id_accountInfoNode);
insertinfo[1] = std::to_wstring(son_accountNicknameNode);
insertinfo[2] = L"账号信息";
insertinfo[3] = L"1";
insertinfo[4] = L"T_WEB_ACCOUNT";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"1";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr += L"select ACCOUNT_ID as '用户id',ACCOUNT as '账号',REGIS_NICKNAME as '昵称',SIGN_NAME as '个人说明',case LATEST_MOD_TIME when 0 then '' else datetime(LATEST_MOD_TIME/1000, 'unixepoch', 'localtime') end as '最后更新时间',FIXED_PHONE as '电话号码',USER_PHOTO as '头像',case SEXCODE when 1 then '男性' when 2 then '女性' else '未知' end as SEXCODE,REG_CITY as '城市',GRADUATESCHOOL as '毕业学校' ,BIRTHDAY as '生日' from T_WEB_ACCOUNT where ACCOUNT = ";
sqlstr += stringToWstring(acc.first);
sqlstr += L";";
sqlinsertinfo[0] = std::to_wstring(id_accountInfoNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_WEB_ACCOUNT";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"1";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 【节点】:联系人列表(数目) contactInfoNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_contactInfoNode = ++count;
int son_contactInfoNode = id_contactInfoNode;
insertinfo[0] = std::to_wstring(id_contactInfoNode);
insertinfo[1] = std::to_wstring(son_accountNicknameNode);
insertinfo[2] = L"联系人列表";
insertinfo[4] = L"T_DouYin_TOTAL";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"SELECT _id,treeName||'('||count||')' As treename From T_DouYin_TOTAL where fatherid = ";
sqlstr += std::to_wstring(son_contactInfoNode);
sqlstr += L";";
sqlinsertinfo[0] = std::to_wstring(id_contactInfoNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_DouYin_TOTAL";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 【节点】:关注 followNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_followNode = ++count;
int son_followNode = id_followNode;
insertinfo[0] = std::to_wstring(id_followNode);
insertinfo[1] = std::to_wstring(son_contactInfoNode);
insertinfo[2] = L"关注";
insertinfo[4] = L"T_IM_CONTACT";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"1";
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr += L"select FRIEND_ID,FRIEND_ACCOUNT,FRIEND_NICKNAME,SIGN_NAME,case LATEST_MOD_TIME when 0 then '' else datetime(LATEST_MOD_TIME/1000, 'unixepoch', 'localtime') end as LATEST_MOD_TIME,USER_PHOTO from T_IM_CONTACT as tbl2 where ACCOUNT = '";
sqlstr += stringToWstring(acc.first);
sqlstr += L"' and (RH_FRIEND_TYPE = 1 or RH_FRIEND_TYPE = 2); ";
sqlinsertinfo[0] = std::to_wstring(id_followNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_IM_CONTACT";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
// 获取 c_followNode
c_followNode = getSQLRowsCount(savedbpath, sqlstr);
if (c_followNode >= 0) {
insertinfo[3] = std::to_wstring(c_followNode);
}
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 【节点】:粉丝 fanNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_fanNode = ++count;
int son_fanNode = id_fanNode;
insertinfo[0] = std::to_wstring(id_fanNode);
insertinfo[1] = std::to_wstring(son_contactInfoNode);
insertinfo[2] = L"粉丝";
insertinfo[4] = L"T_IM_CONTACT";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"1";
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr += L"select FRIEND_ID,FRIEND_ACCOUNT,FRIEND_NICKNAME,SIGN_NAME,case LATEST_MOD_TIME when 0 then '' else datetime(LATEST_MOD_TIME/1000, 'unixepoch', 'localtime') end as LATEST_MOD_TIME,USER_PHOTO from T_IM_CONTACT as tbl2 where ACCOUNT = '";
sqlstr += stringToWstring(acc.first);
sqlstr += L"' and (RH_FRIEND_TYPE = 0 or RH_FRIEND_TYPE = 2); ";
sqlinsertinfo[0] = std::to_wstring(id_fanNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_IM_CONTACT";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
// 获取 c_followNode
c_fanNode = getSQLRowsCount(savedbpath, sqlstr);
if (c_fanNode >= 0) {
insertinfo[3] = std::to_wstring(c_fanNode);
}
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 更新 c_contactInfoNode
c_contactInfoNode = c_followNode + c_fanNode;
int update_c_contactInfoNode = updateSingleInfo(savedbpath, id_contactInfoNode, c_contactInfoNode);
// 【节点】:群组列表(数目) groupListNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_groupListNode = ++count;
int son_groupListNode = id_groupListNode;
insertinfo[0] = std::to_wstring(id_groupListNode);
insertinfo[1] = std::to_wstring(son_accountNicknameNode);
insertinfo[2] = L"群组列表";
insertinfo[4] = L"T_IM_GROUP";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"1";
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"SELECT GROUP_NUM as '群号', GROUP_NAME as '群名称', GROUP_MEMBER_COUNT as '群人数', GROUPPHOTO as '群头像' FROM T_IM_GROUP as tbl2 WHERE ACCOUNT = '";
sqlstr += stringToWstring(acc.first);
sqlstr += L"';";
sqlinsertinfo[0] = std::to_wstring(id_groupListNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_IM_GROUP";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
// 获取 c_groupListNode
c_groupListNode = getSQLRowsCount(savedbpath, sqlstr);
if (c_groupListNode >= 0) {
insertinfo[3] = std::to_wstring(c_groupListNode);
}
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 【节点】:聊天记录(数目) msgNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_msgNode = ++count;
int son_msgNode = id_msgNode;
insertinfo[0] = std::to_wstring(id_msgNode);
insertinfo[1] = std::to_wstring(son_accountNicknameNode);
insertinfo[2] = L"聊天记录";
insertinfo[4] = L"T_DouYin_TOTAL";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"SELECT _id,treeName||'('||count||')' As treename From T_DouYin_TOTAL where fatherid = ";
sqlstr += std::to_wstring(son_msgNode);
sqlstr += L";";
sqlinsertinfo[0] = std::to_wstring(id_msgNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_DouYin_TOTAL";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 【节点】:好友聊天记录 contactMsgNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_contactMsgNode = ++count;
int son_contactMsgNode = id_contactMsgNode;
insertinfo[0] = std::to_wstring(id_contactMsgNode);
insertinfo[1] = std::to_wstring(son_msgNode);
insertinfo[2] = L"好友聊天记录";
insertinfo[4] = L"T_IM_CONTACT_MSG";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"0";
insertinfo[10] = L"1";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"SELECT _id,treeName||'('||count||')' As treename From T_DouYin_TOTAL where fatherid = ";
sqlstr += std::to_wstring(son_contactMsgNode);
sqlstr += L";";
sqlinsertinfo[0] = std::to_wstring(id_contactMsgNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_DouYin_TOTAL";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 这里要进一步显示聊天的对象
// 获取当前账号下,聊天对象的账号及昵称
sql.clear();
sql += L"SELECT DISTINCT FRIEND_ACCOUNT FROM T_IM_CONTACT_MSG WHERE ACCOUNT = '";
sql += stringToWstring(acc.first);
sql += L"';";
auto msgaccount = getSingleInfo(savedbpath, sql);
int c_msgaccountNode = 0;
for (std::wstring it : msgaccount) {
// 【节点】:聊天账号(昵称)(数目) msgaccountNode
// 1. INSERT INTO T_DouYin_TOTAL
// 获取昵称
int id_msgaccount = ++count;
int son_msgaccount = id_msgaccount;
// 拼接节点名
std::wstring trname = it;
trname += L"(";
trname += getNickname(savedbpath, WStringToString(it), false);
trname += L")";
insertinfo[0] = std::to_wstring(id_msgaccount);
insertinfo[1] = std::to_wstring(son_contactMsgNode);
insertinfo[2] = trname;
insertinfo[4] = L"T_IM_CONTACT_MSG";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"1";
insertinfo[10] = L"2";
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"select case LOCAL_ACTION when '01' then FRIEND_ACCOUNT when '02' then ACCOUNT end ||'('|| case LOCAL_ACTION when '01' then FRIEND_NICKNAME when '02' then REGIS_NICKNAME end ||')' as '发送者账号(发送者昵称)', case LOCAL_ACTION when '02' then FRIEND_ID when '01' then ACCOUNT_ID end ||'('|| case LOCAL_ACTION when '02' then FRIEND_NICKNAME when '01' then REGIS_NICKNAME end ||')' as '接收者账号(接收者昵称)', CONTENT,FILE_PATH,case rh_msg_type when '01' then '文本' when '02' then '图片' when '03' then '语音' when '04' then '视频' when '05' then '位置' when '07' then '名片' when '08' then '文件' when '09' then '组合' when '11' then '转账' when '12' then '收钱' when '13' then '红包' else '其他' end as MEDIA_TYPE,datetime(round(MAIL_SEND_TIME/1000), 'unixepoch', 'localtime') as MAIL_SEND_TIME ,case DELETE_STATUS when '0' then '未删除' when '1' then '已删除' end as DELETE_STATUS from T_IM_CONTACT_MSG as tbl2 where ACCOUNT = '";
sqlstr += stringToWstring(acc.first);
sqlstr += L"' and FRIEND_ACCOUNT = '";
sqlstr += it;
sqlstr += L"';";
//sqlstr += L"order by MAIL_SEND_TIME; ";
std::wstring simusql = L"select case LOCAL_ACTION when '01' then FRIEND_ACCOUNT when '02' then ACCOUNT end ||'('|| case LOCAL_ACTION when '01' then FRIEND_NICKNAME when '02' then REGIS_NICKNAME end ||')' as 'SENDER_ID(SENDER_NAME)',case RH_MSG_TYPE when '14' then '99' when '16' then '99' else LOCAL_ACTION end as LOCAL_ACTION,CONTENT,FILE_PATH,datetime(MAIL_SEND_TIME,'unixepoch', 'localtime') as MAIL_SEND_TIME ,RH_MSG_TYPE,DELETE_STATUS from T_IM_CONTACT_MSG as tbl2 where ACCOUNT = '";
simusql += stringToWstring(acc.first);
simusql += L"' and FRIEND_ACCOUNT = '";
simusql += it;
simusql += L"';";
sqlinsertinfo[0] = std::to_wstring(id_msgaccount);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_IM_CONTACT_MSG";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[5] = simusql;
// 获取 c_msgaccountNode
c_msgaccountNode = getSQLRowsCount(savedbpath, sqlstr);
if (c_msgaccountNode >= 0) {
insertinfo[3] = std::to_wstring(c_msgaccountNode);
sqlinsertinfo[4] = std::to_wstring(c_msgaccountNode);
c_contactMsgNode += c_msgaccountNode;
}
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows, SimuSql) values (?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
}
msgaccount.clear();
int update_c_contactMsgNode = updateSingleInfo(savedbpath, id_contactMsgNode, c_contactMsgNode);
// 【节点】:群聊天记录 groupMsgNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_groupMsgNode = ++count;
int son_groupMsgNode = id_groupMsgNode;
insertinfo[0] = std::to_wstring(id_groupMsgNode);
insertinfo[1] = std::to_wstring(son_msgNode);
insertinfo[2] = L"群聊天记录";
insertinfo[4] = L"T_IM_GROUP_MSG";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"SELECT _id,treeName||'('||count||')' As treename From T_DouYin_TOTAL where fatherid = ";
sqlstr += std::to_wstring(son_groupMsgNode);
sqlstr += L";";
sqlinsertinfo[0] = std::to_wstring(id_groupMsgNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_DouYin_TOTAL";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
// 这里要进一步显示群聊
// 获取当前账号下,群聊的昵称
sql.clear();
sql += L"SELECT DISTINCT GROUP_NAME FROM T_IM_GROUP_MSG WHERE ACCOUNT = '";
sql += stringToWstring(acc.first);
sql += L"';";
auto groupTalk = getSingleInfo(savedbpath, sql);
int c_grouptalk = 0;
for (std::wstring& group : groupTalk) {
// 【节点】:群名(数目) group
// 1. INSERT INTO T_DouYin_TOTAL
int id_group = ++count;
std::wstring trname = group;
insertinfo[0] = std::to_wstring(id_group);
insertinfo[1] = std::to_wstring(son_groupMsgNode);
insertinfo[2] = trname;
insertinfo[4] = L"T_IM_GROUP_MSG";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"1";
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"select FRIEND_ACCOUNT ||'('||FRIEND_NICKNAME||')' as '发送者账号(发送者昵称)', CONTENT,FILE_PATH,case rh_msg_type when '01' then '文本' when '02' then '图片' when '03' then '语音' when '04' then '视频' when '05' then '位置' when '07' then '名片' when '08' then '文件' when '09' then '组合' when '11' then '转账' when '12' then '收钱' when '13' then '红包' else '其他' end as MEDIA_TYPE,datetime(round(MAIL_SEND_TIME / 1000), 'unixepoch', 'localtime') as MAIL_SEND_TIME ,case DELETE_STATUS when '0' then '未删除' when '1' then '已删除' end as DELETE_STATUS from T_IM_GROUP_MSG as tbl2 where ACCOUNT = '";
sqlstr += stringToWstring(acc.first);
sqlstr += L"' and GROUP_NAME = '";
sqlstr += group;
sqlstr += L"';";
//sqlstr += L"order by MAIL_SEND_TIME; ";
sqlinsertinfo[0] = std::to_wstring(id_group);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"T_IM_GROUP_MSG";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
//sqlinsertinfo[5] = sqlstr;
// 获取 c_grouptalk
c_grouptalk = getSQLRowsCount(savedbpath, sqlstr);
if (c_grouptalk >= 0) {
insertinfo[3] = std::to_wstring(c_grouptalk);
c_groupMsgNode += c_grouptalk;
}
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
}
groupTalk.clear();
int update_c_groupMsgNode = updateSingleInfo(savedbpath, id_groupMsgNode, c_groupMsgNode);
// 更新 c_msgNode
c_msgNode = c_contactMsgNode + c_groupMsgNode;
int update_c_msgNode = updateSingleInfo(savedbpath, id_msgNode, c_msgNode);
// 【节点】:搜索记录(数目) searchInfoNode
// 1. INSERT INTO T_DouYin_TOTAL
int id_searchInfoNode = ++count;
int son_searchInfoNode = id_searchInfoNode;
insertinfo[0] = std::to_wstring(id_searchInfoNode);
insertinfo[1] = std::to_wstring(son_accountNicknameNode);
insertinfo[2] = L"搜索记录";
insertinfo[4] = L"T_WEB_SEARCH";
insertinfo[6] = L"DouYin";
insertinfo[7] = std::wstring(stringToWstring(acc.second));
insertinfo[8] = L"0";
insertinfo[9] = L"1";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL (_id, fatherID, treeName, Count, sonTableName, subGroupID, Icon, profileID, State, Type, Session, previewType) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, insertinfo);
insertinfo.assign(nullinfo.begin(), nullinfo.end());
// 2. INSERT INTO T_DouYin_TOTAL_SQL
sqlstr.clear();
sqlstr = L"xxxxxx 搜索记录未解析 xxxxxx";
sqlinsertinfo[0] = std::to_wstring(id_searchInfoNode);
sqlinsertinfo[1] = sqlstr;
sqlinsertinfo[2] = L"xxxx表";
sqlinsertinfo[3] = sqlstr;
sqlinsertinfo[4] = L"0";
sql.clear();
sql += L"INSERT INTO T_DouYin_TOTAL_SQL (_id, sqlstr, TableName, HtmlSqlstr, Rows) values (?, ?, ?, ?, ?);";
insertSingleInfo(savedbpath, sql, sqlinsertinfo);
sqlinsertinfo.assign(nullsqlinsertinfo.begin(), nullsqlinsertinfo.end());
c_searchInfoNode = 0;
int update_c_searchInfoNode = updateSingleInfo(savedbpath, id_searchInfoNode, c_searchInfoNode);
// 更新当前账号的信息数
c_accountNicknameNode = c_accountInfoNode + c_contactInfoNode + c_groupListNode + c_msgNode + c_searchInfoNode;
int update_c_accountNicknameNode = updateSingleInfo(savedbpath, id_accountNicknameNode, c_accountNicknameNode);
c_douyinNode += c_accountNicknameNode;
}
// 更新总的信息数目
int update_c_c_douyinNode = updateSingleInfo(savedbpath, 1, c_douyinNode);
sql.clear();
sql = L"INSERT into T_APP_CLASSIFY (AppCheckID, AppClassID, AppClassName_CN, AppClassName_EN, AppNameID, AppName, TotalName, Count) values (266, 10010, '娱乐互动', 'EachOnePlay', 1, '抖音', 'T_DouYin_TOTAL', ";
sql += std::to_wstring(c_douyinNode);
sql += L");";
int r_appclassify = insertSingleInfo(savedbpath, sql, sqlinsertinfo);
// 其他操作
return c_douyinNode;
}
/*
* 参数:主控数据库路径、SQL
* 作者:龙向洋
* 说明:从某个表中读取某项数据
*/
std::vector<std::wstring> getSingleInfo(std::wstring savedbpath, std::wstring sql) {
std::string logstr;
std::vector<std::wstring> ans;
// 获取主控数据库连接
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr = wstring2string(sql);
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return ans;
}
sqlite3_stmt* stmt_read = nullptr;
int read_ = m_sqlite3_prepare_v2(saveptrdb, sql, -1, &stmt_read, nullptr);
if (read_ != SQLITE_OK) {
sqlite3_finalize(stmt_read);
logstr = wstring2string(sql);
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return ans;
}
while (sqlite3_step(stmt_read) == SQLITE_ROW) {
int num = sqlite3_column_count(stmt_read); //返回结果行中有多少列
for (int i(0); i < num; i++) {
std::string temp((const char*)sqlite3_column_text(stmt_read, i));
if (temp.empty()) {
temp = "";
}
ans.push_back(stringToWstring(temp));
}
}
sqlite3_finalize(stmt_read);
sqlite3_close(saveptrdb);
return ans;
}
/*
* 参数:主控数据库路径、SQL、信息表
* 作者:龙向洋
* 说明:往主控表中插入数据
*/
int insertSingleInfo(std::wstring savedbpath, std::wstring sql, std::vector<std::wstring> & insertinfo) {
// 获取主控数据库连接
std::string logstr;
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr = wstring2string(sql);
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -11;
}
sqlite3_stmt* stmt_insert = nullptr;
int insert = m_sqlite3_prepare_v2(saveptrdb, sql, -1, &stmt_insert, nullptr);
if (insert != SQLITE_OK) {
sqlite3_finalize(stmt_insert);
logstr = wstring2string(sql);
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -22;
}
int len = insertinfo.size();
for (int i(0); i < len; i++) {
m_sqlite3_bind_text(stmt_insert, i + 1, insertinfo[i], -1, nullptr);
}
sqlite3_step(stmt_insert);
sqlite3_finalize(stmt_insert);
sqlite3_close(saveptrdb);
return 1;
}
/*
* 参数:主控数据库路径、账号
* 作者:龙向洋
* 说明:获取账号的昵称
*/
std::wstring getNickname(std::wstring savedbpath, std::string acc, bool isfriend) {
std::wstring nick_name_sql;
if (!isfriend) {
nick_name_sql = L"SELECT FRIEND_NICKNAME FROM T_IM_CONTACT WHERE FRIEND_ACCOUNT = ";
}
else {
nick_name_sql = L"SELECT REGIS_NICKNAME FROM T_WEB_ACCOUNT WHERE ACCOUNT = ";
}
nick_name_sql += stringToWstring(acc);
nick_name_sql += L";";
std::wstring nick_name = getSingleInfo(savedbpath, nick_name_sql)[0];
return nick_name;
}
/*
* 参数:主控数据库路径、SQL
* 作者:龙向洋
* 说明:返回一条SQL语句执行结果的行数
*/
int getSQLRowsCount(std::wstring savedbpath, std::wstring sql) {
int count = 0;
std::string logstr;
// 获取主控数据库连接
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr = wstring2string(sql);
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -11;
}
sqlite3_stmt* stmt_read = nullptr;
std::wstring countsql = L"SELECT COUNT(*) FROM ( ";
countsql += sql;
// 把原始语句后面的";"去掉,比如 "SELECT * FROM msg;" --> "SELECT * FROM msg"
auto endflag = --countsql.end();
while (endflag != countsql.begin()) {
if (*endflag == ';') {
countsql.erase(endflag);
break;
}
--endflag;
}
countsql += L");";
int read_ = m_sqlite3_prepare_v2(saveptrdb, countsql, -1, &stmt_read, nullptr);
if (read_ != SQLITE_OK) {
sqlite3_finalize(stmt_read);
logstr = wstring2string(sql);
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -22;
}
if (sqlite3_step(stmt_read) == SQLITE_ROW) {
count = sqlite3_column_int(stmt_read, 0);
}
sqlite3_finalize(stmt_read);
sqlite3_close(saveptrdb);
return count;
}
/*
* 参数:主控数据库路径、count值
* 作者:龙向洋
* 说明:专用于更新TOTAL表的count
*/
int updateSingleInfo(std::wstring savedbpath, int rowid, int val) {
// 获取主控数据库连接
std::string logstr;
sqlite3* saveptrdb = nullptr;
int mainDBIsExist = m_sqlite3_open(savedbpath, &saveptrdb);
if (SQLITE_OK != mainDBIsExist) {
logstr = "in updateSingleInfo() fail to connect mainDB";
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -11;
}
std::wstring updatecountsql = L"UPDATE T_DouYin_TOTAL SET Count = ? WHERE _id = ?;";
sqlite3_stmt* stmt_update = nullptr;
int insert = m_sqlite3_prepare_v2(saveptrdb, updatecountsql, -1, &stmt_update, nullptr);
if (insert != SQLITE_OK) {
sqlite3_finalize(stmt_update);
logstr = wstring2string(updatecountsql);
log((char*)"Error", (char*)(logstr).c_str(), (char*)"");
return -22;
}
sqlite3_bind_int(stmt_update, 1, val);
sqlite3_bind_int(stmt_update, 2, rowid);
sqlite3_step(stmt_update);
sqlite3_finalize(stmt_update);
sqlite3_close(saveptrdb);
return 1;
}
/*
* 参数:数据库路径
* 作者:龙向洋
* 说明:写入所有表格的ID信息,“暂时弃用,暂时弃用,暂时弃用”
*/
//bool writeIDtoTable(const std::string origindbpath, const std::string savedbpath) {
//
// std::regex reg_im("^[0-9]*_im.db"); // 正则:查找以 “数字_im.db” 形式的表
// std::regex reg_im_biz("^im_biz_[0-9]{5,}.db"); // 正则:查找以 “im_biz_数字.db” 形式的表
// std::vector<std::string> id_im = getFiles(origindbpath, reg_im);
// std::vector<std::string> im_biz = getFiles(origindbpath, reg_im_biz);
// //displayvector(im_biz);
//
// // * 获取用户ID
// std::vector<std::string> userid = getUserID(id_im);
// auto idpairs = makeIDPairs(userid); // 匹配GUID
// // * 获取昵称
//
// // * 获取主控数据库连接
// sqlite3* saveptrdb = nullptr;
// int mainDBIsExist = sqlite3_open(savedbpath.c_str(), &saveptrdb);
//
// std::wstring sql = L"";
// std::wstring im_bizdbpath = stringToWstring(origindbpath);
//
// // (1)存入账号信息表T_WEB_ACCOUNT
// // 清空
// sql.clear();
// sql += L"delete from T_WEB_ACCOUNT where TOTAL_NAME = 'T_DouYin_TOTAL';";
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// // 存入ID
// int countACCOUNT = 0;
// for (auto& pair : idpairs) {
// //sqlite3* originptrdb = nullptr;
// //im_bizdbpath +=
// //int originDBIsExist = sqlite3_open(origindbpath.c_str(), &originptrdb);
// ++countACCOUNT;
// sql.clear();
// sql += L"insert into T_WEB_ACCOUNT (ID, APP_NAME, TOTAL_NAME, ACCOUNT)";
// sql += L"values (";
// sql += std::to_wstring(countACCOUNT);
// sql += L", '抖音', 'T_DouYin_TOTAL','";
// sql += stringToWstring(pair.first);
// sql += L"');";
// //printWstring(sql);
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// }
//
// // (2)存入好友信息表T_IM_CONTACT
// // 清空
// sql.clear();
// sql = sql + L"delete from T_IM_CONTACT where TOTAL_NAME = 'T_DouYin_TOTAL';";
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// // 存入ID
// int countCONTACT = 0;
// for (auto& pair : idpairs) {
// ++countCONTACT;
// sql.clear();
// sql = L"insert into T_IM_CONTACT (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT)";
// sql += L"values ('";
// sql += std::to_wstring(countCONTACT);
// sql += L"','";
// sql += stringToWstring(pair.second);
// sql += L"', '抖音', 'T_DouYin_TOTAL',";
// sql += stringToWstring(pair.first);
// sql += L");";
// //printWstring(sql);
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// }
//
// // (3)存入群组信息表T_IM_GROUP
// // 清空
// sql.clear();
// sql = sql + L"delete from T_IM_GROUP where TOTAL_NAME = 'T_DouYin_TOTAL';";
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// // 存入ID
// int countIM_GROUP = 0;
// for (auto& pair : idpairs) {
// ++countIM_GROUP;
// sql.clear();
// sql = L"insert into T_IM_GROUP (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT)";
// sql += L"values ('";
// sql += std::to_wstring(countIM_GROUP);
// sql += L"','";
// sql += stringToWstring(pair.second);
// sql += L"', '抖音', 'T_DouYin_TOTAL',";
// sql += stringToWstring(pair.first);
// sql += L");";
// //printWstring(sql);
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// }
//
// // (4)存入群组成员表T_IM_GMEMBER
// // 清空
// sql.clear();
// sql = sql + L"delete from T_IM_GMEMBER where TOTAL_NAME = 'T_DouYin_TOTAL';";
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// // 存入ID
// int countIM_GMEMBER = 0;
// for (auto& pair : idpairs) {
// ++countIM_GMEMBER;
// sql.clear();
// sql = L"insert into T_IM_GMEMBER (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT)";
// sql += L"values ('";
// sql += std::to_wstring(countIM_GMEMBER);
// sql += L"','";
// sql += stringToWstring(pair.second);
// sql += L"', '抖音', 'T_DouYin_TOTAL',";
// sql += stringToWstring(pair.first);
// sql += L");";
// //printWstring(sql);
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// }
// // (5)存入好友聊天记录信息表T_IM_CONTACT_MSG
// // 清空
// sql.clear();
// sql = sql + L"delete from T_IM_CONTACT_MSG where TOTAL_NAME = 'T_DouYin_TOTAL';";
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// // 存入ID
// int countIM_CONTACT_MSGR = 0;
// for (auto& pair : idpairs) {
// ++countIM_CONTACT_MSGR;
// sql.clear();
// sql = L"insert into T_IM_CONTACT_MSG (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT)";
// sql += L"values ('";
// sql += std::to_wstring(countIM_CONTACT_MSGR);
// sql += L"','";
// sql += stringToWstring(pair.second);
// sql += L"', '抖音', 'T_DouYin_TOTAL',";
// sql += stringToWstring(pair.first);
// sql += L");";
// //printWstring(sql);
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// }
// // (6)群组聊天记录信息表T_IM_GROUP_MSG
// // 清空
// sql.clear();
// sql = sql + L"delete from T_IM_GROUP_MSG where TOTAL_NAME = 'T_DouYin_TOTAL';";
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// // 存入ID
// int countIM_GROUP_MSG = 0;
// for (auto& pair : idpairs) {
// ++countIM_GROUP_MSG;
// sql.clear();
// sql = L"insert into T_IM_GROUP_MSG (ID, PROFILE_ID, APP_NAME, TOTAL_NAME, ACCOUNT)";
// sql += L"values ('";
// sql += std::to_wstring(countIM_GROUP_MSG);
// sql += L"','";
// sql += stringToWstring(pair.second);
// sql += L"', '抖音', 'T_DouYin_TOTAL',";
// sql += stringToWstring(pair.first);
// sql += L");";
// //printWstring(sql);
// m_sqlite3_exec(saveptrdb, sql, nullptr, nullptr, nullptr);
// }
// sqlite3_close(saveptrdb); // 关闭连接
// return true;
//}
C++
1
https://gitee.com/long-yucheng/rh_-douyin.git
git@gitee.com:long-yucheng/rh_-douyin.git
long-yucheng
rh_-douyin
RH_Douyin
master

搜索帮助