123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885 |
- #include <fstream>
- #include <iostream>
- #include <sstream>
- #include <vector>
- #include <iterator>
- #include "log_db.h"
- #ifdef _WIN32
- #include <io.h>
- #include <direct.h>
- #include "atlbase.h"
- #endif //_WIN32
- #include "CMBSMDLL.h"
- #include "CppSQLite3.h"
- #include "inner_log.h"
- #include "log_util.h"
- #include <vector>
- #include <sys/stat.h>
- #include "zlib.h"
- #include "base64_openssl.h"
- #ifndef _WIN32
- #ifndef CLOCK_MONOTONIC_RAW
- #define CLOCK_MONOTONIC_RAW 4
- #endif
- uint32_t GetTickCount(void)
- {
- uint32_t ticks = 0;
- struct timespec ts;
- if (!clock_gettime(CLOCK_MONOTONIC_RAW, &ts))
- ticks = (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000);
- return ticks;
- }
- char* itoa(int value, char* buffer, int radix)
- {
- char* p;
- unsigned int a;
- //int len;
- char* b;
- char temp;
- unsigned int u;
- p = buffer;
- if (value < 0) {
- *p++ = '-';
- value = 0 - value;
- }
- u = (unsigned int)value;
- b = p;
- do {
- a = u % radix;
- u /= radix;
- *p++ = a + '0';
- } while (u > 0);
- //len = (int)(p-buffer);
- *p-- = 0;
- do {
- temp = *p;
- *p = *b;
- *b = temp;
- --p;
- ++b;
- } while (b < p);
- return buffer;
- }
- #endif // _WIN32
- #define MAX_CACHEDB_SIZE 500*1024*1024
- #define MIN_CACHEFREQUENCE_SIZE 50
- #define COMPRESS_CONTEXT
- const std::string COLUMN_ID = "id";
- const std::string COLUMN_DateTime = "date_time";
- const std::string COLUMN_Uuid = "uuid";
- const std::string COLUMN_Level = "level";
- const std::string COLUMN_Type = "type";
- const std::string COLUMN_Status = "status";
- const std::string COLUMN_Encrypt = "encrypt";
- const std::string COLUMN_Content = "content";
- long LOG_GET_TIME() { return time(NULL); }
- struct _log_db_manager {
- log_producer_config* config;
- CppSQLite3DB *db;
- std::string file_path;
- std::string file_name;
- std::string table_name;
- };
- log_db_manager* create_log_db(log_producer_config* config, char* base_path, char* file_name, char* table_name) {
- std::string str_file_name, dstFile;
- if (base_path == NULL || table_name == NULL || file_name == NULL) {
- aos_debug_log((LB, "create log db failed for null"));
- return NULL;
- }
- auto getFileSize = [](const char* fileName) -> int {
- if (fileName == NULL) {
- return -1;
- }
- struct stat statbuf;
- if (stat(fileName, &statbuf) == -1)
- return -1;
- // 获取文件大小
- size_t filesize = statbuf.st_size;
- return filesize;
- };
- auto IsFileOutDate = [](const char* fileName) -> bool
- {
- if (fileName == NULL) {
- return false;
- }
- struct stat statbuf;
- if (stat(fileName, &statbuf) == -1)
- return false;
-
- auto modifyTime = statbuf.st_mtime;
- auto curTime = time(nullptr);
- return (curTime - modifyTime) > 3600 * 72;//3 days
- };
- dstFile = std::string(base_path) + std::string(file_name);
- auto curFileSize = getFileSize(dstFile.c_str());
- const int MAX_DB_SIZE = 50 * 1024 * 1024;
- if (IsFileOutDate(dstFile.c_str()) || curFileSize > MAX_DB_SIZE) {
- #if defined(_MSC_VER)
- DeleteFile(dstFile.c_str());
- #else
- int status;
- status = unlink(dstFile.c_str());
- #endif //_MSC_VER
- }
-
- log_db_manager*log_db = new log_db_manager();
- log_db->file_path = base_path;
- str_file_name = file_name;
- log_db->file_name = str_file_name;
- log_db->table_name = table_name;
- log_db->db = new CppSQLite3DB();
- log_db->config = config;
- aos_debug_log((LB, "create log db success, db file_path %s, file_name %s, table_name %s",
- log_db->file_path.c_str(), log_db->file_name.c_str(), log_db->table_name.c_str()));
- return log_db;
- }
- void destroy_log_db(log_db_manager* manager) {
- if (manager != NULL) {
- if (manager != NULL) {
- try {
- if (manager->db)
- {
- manager->db->close();
- delete manager->db;
- manager->db = NULL;
- }
- }
- catch (...) {
- aos_error_log((LB, "close log db name %s failed.", manager->file_name.c_str()));
- }
- }
- aos_debug_log((LB, "destroy log db %s", manager->file_name.c_str()));
- delete manager;
- manager = NULL;
- }
- }
- bool createFile(std::string fileName) {
- std::fstream file;
- file.open(fileName, std::ios::out);
- if (!file) {
- return false;
- }
- file.close();
- return true;
- }
- int open_db(log_db_manager * manager) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "open log db %s failed for null.", manager->file_name.c_str()));
- return false;
- }
- bool ret = true;
- try {
- std::string full_file_name;
- int mk_ret = mkdir_foreach((char*)manager->file_path.c_str(), manager->file_path.length());
- if (mk_ret < 0){
- aos_error_log((LB, "make log db %s file path failed.", manager->file_name.c_str()));
- return false;
- }
- full_file_name = manager->file_path + manager->file_name;
- char* name = (char*)full_file_name.c_str();
- manager->db->open(name);
- if (!db_is_exist_table_ex(manager, (char *)manager->table_name.c_str())) {
- std::string strCreateTable = "CREATE TABLE IF NOT EXISTS ";
- strCreateTable.append(manager->table_name).append(" (" +
- //COLUMN_ID + " INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT," +
- COLUMN_DateTime + " INTEGER," +
- COLUMN_Uuid + " TEXT NOT NULL PRIMARY KEY," +
- COLUMN_Level + " INTEGER," +
- COLUMN_Type + " INTEGER," +
- COLUMN_Status + " INTEGER DEFAULT 0," +
- COLUMN_Encrypt + " INTEGER DEFAULT 0," +
- COLUMN_Content + " TEXT" +
- ");");
- int CTRet = manager->db->execDML(strCreateTable.c_str());
- //aos_debug_log((LB, "create log table result %d, db name %s", CTRet, name));
- }
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "open log db %s error %s", manager->file_name.c_str(), e.errorMessage()));
- if (manager->db != NULL) {
- try {
- manager->db->close();
- }
- catch (...) {
- aos_error_log((LB, "close log db %s failed.", manager->file_name.c_str()));
- }
- delete manager->db;
- manager->db = NULL;
- }
- ret = false;
- }
- return ret;
- }
- void close_logdb(log_db_manager* manager)
- {
- if (manager!= NULL && manager->db != NULL) {
- try {
- manager->db->close();
- }
- catch (...) {
- aos_error_log((LB, "close log db %s failed.", manager->file_name.c_str()));
- }
- delete manager->db;
- manager->db = NULL;
- }
- }
- int drop_db(log_db_manager* manager)
- {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "drop log db %s failed for null.", manager->file_name.c_str()));
- return false;
- }
- bool ret = true;
- try {
- std::string strSql = "DROP TABLE IF EXISTS ";
- strSql.append(manager->table_name);
- int CTRet = manager->db->execDML(strSql.c_str());
- aos_debug_log((LB, "drop log db %s result %d table name %s", manager->file_name.c_str(), CTRet, manager->table_name.c_str()));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "drop log db %s error %s", manager->file_name.c_str(), e.errorMessage()));
- ret = false;
- }
- return ret;
- }
- int db_insert_group(log_db_manager* manager, log_group_builder* builder) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "insert log db %s failed for null.", manager->file_name.c_str()));
- return false;
- }
- int ret = true;
- serialize_buf buf;
-
- for (int i = 0; i < builder->grp->n_logs; i++) {
- memset(&buf, 0, sizeof(serialize_buf));
- serialize_to_buf(&builder->grp->logs[i], &buf);
- ret = db_insert_one(manager, &buf);
- }
- return ret;
- }
- int db_insert_one(log_db_manager* manager, serialize_buf* buf) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "insert log db %s failed for null.", manager->file_name.c_str()));
- return false;
- }
- int ret = true;
- std::string strSql = "insert into ";
- long time = LOG_GET_TIME();
- char strTime[128];
- char strLevel[32];
- char strType[32];
- char strEncrypt[32];
- sprintf(strTime, "%ld", time);
- sprintf(strLevel, "%d", buf->level);
- sprintf(strType, "%d", buf->type);
- sprintf(strEncrypt, "%d", manager->config->usePersistentEncrypt);
- unsigned long end_time;
- unsigned long start_time = GetTickCount();
- //SM4加密,密文会比明文长16字节
- if (manager->config->usePersistentEncrypt == 1) {
- int input_length = strlen(buf->buffer) + 1;
- unsigned char* input_data = (unsigned char*)buf->buffer;
- int output_length = input_length + 16;
- unsigned char* output_data = (unsigned char*)malloc(output_length);
- CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, input_data, input_length, output_data, &output_length);
- char* output_str_data = (char*)malloc(output_length * 2 + 1);
- memset(output_str_data, 0, output_length * 2 + 1);
- convertUnCharTotr(output_str_data, output_data, output_length);
- strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
- "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
- ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
- append(strLevel).append(",").append(strType).append(",'").
- append(output_str_data).append("',").append(strEncrypt).append(",0)");
- free(output_data);
- free(output_str_data);
- end_time = GetTickCount();
- //aos_debug_log((LB, "db_insert_one Encrypt cust %d", end_time - start_time));
- }
- else if(manager->config->usePersistentEncrypt == 2)
- {
- int input_length = strlen(buf->buffer) + 1;
- unsigned char* input_data = (unsigned char*)buf->buffer;
- unsigned long compressLen = input_length * 2 + 1;
- unsigned char* compress_str_data = (unsigned char*)malloc(compressLen);
- memset(compress_str_data, 0, compressLen);
- compress(compress_str_data, &compressLen, (unsigned char*)input_data, input_length);
- int output_length = compressLen + 16;
- unsigned char* output_data = (unsigned char*)malloc(output_length);
- CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, compress_str_data, compressLen, output_data, &output_length);
- char* output_str_data = openssl_base64_encode((char*)output_data, output_length);
- /*
- unsigned long len = output_length * 2 + 1;
- unsigned char* output_str_data = (unsigned char*)malloc(len);
- memset(output_str_data, 0, len);
- compress(output_str_data, &len, (unsigned char*)output_data, output_length);
- */
- strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
- "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
- ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
- append(strLevel).append(",").append(strType).append(",'").
- append((char*)output_str_data).append("',").append(strEncrypt).append(",0)");
- free(compress_str_data);
- free(output_data);
- free(output_str_data);
- end_time = GetTickCount();
- }
- else {
- #ifdef COMPRESS_CONTEXT
- unsigned char dstBuf[10000] = "";
- unsigned long len = 10000;
- compress(dstBuf, &len, (unsigned char*)buf->buffer, buf->buffer_len);
- strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
- "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
- ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
- append(strLevel).append(",").append(strType).append(",'").
- append((char*)dstBuf).append("',").append(strEncrypt).append(",0)");
- #else
- strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
- "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
- ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
- append(strLevel).append(",").append(strType).append(",'").
- append((char*)buf->buffer).append("',").append(strEncrypt).append(",0)");
- #endif
- }
- try {
- int CTRet = manager->db->execDML(strSql.c_str());
- end_time = GetTickCount();
- //aos_debug_log((LB, "db_insert_one execDML cust %d", end_time - start_time));
- //aos_debug_log((LB, "db %s insert one log result %d, log uuid %s", manager->file_name.c_str(), CTRet, buf->uuid));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s insert one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), buf->uuid));
- ret = false;
- }
-
- return ret;
- }
- log_group_builder* db_read_table_last_log(log_db_manager* manager, char *table_name) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "read last log db %s failed for null.", manager->file_name.c_str()));
- return NULL;
- }
- build_item log;
- log_group_builder* builder = NULL;
- char strStatus[32];
- sprintf(strStatus, "%d", LOG_DB_STATUS_SENDING);
- std::string querySql = "select * from ";
- querySql.append(table_name);
- querySql.append(" where " + COLUMN_Status + " != ").append(strStatus);
- querySql.append(" order by " + COLUMN_DateTime + " DESC LIMIT 1;");
- try {
- CppSQLite3Query q = manager->db->execQuery(querySql.c_str());
- if (!q.eof()) {
- int encrypt = q.getIntField(COLUMN_Encrypt.c_str(), 0);
- log.type = (build_type_e)q.getIntField(COLUMN_Type.c_str(), LOG_TYPE_BEIDOU);
- strcpy(log.uuid, q.getStringField(COLUMN_Uuid.c_str()));
- log.level = (LOG_LEVEL_E)q.getIntField(COLUMN_Level.c_str(), LOG_LEVEL_DEBUG);
- //content
- char* output_data = NULL;
- if (encrypt == 1) {
- char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
- int input_length = strlen(input_str_data) / 2;
- unsigned char* input_data = (unsigned char*)malloc(input_length);
- convertStrToUnChar(input_str_data, input_data);
- int output_length = input_length;
- output_data = (char*)malloc(input_length);
- memset(output_data, 0, input_length);
- CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
- input_data, input_length, (unsigned char*)output_data, &output_length);
- log.buffer = output_data;
- log.buffer_len = strlen(log.buffer) + 1;
- free(input_data);
- }
- else if (encrypt == 2) {
- char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
- /*
- uLongf input_length = strlen(input_str_data);
- unsigned char* input_data = (unsigned char*)malloc(input_length);
- uncompress(input_data, &input_length, (unsigned char*)input_str_data, strlen(input_str_data));
- */
- char* decoded_bytes = NULL;
- size_t decoded_length = 0;
- openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
- int SM4_length = decoded_length;
- char* SM4_data = (char*)malloc(decoded_length);
- memset(SM4_data, 0, decoded_length);
- CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
- (unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
- uLongf uncompress_length = SM4_length;
- output_data = (char*)malloc(uncompress_length);
- memset(output_data, 0, uncompress_length);
- uncompress((unsigned char*)output_data, &uncompress_length, (unsigned char*)SM4_data, SM4_length);
- log.buffer = (char*)output_data;
- log.buffer_len = strlen(log.buffer) + 1;
- free(SM4_data);
- free(decoded_bytes);
- }
- else {
- std::string src = (char*)q.getStringField(COLUMN_Content.c_str());
- #ifdef COMPRESS_CONTEXT
- unsigned char dst[10000] = "";
- uLongf dstLen = 10000;
- uncompress(dst, &dstLen, (unsigned char*)src.c_str(), src.length());
- log.buffer = (char*)dst;
- log.buffer_len = dstLen + 1;
- #else
- log.buffer = (char*)q.getStringField(COLUMN_Content.c_str());
- log.buffer_len = strlen(log.buffer) + 1;
- #endif
- }
- builder = log_group_create(manager->config);
- strcpy(builder->modular, manager->file_name.c_str());
- add_log_raw(builder, &log);
- if (output_data != NULL) {
- free(output_data);
- }
- //aos_debug_log((LB, "read last log db %s, uuid %s.", manager->file_name.c_str(), log.uuid));
- }
- q.finalize();
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s read one log error %s", manager->file_name.c_str(), e.errorMessage()));
- return NULL;
- }
- return builder;
- }
- log_group_builder* db_read_last_log(log_db_manager* manager) {
- return db_read_table_last_log(manager, (char *)(manager->table_name.c_str()));
- }
- int getReadType()
- {
- static unsigned int sum = 0;
- sum = sum % 100;
- sum++;
- int cmpData = sum % 11;
- if (cmpData <= 5)
- return build_type_e::LOG_TYPE_SYS_SKYEYE;
- else if (cmpData <= 6)
- return build_type_e::LOG_TYPE_BEIDOU;
- else if (cmpData <= 7)
- return build_type_e::LOG_TYPE_USER_SKYEYE;
- else if (cmpData <= 8)
- return build_type_e::LOG_TYPE_USER_BUSINESS;
- else if (cmpData <= 9)
- return build_type_e::LOG_TYPE_SYS_BUSINESS;
- else if (cmpData <= 10)
- return build_type_e::LOG_TYPE_WEBSDK;
- else
- return 1;
- }
- log_group_builder* db_read_table_last_logs(log_db_manager* manager, int count) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "read last logs db %s failed for null.", manager->file_name.c_str()));
- return NULL;
- }
- build_item log;
- char strStatus[32];
- char strCount[32];
- log_group_builder* builder = log_group_create(manager->config);
- sprintf(strStatus, "%d", LOG_DB_STATUS_SENDING);
- sprintf(strCount, "%d", count);
- std::string querySql = "select * from ";
- querySql.append(manager->table_name);
- int readType = getReadType();
- querySql.append(" where " + COLUMN_Status + " != ").append(strStatus).append(" AND ").append(COLUMN_Type).append("=").append(std::to_string((long long)readType));
- querySql.append(/*" order by " + COLUMN_DateTime + */" LIMIT ").append(strCount).append(";");
- try {
- CppSQLite3Query q = manager->db->execQuery(querySql.c_str());
- if (q.eof())
- {
- //if can not find, try to get LOG_TYPE_SYS_SKYEYE logs
- std::string searchSys= "select * from ";
- searchSys.append(manager->table_name);
- searchSys.append(" where " + COLUMN_Status + " != ").append(strStatus).append(strStatus).append(" AND ").append(COLUMN_Type).append("=").append(std::to_string(LOG_TYPE_SYS_SKYEYE));
- searchSys.append(/*" order by " + COLUMN_DateTime + */" LIMIT ").append(strCount).append(";");
- q = manager->db->execQuery(searchSys.c_str());
- }
- while (!q.eof()) {
- int encrypt = q.getIntField(COLUMN_Encrypt.c_str(), 0);
- log.type = (build_type_e)q.getIntField(COLUMN_Type.c_str(), LOG_TYPE_USER_SKYEYE);
- //只获取同一类型的日志
- if (builder->grp->n_logs != 0 && builder->grp->logs[0].type != log.type) {
- q.nextRow();
- continue;
- }
- strcpy(log.uuid, q.getStringField(COLUMN_Uuid.c_str()));
- log.level = (LOG_LEVEL_E)q.getIntField(COLUMN_Level.c_str(), LOG_LEVEL_DEBUG);
- //content
- char* output_data = NULL;
- if (encrypt == 1) {
- char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
- int input_length = strlen(input_str_data) / 2;
- unsigned char* input_data = (unsigned char*)malloc(input_length);
- memset(input_data, 0, input_length);
- convertStrToUnChar(input_str_data, input_data);
- int output_length = input_length;
- output_data = (char*)malloc(input_length);
- memset(output_data, 0, input_length);
- CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
- input_data, input_length, (unsigned char*)output_data, &output_length);
- log.buffer = output_data;
- log.buffer_len = strlen(log.buffer) + 1;
- free(input_data);
- }
- else if (encrypt == 2) {
- char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
- /*
- uLongf input_length = strlen(input_str_data);
- unsigned char* input_data = (unsigned char*)malloc(input_length);
- uncompress(input_data, &input_length, (unsigned char*)input_str_data, strlen(input_str_data));
- */
- char* decoded_bytes = NULL;
- size_t decoded_length = 0;
- openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
- int SM4_length = decoded_length;
- char *SM4_data = (char*)malloc(decoded_length);
- memset(SM4_data, 0, decoded_length);
- CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
- (unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
- uLongf uncompress_length = SM4_length * 3;
- output_data = (char*)malloc(uncompress_length);
- memset(output_data, 0, uncompress_length);
- uncompress((unsigned char*)output_data, &uncompress_length, (unsigned char*)SM4_data, SM4_length);
- log.buffer = (char*)output_data;
- log.buffer_len = strlen(log.buffer) + 1;
- free(SM4_data);
- free(decoded_bytes);
- }
- else {
- std::string src = (char*)q.getStringField(COLUMN_Content.c_str());
- #ifdef COMPRESS_CONTEXT
- unsigned char dst[10000] = "";
- uLongf dstLen = 10000;
- uncompress(dst, &dstLen, (unsigned char*)src.c_str(), src.length());
- log.buffer = (char*)dst;
- log.buffer_len = dstLen + 1;
- #else
- log.buffer = (char*)q.getStringField(COLUMN_Content.c_str());
- log.buffer_len = strlen(log.buffer) + 1;
- #endif // COMPRESS_CONTEXT
- }
- strcpy(builder->modular, manager->file_name.c_str());
- add_log_raw(builder, &log);
- if (output_data != NULL) {
- free(output_data);
- }
- //aos_debug_log((LB, "read last log db %s, uuid %s.", manager->file_name.c_str(), log.uuid));
- q.nextRow();
- }
- q.finalize();
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s read logs error %s, querySql %s", manager->file_name.c_str(), e.errorMessage(), querySql.c_str()));
- log_group_destroy(builder);
- return NULL;
- }
- if (builder->grp->n_logs == 0) {
- log_group_destroy(builder);
- return NULL;
- }
- return builder;
- }
- int db_delete_old_logs(log_db_manager* manager, int count) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "delete old logs db %s failed for null.", manager->file_name.c_str()));
- return false;
- }
- int ret = true;
- char strCount[64];
- itoa(count, strCount, 10);
- std::string sql = "delete from ";
- sql.append(manager->table_name);
- sql.append(" where "+ COLUMN_Uuid + " in (select " + COLUMN_Uuid + " from "+ manager->table_name +" order by " + COLUMN_DateTime + " ASC LIMIT " + strCount+")");
- sql.append(";");
- try {
- int CTRet = manager->db->execDML(sql.c_str());
- aos_debug_log((LB, "db %s delete old log result %d table name %s", manager->file_name.c_str(), CTRet, manager->table_name.c_str()));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s delete old log error %s", manager->file_name.c_str(), e.errorMessage()));
- ret = false;
- }
- return ret;
- }
- int db_delete_one(log_db_manager* manager, char* uuid) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "delete one log db %s failed for null.", manager->file_name.c_str()));
- return false;
- }
- int ret = true;
- std::string sql = "delete from ";
- sql.append(manager->table_name);
- sql.append(" where "+ COLUMN_Uuid + " = '").append(uuid).append("';");
- try {
- int CTRet = manager->db->execDML(sql.c_str());
- //aos_debug_log((LB, "db %s delete one uuid:%s log result %d", manager->file_name.c_str(), uuid, CTRet));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s delete one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), uuid));
- ret = false;
- }
- return ret;
- }
- int db_get_count(log_db_manager* manager) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "get db %s count failed for null.", manager->file_name.c_str()));
- return 0;
- }
- int ret = 0;
- std::string sql = "select count(";
- sql.append(COLUMN_Uuid).append(") from ");
- sql.append(manager->table_name);
- try {
- ret = manager->db->execScalar(sql.c_str());
- //aos_debug_log((LB, "db %s get count %d", manager->file_name.c_str(), ret));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "get db %s count error %s", manager->file_name.c_str(), e.errorMessage()));
- ret = 0;
- }
- return ret;
- }
- int db_update_status(log_db_manager* manager, char* uuid, log_db_status_e status) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "db %s update log status failed for null.", manager->file_name.c_str()));
- return false;
- }
- int ret = true;
- char strStatus[32];
- char strSendingStatus[32];
- sprintf(strSendingStatus, "%d", LOG_DB_STATUS_SENDING);
- sprintf(strStatus, "%d", status);
- std::string sql = "update ";
- sql.append(manager->table_name);
- sql.append(" set " + COLUMN_Status + " = ").append(strStatus);
- if (uuid == NULL) {
- //sql.append(";");
- sql.append(" where " + COLUMN_Status + " = ").append(strSendingStatus).append(";");
- }
- else {
- sql.append(" where " + COLUMN_Uuid + " = '").append(uuid).append("';");
- }
- try {
- int CTRet = manager->db->execDML(sql.c_str());
- //aos_debug_log((LB, "db %s update one uuid:%s status:%d log result %d", manager->file_name.c_str(), uuid, status, CTRet));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s update one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), uuid));
- ret = false;
- }
- return ret;
- }
- int db_is_exist_table_ex(log_db_manager* manager, char* tablename){
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "db %s is exist table ex failed for null.", manager->file_name.c_str()));
- return false;
- }
- std::string beginStr = "select count(*) from sqlite_master where type ='table' and name='";
- std::string queryStr = beginStr.append(tablename).append("';");
- try {
- int Ret = 0;
- Ret = manager->db->execScalar(queryStr.c_str());
- if( 0 == Ret)
- return false;
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s update one log error %s", manager->file_name.c_str(), e.errorMessage()));
- return false;
- }
- return true;
- }
- int db_get_tables(log_db_manager* manager, char** tables, int* table_count) {
- if (manager == NULL || manager->db == NULL) {
- aos_error_log((LB, "db %s get table names failed for null.", manager->file_name.c_str()));
- return false;
- }
- std::vector<std::string> table_vec;
- std::string queryStr = "select name from sqlite_master where type ='table' and name NOT LIKE 'sqlite_%'";
- try {
- CppSQLite3Query q = manager->db->execQuery(queryStr.c_str());
- while (!q.eof()) {
- char* table_name = (char*)q.getStringField("name");
- table_vec.insert(table_vec.begin(), table_name);
- q.nextRow();
- }
- q.finalize();
- *table_count = table_vec.size();
- tables = (char **)malloc(*table_count * sizeof(char *));
- for (int i = 0; i < *table_count; i++) {
- int len = table_vec[i].length();
- tables[i] = (char *)malloc(len + 1);
- strcpy(tables[i], table_vec[i].c_str());
- }
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s get table names error %s", manager->file_name.c_str(), e.errorMessage()));
- return false;
- }
- return true;
- }
- int db_vacuum(log_db_manager* manager){
- int CTRet;
- try {
- CTRet = manager->db->execDML("VACUUM");
- aos_debug_log((LB, "db %s exec VACUUM result %d", manager->file_name.c_str(), CTRet));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s exec VACUUM error %s", manager->file_name.c_str(), e.errorMessage()));
- return false;
- }
- return true;
- }
- int db_transaction_begin(log_db_manager* manager) {
- int CTRet;
- try {
- CTRet = manager->db->execDML("begin;");
- //aos_debug_log((LB, "db %s exec begin result %d", manager->file_name.c_str(), CTRet));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s exec begin error %s", manager->file_name.c_str(), e.errorMessage()));
- return false;
- }
- return true;
- }
- int db_transaction_commit(log_db_manager* manager) {
- int CTRet;
- try {
- CTRet = manager->db->execDML("commit;");
- //aos_debug_log((LB, "db %s exec commit result %d", manager->file_name.c_str(), CTRet));
- }
- catch (CppSQLite3Exception& e)
- {
- aos_error_log((LB, "db %s exec commit error %s", manager->file_name.c_str(), e.errorMessage()));
- return false;
- }
- return true;
- }
|