// // Created by pans on 4/28/18. // #ifndef TESTSQLITE_SQLITETOOLKIT_HPP #define TESTSQLITE_SQLITETOOLKIT_HPP #include #include #include #include #include #include #include /** * 字段的集合 * @key FieldName * @value Value */ typedef std::map FieldValues; /*** * 人脸特征 */ typedef std::vector FaceFeature; struct AddFaceData { std::string uuid; FaceFeature feature; std::string faceUrl; }; struct FaceInfo { std::string uuid; std::string personName; std::string age; std::string sex; std::string idCard; std::string phoneNum; }; typedef std::vector FaceInfos; typedef std::map FaceInfosCache; struct TableInfo { std::string uuid; std::string tableName; std::string tableType; std::string bwType; std::string startTime; std::string endTime; std::string createBy; }; typedef std::vector TableInfos; typedef std::map TableInfosCache; //typedef std::vector FaceFeatures; //typedef std::map FeatureDBCache; struct FaceFeatureWithUrl { std::string uuid; std::string faceurl; FaceFeature faceFeature; }; typedef std::map FeatureDBWithUrlCache; namespace { #define INITCOPY(_DEST, _SRC) _DEST.resize(_SRC.size());memcpy(_DEST.data(),_SRC.data(), _SRC.size()); #define COPY(NAME1, NAME2) memcpy(&NAME1.data(), &NAME2.data(), NAME2.size); #define SQLERR(message) fprintf(stderr, "%s->%d-> SQLite error: %s\n",__FILE__,__LINE__, message); //#todo 数据库wenjian名称 static std::string file_dbName = "TestFaceDB.db"; //#todo 数据库名称 static std::string g_dbName = "main"; //#todo 管理表的表名 static std::string g_tableName = "sys_o_tables"; // std::string getFacesFromTableSql(std::string tableName) { std::string sql = "select uuid,feature,create_time,faceUrl,del_flag from " + tableName + "_fea where feature is not null "; return sql; } std::string getTableListSqlWithType(std::string type) { std::string sql = "select tableName,del_flag from " + g_tableName + " where del_flag = 0"; if (type.size() > 0) { sql.append(" and tableType = '" + type + "'"); } return sql; } std::string getTableInfosSql(std::string tableName) { std::string sql = "select * from " + tableName;// + " where del_flag = 0"; return sql; } std::string getTableInfosSql() { //uuid,tableName,tableDesc,tableType,bwType,startTime,endTime std::string sql = "select uuid,tableName,tableType,bwType,startTime,endTime from " + g_tableName + " where del_flag = 0"; return sql; } /** * not used have bug * @param tableName * @param id * @param feature * @return */ char *getAddFaceDataSql(std::string tableName, int id, FaceFeature &feature) { if (tableName.size() == 0 || feature.size() == 0) { //#todo errInfo return "tableName or FaceFeature is NULL"; } std::string str_fea; str_fea.assign(feature.begin(), feature.end()); std::stringstream sql;//= ; sql << "INSERT INTO " << tableName << " ("; //std::string sqlTemp = sql; std::string sql2 = ") VALUES(\""; if (id >= 0) { sql << "id,"; sql2.append(std::to_string(id) + "\",\""); } sql << "feature " << sql2 << str_fea << "\")"; //sql1 delete , //sql2 delete 2 ,' add ) return const_cast(str_fea.c_str()); } /** * 删除数据 * @param tableName 表名 * @param fieldValues 删除的条件组合 * @return */ std::string getDeleteSql(std::string tableName, FieldValues &fieldValues) { if (tableName.size() == 0 || fieldValues.size() == 0) { //#todo errInfo return "tableName or fieldValues is NULL"; } std::string sql = "DELETE from " + tableName + " where 1 = 1 "; for (auto item : fieldValues) { if (item.first.size() != 0) { sql.append("and " + item.first + " = '" + item.second + "' "); } } return sql; } /** * 添加数据 || 创建人脸表之后,将该记录插入管理表 * @param tableName 表名 * @param fieldValues 将要插入字段的集合 * @return */ std::string getInsertSql(std::string tableName, FieldValues &fieldValues) { if (tableName.size() == 0 || fieldValues.size() == 0) { //#todo errInfo return "tableName or fieldValues is NULL"; } std::string sql = "INSERT INTO " + tableName + " ("; std::string sqlTemp = sql; std::string sql2 = ") VALUES('"; for (auto item : fieldValues) { if (item.first.size() != 0) { sql.append(item.first + ","); sql2.append(item.second + "','"); } } //sql1 delete , sql = sql.substr(0, sql.length() - 1); //sql2 delete 2 ,' add ) sql2 = sql2.substr(0, sql2.length() - 2); sql2.append(" )"); sql.append(sql2); return sql; } /** * 创建管理表的sql语句 * * @return sql */ std::string getInitDBSql() { std::string sql = "CREATE TABLE \"main\".\"sys_o_tables\" ("; sql.append(" uuid varchar(255) PRIMARY KEY, "); // sql.append(" ClusterName varchar(255) DEFAULT NULL,");//本地库不需要 sql.append(" tableName varchar(255) UNIQUE,"); sql.append(" tableDesc varchar(255) DEFAULT NULL,"); sql.append(" tableType varchar(255) DEFAULT NULL,"); sql.append(" bwType varchar(255) DEFAULT NULL,"); sql.append(" startTime varchar(255) DEFAULT NULL,"); sql.append(" endTime varchar(255) DEFAULT NULL,"); sql.append(" create_time BLOB default (datetime('now', 'localtime')),"); sql.append(" update_time varchar(255) DEFAULT NULL,"); sql.append(" create_by varchar(255) DEFAULT NULL,"); sql.append(" del_flag varchar(255) DEFAULT 0"); sql.append(");"); return sql; } /** * 创建人脸表的sql语句 * @param tableName 想要创建的表名 * @return */ std::string getCreateFaceTableSql(std::string tableName) { if (tableName.size() == 0) { //#todo errInfo return "tableName is NULL"; } // 人员信息表 std::string sql = "CREATE TABLE " + g_dbName + "."; sql.append(tableName); sql.append(" ( uuid varchar(255) PRIMARY KEY,"); sql.append("personName varchar(255) DEFAULT NULL,"); sql.append("age varchar(255) DEFAULT NULL,"); sql.append("sex varchar(255) DEFAULT NULL,"); sql.append("idCard varchar(255) DEFAULT NULL,"); sql.append("phoneNum varchar(255) DEFAULT NULL,"); sql.append("create_time BLOB DEFAULT (datetime('now', 'localtime')),"); sql.append("update_time DATETIME DEFAULT NULL,"); sql.append("create_by varchar(255) DEFAULT NULL,"); sql.append("del_flag INTEGER DEFAULT 0"); sql.append(");"); // 人脸特征表 sql.append("CREATE TABLE " + g_dbName + "."); sql.append(tableName + "_fea"); sql.append(" ( uuid varchar(255) PRIMARY KEY,"); sql.append(" feature BLOB NOT NULL,"); sql.append(" faceUrl BLOB NOT NULL,"); sql.append(" create_time BLOB default (datetime('now', 'localtime')),"); sql.append(" update_time varchar(255) DEFAULT NULL,"); sql.append(" create_by varchar(255) DEFAULT NULL,"); sql.append(" del_flag INTEGER DEFAULT 0"); sql.append(");"); return sql; } std::string getUpdateFaceTableSql(std::string tableName, FieldValues &fieldValues) { if (tableName.size() == 0) { //#todo errInfo return "tableName is NULL"; } std::string uuid = fieldValues["uuid"]; if (uuid.size() <= 0) { SQLERR("uuid size is error"); return ""; } fieldValues.erase("uuid"); if (fieldValues.size() <= 0) { SQLERR("fieldValues size is error"); return ""; } std::string sql = "update "; sql.append(tableName + " set "); for (auto &item :fieldValues) { sql.append(item.first + " = '" + item.second + "',"); } sql.append(" update_time ='" + AppUtil::getTimeSecString() + "'"); sql.append(" where uuid ='" + uuid + "'"); return sql; } //#TODO 人脸表需要删除两个 std::string getDeleteFaceTableSql(std::string tableName) { if (tableName.size() == 0) { //#todo errInfo return "tableName is NULL"; } std::string sql = "DROP TABLE " + g_dbName + "." + tableName + ";"; sql.append("DROP TABLE " + g_dbName + "." + tableName + "_fea;"); return sql; } /** * 根据表名判断数据表是否存在 * @param existRet true is exist. * @param nCount 字段数量 * @param pValue 字段值数组 * @param azColName 字段名称数组 * @return */ static int isExist(void *existRet, int nCount, char **pValue, char **azColName) { bool *testRet = (bool *) existRet; int num = atoi(pValue[0]); if (num > 0) { *testRet = true; } else { *testRet = false; } return 0; } } #endif //TESTSQLITE_SQLITETOOLKIT_HPP