1. /* open fire host and slora report data database */
  2. int open_report_db(void)
  3. {
  4. int rv = -;
  5. char sql[SQL_COMMAND_LEN];
  6. char *errmsg = NULL;
  7. const char *db_file = REPORT_DB_FILE;
  8.  
  9. /* If report database already exist, then we will just open it */
  10. if( ==access(db_file, F_OK) )
  11. {
  12. if( SQLITE_OK != sqlite3_open(db_file, &s_report_db) )
  13. {
  14. log_err("open report database file '%s' failure\n", db_file);
  15. return -;
  16. }
  17. log_nrml("open report database file '%s' ok\n", db_file);
  18. return ;
  19. }
  20.  
  21. pthread_mutex_lock(&s_reportdb_lock);
  22.  
  23. /* If report database file not exist, then we create it now */
  24. if( SQLITE_OK != sqlite3_open(db_file, &s_report_db) )
  25. {
  26. log_err("create report database file '%s' failure\n", db_file);
  27. pthread_mutex_unlock(&s_reportdb_lock);
  28. return -;
  29. }
  30. log_nrml("open report database file '%s' ok\n", db_file);
  31.  
  32. /* Auto increase/decrease */
  33. snprintf(sql, sizeof(sql), "pragma auto_vacuum=2;");
  34. if( SQLITE_OK != sqlite3_exec(s_report_db, sql, NULL, NULL, &errmsg) )
  35. {
  36. log_err("set pragma auto_vacuum=2 failure: %s\n", db_file, errmsg);
  37. rv = -;
  38. goto FAILED;
  39. }
  40.  
  41. /* Create firehost table in the database */
  42. strncpy(sql, "CREATE TABLE firehost(id INTEGER PRIMARY KEY autoincrement, sent BOOL DEFAULT 0, packet BLOB);", sizeof(sql));
  43. if( SQLITE_OK != sqlite3_exec(s_report_db, sql, NULL, NULL, &errmsg) )
  44. {
  45. log_err("create firehost table in report database file '%s' failure: %s\n", db_file, errmsg);
  46. rv = -;
  47. goto FAILED;
  48. }
  49.  
  50. /* Create elora table in the database */
  51. strncpy(sql, "CREATE TABLE elora(id INTEGER PRIMARY KEY autoincrement, sent BOOL DEFAULT 0, packet BLOB);", sizeof(sql));
  52. if( SQLITE_OK != sqlite3_exec(s_report_db, sql, NULL, NULL, &errmsg) )
  53. {
  54. log_err("create elora table in report database file '%s' failure: %s\n", db_file, errmsg);
  55. rv = -;
  56. goto FAILED;
  57. }
  58.  
  59. log_nrml("create report database file '%s' ok\n", db_file);
  60. pthread_mutex_unlock(&s_reportdb_lock);
  61. return ;
  62.  
  63. FAILED:
  64. log_err("Create report database '%s' failure and remove it\n", db_file);
  65. sqlite3_close(s_report_db);
  66. sqlite3_free(errmsg);
  67. unlink(db_file);
  68. pthread_mutex_unlock(&s_reportdb_lock);
  69. return rv;
  70. }
  71.  
  72. int add_reportdb_firehost(firehost_pack_t *pack)
  73. {
  74. int rv;
  75. sqlite3_stmt *stat = NULL;
  76.  
  77. if( !pack )
  78. {
  79. log_err("invalid input arguments\n");
  80. return -;
  81. }
  82.  
  83. if(!s_report_db)
  84. {
  85. log_nrml("report database not opened, try to open it now\n");
  86. if( open_report_db() < )
  87. return -;
  88. }
  89.  
  90. pthread_mutex_lock(&s_reportdb_lock);
  91.  
  92. rv = sqlite3_prepare_v2(s_report_db, "insert into firehost(packet)values(?)", -, &stat, NULL);
  93. if(SQLITE_OK!=rv || !stat)
  94. {
  95. log_err("firehost sqlite3_prepare_v2 failure\n");
  96. rv = -;
  97. goto out;
  98. }
  99.  
  100. cp_log_dump(LOG_LEVEL_NRML, (char *)pack, sizeof(*pack));
  101.  
  102. if( SQLITE_OK != sqlite3_bind_blob(stat, , pack, sizeof(*pack), NULL) )
  103. {
  104. log_err("firehost sqlite3_bind_blob failure\n");
  105. rv = -;
  106. goto out;
  107. }
  108.  
  109. rv = sqlite3_step(stat);
  110. if( SQLITE_DONE!=rv && SQLITE_ROW!=rv )
  111. {
  112. log_err("firehost sqlite3_step failure\n");
  113. rv = -;
  114. goto out;
  115. }
  116.  
  117. sqlite3_finalize(stat);
  118.  
  119. pthread_mutex_unlock(&s_reportdb_lock);
  120. log_nrml("add new firehost report data into database ok\n");
  121.  
  122. return ;
  123.  
  124. out:
  125. pthread_mutex_unlock(&s_reportdb_lock);
  126. log_nrml("add new firehost report data into database failure, rv=%d\n", rv);
  127. return rv;
  128. }
  129.  
  130. int mark_reportdb_firehost_sent(int record_id)
  131. {
  132. char sql[SQL_COMMAND_LEN];
  133. char *errmsg = NULL;
  134.  
  135. if(record_id <= )
  136. {
  137. log_err("invalid input arguments\n");
  138. return -;
  139. }
  140.  
  141. if(!s_report_db)
  142. {
  143. log_nrml("report database not opened, try to open it now\n");
  144. if( open_report_db() < )
  145. return -;
  146. }
  147.  
  148. pthread_mutex_lock(&s_reportdb_lock);
  149.  
  150. memset(sql, , sizeof(sql));
  151. snprintf(sql, sizeof(sql), "update firehost set sent=1 where id=%d;", record_id);
  152. if( SQLITE_OK != sqlite3_exec(s_report_db, sql, NULL, NULL, &errmsg) )
  153. {
  154. log_err("mark firehost packet[%d] already sent from database failure: %s\n", record_id, errmsg);
  155. sqlite3_free(errmsg);
  156. pthread_mutex_unlock(&s_reportdb_lock);
  157. return -;
  158. }
  159.  
  160. pthread_mutex_unlock(&s_reportdb_lock);
  161. log_nrml("mark firehost packet[%d] already sent from database ok\n", record_id);
  162. return ;
  163. }
  164.  
  165. int query_reportdb_firehost_unsent(int *record_id, firehost_pack_t *pack)
  166. {
  167. int rv;
  168. sqlite3_stmt *stat = NULL;
  169. const void *blob_ptr;
  170.  
  171. if( !record_id || !pack )
  172. {
  173. log_err("invalid input arguments\n");
  174. return -;
  175. }
  176.  
  177. if(!s_report_db)
  178. {
  179. log_nrml("report database not opened, try to open it now\n");
  180. if( open_report_db() < )
  181. return -;
  182. }
  183.  
  184. pthread_mutex_lock(&s_reportdb_lock);
  185.  
  186. /* Only query the first unsent packet record */
  187. rv = sqlite3_prepare_v2(s_report_db, "select id,packet from firehost where sent=0 limit 0,1;", -, &stat, NULL);
  188. if(SQLITE_OK!=rv || !stat)
  189. {
  190. log_err("firehost sqlite3_prepare_v2 failure\n");
  191. rv = -;
  192. goto out;
  193. }
  194.  
  195. rv = sqlite3_step(stat);
  196. if( SQLITE_DONE!=rv && SQLITE_ROW!=rv )
  197. {
  198. log_err("firehost sqlite3_step failure\n");
  199. rv = -;
  200. goto out;
  201. }
  202.  
  203. /* 2rd argument<0> means first segement is id */
  204. *record_id = sqlite3_column_int(stat, );
  205.  
  206. /* 2rd argument<1> means first segement is id */
  207. //blob_bytes = sqlite3_column_bytes(stat, 1 );
  208. blob_ptr = sqlite3_column_blob(stat, );
  209.  
  210. memcpy(pack, blob_ptr, sizeof(*pack));
  211.  
  212. log_trace("Read firehost packet from database:\n");
  213. cp_log_dump(LOG_LEVEL_TRACE, (char *)pack, sizeof(*pack));
  214.  
  215. sqlite3_finalize(stat);
  216.  
  217. pthread_mutex_unlock(&s_reportdb_lock);
  218. log_nrml("query new firehost report data into database ok\n");
  219. return ;
  220.  
  221. out:
  222. pthread_mutex_unlock(&s_reportdb_lock);
  223. log_nrml("query new firehost report data into database failure, rv=%d\n", rv);
  224. return rv;
  225. }

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. 2013Java最新面试题

    更新时间:2015-04-07         来源:网络         投诉删除 [看准网(Kanzhun.com)]Java面试题频道小编搜集的范文“2013Java最新面试题”,供大家阅读参考 ...

  2. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  3. c# 把 颜色值Hex 转换为 Color

    原文: http://abujj.me/archives/695 Assuming you mean the HTML type RGB codes (called Hex codes, such a ...

  4. bzoj 1257: [CQOI2007]余数之和sum 数学 && 枚举

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1779  Solved: 823[Submit][Sta ...

  5. 测试WWW方案(反向代理,负载均衡,HTTP加速缓存)

    大约图如下: NGINX FRONT(80)--->VARNISH(8080)---->LNMP BACKEND 1(80) |--->LNMP BACKEND 2(80) 主要是前 ...

  6. 【HDU1538】A Puzzle for Pirates(经典的海盗问题)

    [题目] Description A bunch of pirates have gotten their hands on a hoard of gold pieces and wish to di ...

  7. 李洪强iOS开发之-环信02_iOS SDK 介绍及导入

    李洪强iOS开发之-环信02_iOS SDK 介绍及导入 iOS SDK 介绍及导入 iOS SDK 介绍 环信 SDK 为用户开发 IM 相关的应用提供的一套完善的开发框架.包括以下几个部分: SD ...

  8. 在Eclipse中安装spket插件

    spket是一个开发JavaScript和Ext等的开发工具,它可以 是独立的IDE,也可以作为 Eclipse的插件使用,下面介绍如何在Eclipse中安装spket插件, 1.首先上 官网 htt ...

  9. BZOJ3687: 简单题

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3687 小呆开始研究集合论了,他提出了关于一个数集四个问题: 1.子集的异或和的算术和. 2.子 ...

  10. 在Windows Server 2012 上安装Exchange 2013 服务器

    前文:http://www.cnblogs.com/Liangw/archive/2011/09/19/2559944.html 安装准备: 1.加入一个存在的域(?如何建立一个域) 2.登录Wind ...