mysql blob 存结构体_sqlite使用blob类型存储/访问 结构体

这篇博客介绍了如何在SQLite数据库中使用BLOB类型存储结构体,通过`open_report_db`函数展示了如何创建并管理数据库,包括设置自动vacuum和创建firehost与elora两个表,这两个表都包含BLOB字段用于存储结构体数据。同时,还提供了添加新记录和标记已发送记录的函数`add_reportdb_firehost`和`mark_reportdb_firehost_sent`,以及查询未发送记录的函数`query_reportdb_firehost_unsent`。
摘要由CSDN通过智能技术生成

/* 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;

}

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

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

C语言中访问结构体成员时用&OpenCurlyQuote;&period;’和&OpenCurlyQuote;-&gt&semi;’的区别

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

C语言各类型大小,结构体大小 sizeof&lpar;struct A&rpar;

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

iOS学习之C语言结构体

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

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

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

C&num;语言基础——结构体和枚举类型

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

不可或缺 Windows Native &lpar;8&rpar; - C 语言&colon; 结构体,共用体,枚举,类型定义符

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

C&num;枚举类型和结构体

注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...

全国计算机等级考试二级教程-C语言程序设计&lowbar;第14章&lowbar;结构体、共用体和用户定义类型

函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include #include struct ...

随机推荐

18&period;1---不用加号的加法(CC150)

1,自己写的又长又臭的代码,也能AC,但是太丑了.主要是通过二进制来算. public static int addAB(int a, int b){ int res = 0; String str1 ...

noip2015-day1-t2

题意:有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学.游戏开始时,每人都只知道自己的生日.之后每一轮中, ...

Linux下的网络管理工具—OpenNMS

导读 OpenNMS的是一个运营商级别的,高度集成的,开放源码的平台,用于构建网络监控解决方案.OpenNMS有两个发行版:Meridian and Horizon.使用Meridian是可取的,对企 ...

Git与Repo入门(转载)

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAykAAADuCAIAAACyDd+sAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu ...

EF迁移

第一步是为上下文启用迁移Enable-Migrations 命令 Add-Migration AddBlogUrl 将根据自创建上次迁移以来您对模型所做的更改,为下一次迁移搭建基架. Update-D ...

浅析PC机串口通讯流控制

转自浅析PC机串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解 ...

服务器之间免密码ssh登陆

配置服务器f1(192.168.1.1)与服务器f2(192.168.1.2)之间免密码ssh登陆 一.首先,配置服务器主机名为f1.f2 1.更改/etc/sysconfig下的network文件, ...

单链表---java实现

单链表优点:1.不需要预先给出元素个数. 2.单链表插入删除时不需要移动数据元素. 单链表缺点:1.每个节点有指针,空间利用率低. 2.单链表不支持随机读取数据. Node.java package ...

Gradle 使用笔记

Springboot2.0 多模块打包问题 打包命令由gradle build 变成 gradle bootJar 或 gradle bootWar buildscript { repositorie ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值