database_get_data 函数分析
//获取所有的数据
int database_get_data(void *dst, const int cnt, size_t d_size, size_t d_off,
size_t i_size, size_t i_off, int mask)
{
int ret = 0;
char cmd[256];
sqlite3_stmt *stat = NULL;
int index = 0;
const void *data;
size_t size;
int id;
const size_t sum_size = d_size + i_size;
//线程锁
pthread_mutex_lock(&g_mutex);
//查询表中所有项
snprintf(cmd, sizeof(cmd), "SELECT * FROM %s;", DATABASE_TABLE);
if (sqlite3_prepare(g_db, cmd, -1, &stat, 0) != SQLITE_OK) {
pthread_mutex_unlock(&g_mutex);
return 0;
}
//对于每行
while (1) {
//执行编译好的准备语句的句柄
ret = sqlite3_step(stat);
//没有行了
if (ret != SQLITE_ROW)
break;
//获取数据
if (mask) {
data = sqlite3_column_blob(stat, 3);
size = sqlite3_column_bytes(stat, 3);
} else {
data = sqlite3_column_blob(stat, 0);
size = sqlite3_column_bytes(stat, 0);
}
//内存复制
if (size <= d_size)
memcpy((char*)dst + index * sum_size + d_off, data, size);
id = sqlite3_column_int(stat, 2);
memcpy((char*)dst + index * sum_size + i_off, &id, i_size);
if (++index >= cnt)
break;
}
//释放内存
sqlite3_finalize(stat);
//解锁
pthread_mutex_unlock(&g_mutex);
return index;
}
整个流程就是
生产语句
准备执行语句
对于每行,执行语句,取得数据
释放内存
自编 get_conf_by_name
以database_get_data为参考,通过name获取设置的参数。
//通过name来获取参数
//char* name 要获取的参数name
//void** ppblob_conf blob数据
//char** pptext_conf text数据
//int* pint_conf int数据地址
//float* pfloat_conf float数据地址
//int* size 数据大小的地址
int get_data_by_name(char* name, void** ppblob_conf, char** pptext_conf, int* pint_conf, float* pfloat_conf, int* size)
{
int ret = 0;
char cmd[256];
sqlite3_stmt *stat = NULL;
int index = 0;
const void *data;
//线程锁
pthread_mutex_lock(&g_mutex);
//查询表中 name 那行
snprintf(cmd, sizeof(cmd), "SELECT * FROM %s WHERE name = '%s';", DATABASE_TABLE, name);
//printf("%s \n",cmd);
if (sqlite3_prepare(g_db, cmd, -1, &stat, 0) != SQLITE_OK) {
pthread_mutex_unlock(&g_mutex);
return 0;
}
//对于每行
while (1) {
//执行编译好的准备语句的句柄
ret = sqlite3_step(stat);
//没有行了
if (ret != SQLITE_ROW)
break;
//获取数据
//如果是blob数据
if (ppblob_conf != NULL) {
data = sqlite3_column_blob(stat, 2);
//数据长度
*size = sqlite3_column_bytes(stat, 2);
//重新分配内存
*ppblob_conf = realloc(*ppblob_conf, *size);
//复制内存
memcpy(*ppblob_conf, data, *size);
} else if(pptext_conf != NULL){
//text数据
data = sqlite3_column_text(stat, 3);
//数据长度
*size = sqlite3_column_bytes(stat, 3) + 1;
//重新分配内存
*pptext_conf = realloc(*pptext_conf, *size);
memset(*pptext_conf, 0, *size);
//复制内存
memcpy(*pptext_conf, data, *size);
} else if(pint_conf != NULL) {
//int数据
*pint_conf = sqlite3_column_int(stat, 4);
} else if(pfloat_conf != NULL) {
//int数据
*pfloat_conf = sqlite3_column_double(stat, 5);
}
++index;
}
//释放内存
sqlite3_finalize(stat);
//解锁
pthread_mutex_unlock(&g_mutex);
return index;
}
在主程序中调用
//初始化数据库
int ret = database_init();
if(ret != 0)
{
printf("database_init false! \n");
return -1;
}
//读取APPID, SDKKEY
char* appid = (char*)malloc(1);
char* sdkkey = (char*)malloc(1);
int id_size, key_size;
get_data_by_name((char*)"text_APPID", NULL, &appid, NULL, NULL, &id_size);
get_data_by_name((char*)"text_SDKKEY", NULL, &sdkkey, NULL, NULL, &key_size);
//printf("appid: %s, id_size: %d\n", appid, id_size);
//printf("sdkkey: %s, key_size: %d\n", sdkkey, key_size);
//return 0;
printf("\n************* ArcFace SDK Info *****************\n");
MRESULT res = MOK;
res = ASFOnlineActivation(appid, sdkkey);
if (MOK != res && MERR_ASF_ALREADY_ACTIVATED != res)
printf("ASFOnlineActivation fail: %lx\n", res);
else
printf("ASFOnlineActivation sucess: %lx\n", res);
return 0;
编译测试
make 编译
samplecode/ASFTestDemo/build$ make
Scanning dependencies of target arcsoft_face_engine_test
[ 33%] Building CXX object CMakeFiles/arcsoft_face_engine_test.dir/samplecode.cpp.o
[ 66%] Linking CXX executable arcsoft_face_engine_test
[100%] Built target arcsoft_face_engine_test
测试
samplecode/ASFTestDemo/build$ ./arcsoft_face_engine_test
************* ArcFace SDK Info *****************
ASFOnlineActivation sucess: 16002
在merror.h中
#define MERR_ASF_BASE 0x16000 //人脸比对基础错误类型
#define MERR_ASF_ACTIVATION_FAIL (MERR_ASF_BASE+1) //SDK激活失败,请打开读写权限
#define MERR_ASF_ALREADY_ACTIVATED (MERR_ASF_BASE+2) //SDK已激活
代码16002表示已经激活。证明appid 和 sdkkey正确。