/* open fire host and slora report data database */
int open_report_db(void)
{
int rv = -;
char sql[SQL_COMMAND_LEN];
char *errmsg = NULL;
const char *db_file = REPORT_DB_FILE; /* If report database already exist, then we will just open it */
if( ==access(db_file, F_OK) )
{
if( SQLITE_OK != sqlite3_open(db_file, &s_report_db) )
{
log_err("open report database file '%s' failure\n", db_file);
return -;
}
log_nrml("open report database file '%s' ok\n", db_file);
return ;
} pthread_mutex_lock(&s_reportdb_lock); /* If report database file not exist, then we create it now */
if( SQLITE_OK != sqlite3_open(db_file, &s_report_db) )
{
log_err("create report database file '%s' failure\n", db_file);
pthread_mutex_unlock(&s_reportdb_lock);
return -;
}
log_nrml("open report database file '%s' ok\n", db_file); /* Auto increase/decrease */
snprintf(sql, sizeof(sql), "pragma auto_vacuum=2;");
if( SQLITE_OK != sqlite3_exec(s_report_db, sql, NULL, NULL, &errmsg) )
{
log_err("set pragma auto_vacuum=2 failure: %s\n", db_file, errmsg);
rv = -;
goto FAILED;
} /* Create firehost table in the database */
strncpy(sql, "CREATE TABLE firehost(id INTEGER PRIMARY KEY autoincrement, sent BOOL DEFAULT 0, packet BLOB);", sizeof(sql));
if( SQLITE_OK != sqlite3_exec(s_report_db, sql, NULL, NULL, &errmsg) )
{
log_err("create firehost table in report database file '%s' failure: %s\n", db_file, errmsg);
rv = -;
goto FAILED;
} /* Create elora table in the database */
strncpy(sql, "CREATE TABLE elora(id INTEGER PRIMARY KEY autoincrement, sent BOOL DEFAULT 0, packet BLOB);", sizeof(sql));
if( SQLITE_OK != sqlite3_exec(s_report_db, sql, NULL, NULL, &errmsg) )
{
log_err("create elora table in report database file '%s' failure: %s\n", db_file, errmsg);
rv = -;
goto FAILED;
} log_nrml("create report database file '%s' ok\n", db_file);
pthread_mutex_unlock(&s_reportdb_lock);
return ; FAILED:
log_err("Create report database '%s' failure and remove it\n", db_file);
sqlite3_close(s_report_db);
sqlite3_free(errmsg);
unlink(db_file);
pthread_mutex_unlock(&s_reportdb_lock);
return rv;
} int add_reportdb_firehost(firehost_pack_t *pack)
{
int rv;
sqlite3_stmt *stat = NULL; if( !pack )
{
log_err("invalid input arguments\n");
return -;
} if(!s_report_db)
{
log_nrml("report database not opened, try to open it now\n");
if( open_report_db() < )
return -;
} pthread_mutex_lock(&s_reportdb_lock); rv = sqlite3_prepare_v2(s_report_db, "insert into firehost(packet)values(?)", -, &stat, NULL);
if(SQLITE_OK!=rv || !stat)
{
log_err("firehost sqlite3_prepare_v2 failure\n");
rv = -;
goto out;
} cp_log_dump(LOG_LEVEL_NRML, (char *)pack, sizeof(*pack)); if( SQLITE_OK != sqlite3_bind_blob(stat, , pack, sizeof(*pack), NULL) )
{
log_err("firehost sqlite3_bind_blob failure\n");
rv = -;
goto out;
} rv = sqlite3_step(stat);
if( SQLITE_DONE!=rv && SQLITE_ROW!=rv )
{
log_err("firehost sqlite3_step failure\n");
rv = -;
goto out;
} sqlite3_finalize(stat); pthread_mutex_unlock(&s_reportdb_lock);
log_nrml("add new firehost report data into database ok\n"); return ; out:
pthread_mutex_unlock(&s_reportdb_lock);
log_nrml("add new firehost report data into database failure, rv=%d\n", rv);
return rv;
} int mark_reportdb_firehost_sent(int record_id)
{
char sql[SQL_COMMAND_LEN];
char *errmsg = NULL; if(record_id <= )
{
log_err("invalid input arguments\n");
return -;
} if(!s_report_db)
{
log_nrml("report database not opened, try to open it now\n");
if( open_report_db() < )
return -;
} pthread_mutex_lock(&s_reportdb_lock); memset(sql, , sizeof(sql));
snprintf(sql, sizeof(sql), "update firehost set sent=1 where id=%d;", record_id);
if( SQLITE_OK != sqlite3_exec(s_report_db, sql, NULL, NULL, &errmsg) )
{
log_err("mark firehost packet[%d] already sent from database failure: %s\n", record_id, errmsg);
sqlite3_free(errmsg);
pthread_mutex_unlock(&s_reportdb_lock);
return -;
} pthread_mutex_unlock(&s_reportdb_lock);
log_nrml("mark firehost packet[%d] already sent from database ok\n", record_id);
return ;
} int query_reportdb_firehost_unsent(int *record_id, firehost_pack_t *pack)
{
int rv;
sqlite3_stmt *stat = NULL;
const void *blob_ptr; if( !record_id || !pack )
{
log_err("invalid input arguments\n");
return -;
} if(!s_report_db)
{
log_nrml("report database not opened, try to open it now\n");
if( open_report_db() < )
return -;
} pthread_mutex_lock(&s_reportdb_lock); /* Only query the first unsent packet record */
rv = sqlite3_prepare_v2(s_report_db, "select id,packet from firehost where sent=0 limit 0,1;", -, &stat, NULL);
if(SQLITE_OK!=rv || !stat)
{
log_err("firehost sqlite3_prepare_v2 failure\n");
rv = -;
goto out;
} rv = sqlite3_step(stat);
if( SQLITE_DONE!=rv && SQLITE_ROW!=rv )
{
log_err("firehost sqlite3_step failure\n");
rv = -;
goto out;
} /* 2rd argument<0> means first segement is id */
*record_id = sqlite3_column_int(stat, ); /* 2rd argument<1> means first segement is id */
//blob_bytes = sqlite3_column_bytes(stat, 1 );
blob_ptr = sqlite3_column_blob(stat, ); memcpy(pack, blob_ptr, sizeof(*pack)); log_trace("Read firehost packet from database:\n");
cp_log_dump(LOG_LEVEL_TRACE, (char *)pack, sizeof(*pack)); sqlite3_finalize(stat); pthread_mutex_unlock(&s_reportdb_lock);
log_nrml("query new firehost report data into database ok\n");
return ; out:
pthread_mutex_unlock(&s_reportdb_lock);
log_nrml("query new firehost report data into database failure, rv=%d\n", rv);
return rv;
}

sqlite使用blob类型存储/访问 结构体的更多相关文章

  1. 用set、map等存储自定义结构体时容器内部判别各元素是否相同的注意事项

    STL作为通用模板极大地方便了C++使用者的编程,因为它可以存储任意数据类型的元素 如果我们想用set与map来存储自定义结构体时,如下 struct pp { double xx; double y ...

  2. C语言中访问结构体成员时用‘.’和‘->’的区别

    举个例子,定义了一个叫Student,别名为stu的结构类型,我们声明了一个结构体变量叫stu1,声明了一个结构体指针为stuP. typedef struct Student { char name ...

  3. C语言各类型大小,结构体大小 sizeof(struct A)

    C语言类型大小总览 编译器pack指令 #pragma pack(n)——定义n字节对齐 C++固有类型的对齐取编译器对齐与自身大小中较小的一个 32位C++默认8字节对齐.gcc编译器默认4字节对齐 ...

  4. typedef struct xxx xxx与struct xxx区别 && “->”和“.”访问结构体变量

    1. struct //是C中的结构体的关键词.如: stuct node{ int a;.....} a; node 相当于结构体的类型,关键是其实在C中stuct node 才相当于一个数据类型, ...

  5. 嵌入式-C语言基础:通过结构体指针访问结构体数组

    #include<stdio.h> #include<string.h> struct Student { char name[32]; int age; int height ...

  6. iOS学习之C语言结构体

    结构体:用来存放相同类型数据或者不同类型数据的自定义类型. 结构体定义(声明) struct 结构体名 {    成员变量1;    成员变量2;    ... }; typedef 现有类型 新的类 ...

  7. Swift超详细的基础语法-结构体,结构体构造器,定义成员方法, 值类型, 扩充函数

    知识点 基本概念 结构体的基本使用 结构体构造器(构造函数/构造方法) 结构体扩充函数(方法), 又称成员方法 结构体是值类型 1. 基本概念 1.1 概念介绍 结构体(struct)是由一系列具有相 ...

  8. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  9. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

随机推荐

  1. 超实用,你get了吗?再也不怕本地文件更新到环境用Linux命令重启服务器了。。。

    来公司这么久,写过不少代码,可是一碰见关于Linux命令操作的马上绕过,每次都是嚷嚷同事过来帮我替换文件,重启服务器,一直害怕接触命令的我一次一次不嫌麻烦,哈哈.有没有醉了?其实我一直都知道操作不难, ...

  2. [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】

    题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...

  3. 总结Web应用中基于浏览器的安全漏洞

    ‍‍‍‍‍1.浏览器缓存 每次打开一个网站,网页的内容会缓存到用户的机器中.如果这些内容在其他网页中需要重新加载,浏览器加载的是缓存,而不是再次下载内容.如果一些Web应用商店以及显示用户敏感信息(比 ...

  4. c语言exit和return区别,在fork和vfork中使用

    转自c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: ...

  5. Keil C中全局变量的使用

    在KEIL C中,有多个源文件使用到全局变量时,可以在一个源文件中定义全局变量,在另外的源文件中用extern 声明该变量,说明该变量定义在别的文件中,将其作用域扩展到此文件. 例如:有以下两个源文件 ...

  6. HDFS文件系统基本文件命令、编程读写HDFS

    基本文件命令: 格式为:hadoop fs -cmd <args> cmd的命名通常与unix对应的命令名相同.例如,文件列表命令: hadoop fs -ls 1.添加目录和文件 HDF ...

  7. char类型关联

    SQL> create table a1(id int,name char(10)); Table created. SQL> create table a2(id int,name ch ...

  8. Executors常用的创建ExecutorService的几个方法说明

    一.线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池. new ThreadPoolExecutor(corePoolSize, maximumPoolSize, kee ...

  9. C++ Prime:指针

    指针与引用的区别:1.指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象:其二:指针无需在定义时赋值.指针在块作用域内定义如果没有被初始化,也将拥有一个不确 ...

  10. 通过jquery-ui中的sortable来实现拖拽排序

    1.引入文件 <script src="{sh::PUB}js/jquery-1.10.1.min.js"></script> <link rel=& ...