使用sqlite保存虹软的参数2

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正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值