当前位置:   article > 正文

【Linux c】 Sqlite3 操作与功能实现_sqlite3_prepare_v2

sqlite3_prepare_v2

一、Sqlite3 数据类型

二、Sqlite3 常用指令操作

三、Sqlite3 API

1. sqlite3_open ( )

2. sqlite3_errmsg ( )

3. sqlite3_close ( )

4. sqlite3_exec ( )

5. sqlite3_get_table ( )

6. sqlite3_prepare_v2 ( )

7. sqlite3_bind ( )

8. sqlite3_step ( )

9. sqlite3_finalize ( )

四、Sqlite3 事务机制 (性能优化)

1. 事务

2. 锁状态

3. SQLITE_BUSY

五、Sqlite3 磁盘同步(性能优化)

六、功能示例(增删改查、性能优化)

1. 打开 / 创建数据库

2. 检查表 / 创建表 / 删除表

3. 判断数据是否存在(某字段重复)

4. 添加数据

5. 更新数据

6. 删除数据

7. 查询数据

8. 管理数据库容量


一、Sqlite3 数据类型

  • NULL :空值

  • INTEGER:整型

  • REAL:浮点型

  • TEXT:字符串

  • BLOB:二进制

  • DATETIME:日期


二、Sqlite3 常用指令操作

  • 打开数据库  【sqlite3 dbname】
  • 查看数据库版本 【.version】
  • 查看已打开的数据库 【.database】
  • 显示表 【.table】
  • 显示表信息 【.schema】
  • 格式化输出数据 【.header on】【.mode column】
  • 导出数据库 【.dump】
  • 清理压缩数据库 【vacuum】

三、Sqlite3 API

1. sqlite3_open ( )

int sqlite3_open( const char* dbname,sqlite3* *db) 

功能打开或创建数据库文件,返回句柄
参数const char* dbname :数据库文件名, 为NULL时在RAM创建内存数据库
sqlite3* *db :数据库指针句柄
返回值成功 :SQLITE_OK
失败 :ERROR_msg
  1. sqlite3 *sqlite3_open_database()
  2. {
  3. sqlite3 *db;
  4. int ret;
  5. ret = sqlite3_open("MyDB", &db);
  6. if (ret == SQLITE_OK) {
  7. /* 打开/创建 成功*/
  8. } else {
  9. /* 打开/创建失败, 打印错误信息*/
  10. sqlite3_errmsg(db);
  11. return NULL;
  12. }
  13. return db;
  14. }

2. sqlite3_errmsg ( )

char *sqlite3_errmsg ( sqlite3* db )

功能显示错误信息
参数sqlite3* db :数据库文件句柄
返回值const char* err_msg
printf ("Error message is: %s", sqlite3_errmsg(db));

3. sqlite3_close ( )

int sqlite3_close ( sqlite3* db )

功能关闭数据库文件连接
参数sqlite3* db :数据库文件句柄
返回值成功:SQLITE_OK
阻塞失败:SQLITE_BUSY
  1. int sqlite3_close_database (sqlite3 *db)
  2. {
  3. if (db != NULL) {
  4. sqlite3_close(db);
  5. return 0;
  6. } else {
  7. return -1;
  8. }
  9. }

4. sqlite3_exec ( )

int sqlite3_exec(sqlite3* db,char* sql,exec_callback,

                                void* data,char* *err_msg)

功能回调执行SQL,包含预编译—执行
参数sqlite3* db :数据库文件句柄
char* sql :执行的sql语句字符串
exec_callback :回调函数 (无回调函数则默认0)
void* data :传入回调函数的参数 (无回调函数则默认0)
char* *err_msg :错误信息
返回值成功 :SQLITE_OK
失败 :Error_msg

int exec_handle  (void* data,int argc,char* *argv,char* *colname)

功能sqlite_exec回调函数,每次只返回单条结果
参数void* data :sqlite3_exec的传入参数
int argc :SQL功能返回结果的字段数量
char* *argv :SQL功能返回结果的内容,为一维char *数组
char* *cloname :SQL功能返回结果的字段名称,为一维char *数组
返回值

注意:必须return 0(FALSE),负责报errmsg【query aborted】

5. sqlite3_get_table ( )

int sqlite3_get_table (sqlite3* db,char* sql,char* **dbResult,

                                  int* nRow,int* nColnm,char* *errmsg)

功能非回调执行SQL
参数sqlite3* db:数据库文件句柄
char* sql:执行的sql语句
char* **dbResult:执行sql返回的结果集,一维char *数组的指针
int* nRow:返回结果集的总行数
int* nColnm:返回结果集的字段数
返回值SQLITE_OK:执行成功
Error_code:执行失败
注意事项**dbResult使用完必须用sqlite3_free_table( )释放,否则会内存泄漏
访问**dbResult要注意越界问题,否则程序会崩

6. sqlite3_prepare_v2 ( )

int sqlite3_prepare_v2 (sqlite3 *db,const char *zSql,int nByte,

                                        sqlite3_stmt **ppStmt,const char **pzTail )

功能将SQL语句文本转化为申明对象,返回对象指针
参数sqlite3* db                    :数据库文件句柄
const char* zSQL        :SQL语句
int nByte                       :SQL字节数,< 0表示取到第一个\0终止符
sqlite3_stmt* *ppStmt :预编译语句句柄
const char* *pzTail       :指向SQL语句中未使用的部分
返回值成功:SQLITE_OK
失败:Error_code,stmt =NULL

7. sqlite3_bind ( )

int sqlite3_bind_int (sqlite3_stmt* pStmt,int index,int data)

功能给预编译语句绑定整型参数
参数sqlite3_stmt *pStmt  :预编译语句句柄
int index                     :序号 ,从1开始
int data                        :整型数值
返回值成功:SQLITE_OK
失败:Error_code

int sqlite3_bind_doubule (sqlite3_stmt* pStmt,int index,double data)

功能给预编译语句绑定双精度参数
参数sqlite3_stmt *pStmt  :预编译语句句柄
int index                     :序号 ,从1开始
double data                        :双精度数值
返回值成功:SQLITE_OK
失败:Error_code

int sqlite3_bind_text (sqlite3_stmt *pStmt,int index,const char *str,

                                        int strlen,void(*)(void*))

功能给预编译语句绑定参数
参数sqlite3_stmt *pStmt  :预编译语句句柄
int index                     :序号 ,从1开始
const char *str           :绑定值
int strlen                     :str长度
void(*)(void*)              :NULL
返回值成功:SQLITE_OK
失败:Error_code

8. sqlite3_step ( )

int sqlite3_step (sqlite3_stmt *pStmt)

功能执行预编译后的SQL对象
参数sqlite3_stmt *pStmt :预编译语句句柄
返回值成功: SQLITE_OK |  SQLITE_DONE
阻塞: SQLITE_BUSY
运行错误:SQLITE_ERROR
查询成功:SQLITE_ROW

9. sqlite3_finalize ( )

int sqlite3_finalize (sqlite3_stmt *pStmt)

功能销毁预编译对象
参数sqlite3_stmt *pStmt :预编译语句对象
返回值成功:SQLITE_OK
失败:Error_code

四、Sqlite3 事务机制 (性能优化)

1. 事务

BEGIN TRANSACTION:启动事务,启动事务在内存中操作

COMMIT:提交事务,将在内存中的操作提交到库中,并无法回滚

ROLLBACK:回滚事务,对启动事务后的操作进行回滚

注意事项

  • 隐式事务:每次DML都为一次事务
  • 显式事务:当需要插入、更新、删除大量数据时,可优化处理时间       
  • 效率:事务对查询操作效率无影响,对表操作无影响 

2. 锁状态

SHARED:数据库处于读状态,多连接可同时持有,阻塞提交。

RESERVED:数据库处于写状态,多连接仅持有一个,不阻塞读

PENDING:数据库写完成,即将提交。其他连接不可再获取SHARED锁,并等待所有SHARED释放,不阻塞读

EXCLUSIVE:数据库提交事务,阻塞读

锁类型 状态共享互斥性级别
SHAREDn阻塞提交1
RESERVED1不阻塞读2
PENDING预备提交1不阻塞读3
EXCLUSIVE提交1阻塞读4

3. SQLITE_BUSY

原因连接中存在锁状态为PENDING或者EXCLUSIVE时,其他线程申请锁失败。

解决方式

        int sqlite3_busy_timeout (sqlite3* db, int ms) :等待 ms后申请锁

        int sqlite3_busy_handler (sqlite3* db, int callback_db(void*, int), void* db) :循环次数等待锁释放


五、Sqlite3 磁盘同步(性能优化)

PRAGMA synchronous = FULL :每个关键磁盘操作后同步(sqlite3默认)

PRAGMA synchronous = NORMAL:每个关键磁盘操作的序列后同步 (sqlite2默认)

PRAGMA synchronous = OFF:不进行同步,传递给操作系统完成 

同步机制安全性效率性
PRAGMA synchronous = FULL
PRAGMA synchronous = NORMAL
PRAGMA synchronous = OFF

六、功能示例(增删改查、性能优化)

1. 打开 / 创建 / 关闭 数据库

  1. sqlite3* sqlite3_open_database(char* db_name)
  2. {
  3. int rc = 0;
  4. sqlite3* db;
  5. if (db_name == NULL || strlen(db_name) == 0 ) {
  6. return NULL;
  7. }
  8. rc = sqlite3_open(db_name, &db);
  9. if (rc != SQLITE_OK) {
  10. printf("Open db error :%s", sqlite3_errmsg(db));
  11. return NULL;
  12. }
  13. return db;
  14. }
  1. void sqlite3_close_database(sqlite3 *db)
  2. {
  3. if (db != NULL) {
  4. sqlite3_close(db);
  5. }
  6. }

2. 检查表 / 创建表 / 删除表

  1. int sqlite3_IsExist_table(sqlite3* db, char* table_name)
  2. {
  3. int rc = 0;
  4. int ret = -1;
  5. char sql_str[128] = {0};
  6. char* err_msg = NULL;
  7. sprintf(sql_str, "SELECT * FROM %s", table_name);
  8. rc = sqlite3_exec(db, sql_str, 0, 0, &err_msg);
  9. if (rc != SQLITE_OK) {
  10. ret = -1; /* 表不存在*/
  11. sqlite_free(err_msg);
  12. } else {
  13. ret = 0; /* 表存在*/
  14. }
  15. return ret;
  16. }
  1. int sqlite3_Create_table(sqlite3* db, char* table_name)
  2. {
  3. int rc = 0;
  4. int ret = -1;
  5. char sql_str[128] = {0};
  6. char* err_msg = NULL;
  7. /* 字段:ID Data RealDate*/
  8. sprinft(sql_str, "CREATE TABLE IF NOT EXISTS %s (""ID INTEGER PRIMARY KEY AUTOINCREMENT, ""Data TEXT, ""RealDate DATETIME)", table_name);
  9. rc = sqlite3_exec(db, sql_str, 0, 0, err_msg);
  10. if (rc != SQLITE_OK) {
  11. printf("Create table %s error :%s", table_name, err_msg);
  12. sqlite3_free(err_msg);
  13. ret = -1;
  14. } else {
  15. ret = 0;
  16. }
  17. return ret;
  18. }
  1. int sqlite3_Delete_table(sqlite3* db, char* table_name)
  2. {
  3. int rc = 0;
  4. int ret = -1;
  5. char sql_str[128] = {0};
  6. char* err_msg = NULL;
  7. sprinft(sql_str, "DROP TABLE %s", table_name);
  8. rc = sqlite3_exec(db, sql_str, 0, 0, err_msg);
  9. if (rc != SQLITE_OK) {
  10. printf("Delete table %s error :%s", table_name, err_msg);
  11. sqlite3_free(err_msg);
  12. ret = -1;
  13. } else {
  14. ret = 0;
  15. }
  16. return ret;
  17. }

3. 判断数据是否存在(某字段重复)

  1. int IsExist_cal_handle(void *flag, int argc, char** argv, char **colname)
  2. {
  3. int i = *(int*)(flag);
  4. *(int *)(flag) = i + 1;
  5. return 0;
  6. }
  7. int sqlite3_IsExist_field(sqlite3* db, char* table_name, char* data_buf)
  8. {
  9. int ret = -1;
  10. int rc = 0;
  11. char sql_str[128] = {0};
  12. char* err_msg = NULL;
  13. int flag = 0; /* 用于回调函数计数*/
  14. sprintf(sql_str, "Select * FROM %s WHERE Data = '%s'", table_name, data_buf);
  15. rc = sqlite3_exec(db, sql_str, IsExist_cal_handle, &flag, &err_msg);
  16. if (rc != SQLITE_OK) { /* 查询失败*/
  17. printf("Check data exist error :%s", err_msg);
  18. return ret;
  19. } else {
  20. if (flag == 0 ) { /* 结果不存在*/
  21. printf("Check data Not exist");
  22. return flag;
  23. } else { /* 结果存在*/
  24. printf("Check data exist, num is %d", flag);
  25. return flag;
  26. }
  27. }
  28. }

4. 添加数据

  1. /* 添加单条数据*/
  2. int sqlite3_insert_single(sqlite3* db, char* table_name, char* data_buf)
  3. {
  4. int rc = 0;
  5. int ret = -1;
  6. char sql_str[128] = {0};
  7. char* err_msg = NULL;
  8. sprintf(sql_str, "INSERT INTO %s (ID, Data, RealDate) values(NULL, '%s', DATETIME('now', 'localtime'))", table_name, data_buf);
  9. sqlite3_busy_timeout(db, 30*1000);
  10. rc = sqlite3_exec(db, sql_str, 0, 0, &err_msg);
  11. if (rc != SQLITE_OK) {
  12. printf("Insert error :%s", err_msg);
  13. sqlite3_free(err_msg);
  14. ret = -1;
  15. } else {
  16. ret = 0;
  17. }
  18. return ret;
  19. }
  1. /* 添加多条数据, 利用显示事务机制*/
  2. /* 依次插入数据,若出现插入失败,则回滚事务;若全部成功,则提交事务*/
  3. int sqlite3_Insert_multidata(sqlite3* db, const char* table_name, char* *buff, int len)
  4. {
  5. int rc = 0
  6. int ret = -1;
  7. int i = 0;
  8. char sql_str[128] = {0};
  9. char* err_msg = NULL;
  10. rc = sqlite3_exec(db, "BEGIN;", 0, 0, 0);
  11. if (rc != SQLITE_OK) {
  12. return ret;
  13. }
  14. while (buff[i] != NULL && i < len) {
  15. memset(sql_str, 0, sizeof(sql_str));
  16. sprintf(sql_str, "INSERT INTO %s (ID, Data, RealDate) values(NULL, '%s', DATETIME('now', 'localtime'))", table_name, buff[i]);
  17. sqlite3_busy_timeout(db, 30*1000);
  18. rc = sqlite3_exec(db, sql_str, 0, 0, &err_msg);
  19. if (rc != SQLITE_OK) {
  20. printf("Insert No%d data error: %s", i + 1, err_msg);
  21. sqlite3_free(err_msg);
  22. break;
  23. } else {
  24. i++;
  25. }
  26. }
  27. if (i < len) {
  28. sqlite3_exec(db, "ROLLBACK;", 0, 0, 0);
  29. ret = -1;
  30. }
  31. if (i == len) {
  32. sqlite3_exec(db, "COMMIT;", 0, 0, 0);
  33. ret = 0;
  34. }
  35. return ret;
  36. }
  1. int sqlite3_Insert_multidata_v2 (sqlite3* db, const char* table_name, char* *buff, int len)
  2. {
  3. int rc = 0
  4. int ret = -1;
  5. int i = 0;
  6. char sql_str[128] = {0};
  7. char* err_msg = NULL;
  8. sqlite3_stmt* stmt;
  9. sprintf(sql_str, "INSERT INTO %s (ID, Data, RealDate) values (?, ?, DATETIME('now', 'localtime'))");
  10. sqlite3_exec(db, "BEGIN;", 0, 0, 0);
  11. rc = sqlite3_prepare(db, sql_str, strlen(sql_str), &stmt, 0);
  12. if (rc != SQLITE_OK) {
  13. return ret;
  14. }
  15. while(buff[i] != NULL && i < len) {
  16. sqlite3_bind_int(stmt, 1, NULL);
  17. sqlite3_bind_text(stmt, 2, buff[i], strlen(buff), NULL);
  18. rc = sqlite3_step(stmt);
  19. if ((rc != SQLITE_OK) && (rc != SQLITE_DONE)) {
  20. break;
  21. }
  22. sqlite3_reset(stmt);
  23. i++;
  24. }
  25. sqlite3_finalize(stmt);
  26. if (i < len) {
  27. sqlite3_exec(db, "ROLLBACK;", 0, 0, 0);
  28. ret = -1;
  29. }
  30. if (i == len) {
  31. sqlite3_exec(db, "COMMIT;", 0, 0, 0);
  32. ret = 0;
  33. }
  34. return ret;
  35. }

5. 更新数据

  1. /* 更新单条数据*/
  2. int sqlite3_Update_single(sqlite3* db, char* table_name, char* data_buf)
  3. {
  4. int rc = 0;
  5. int ret = -1;
  6. char sql_str[128] = {0};
  7. char* err_msg = NULL;
  8. sprintf(sql_str, "UPDATE %s SET RealDate = DATETIME('now', 'localtime') WHERE Data = '%s'", table_name, data_buf);
  9. sqlite3_busy_timeout(db, 30*1000);
  10. rc = sqlite3_exec(db, sql_str, 0, 0, &err_msg);
  11. if (rc != SQLITE_OK) {
  12. printf("Update error :%s", err_msg);
  13. sqlite3_free(err_msg);
  14. ret = -1;
  15. } else {
  16. ret = 0;
  17. }
  18. return ret;
  19. }
  1. /* 更新多条数据----事务法*/
  2. int sqlite3_Update_multidata(sqlite3* db, const char* table_name, char* *buff, int len)
  3. {
  4. int rc = 0
  5. int ret = -1;
  6. int i = 0;
  7. char sql_str[128] = {0};
  8. char* err_msg = NULL;
  9. rc = sqlite3_exec(db, "BEGIN;", 0, 0, 0);
  10. if (rc != SQLITE_OK) {
  11. return ret;
  12. }
  13. while (buff[i] != NULL && i < len) {
  14. memset(sql_str, 0, sizeof(sql_str));
  15. sprintf(sql_str, "UPDATE %s SET RealDate = DATETIME('now', 'localtime') WHERE Data = '%s'", table_name, buff[i]);
  16. sqlite3_busy_timeout(db, 30*1000);
  17. rc = sqlite3_exec(db, sql_str, 0, 0, &err_msg);
  18. if (rc != SQLITE_OK) {
  19. printf("Update No%d data error: %s", i + 1, err_msg);
  20. sqlite3_free(err_msg);
  21. break;
  22. } else {
  23. i++;
  24. }
  25. }
  26. if (i < len) {
  27. sqlite3_exec(db, "ROLLBACK;", 0, 0, 0);
  28. ret = -1;
  29. }
  30. if (i == len) {
  31. sqlite3_exec(db, "COMMIT;", 0, 0, 0);
  32. ret = 0;
  33. }
  34. return ret;
  35. }

6. 删除数据

        与添加和更新逻辑一样,参考上。

7. 查询数据

  1. /* 回调函数, 返回单次执行结果*/
  2. int exec_handle(void *data, int argc, char** argv, char **colname)
  3. {
  4. /* 计数器*/
  5. int i = *(int *)(data);
  6. *(int *)(data) = i + 1;
  7. /* 取出结果*/
  8. printf("NO.%d message: [%s] is [%s], [%s] is [%s]...", *(int*)(data), colname[0], colname[1], argv[0], argv[1]);
  9. return 0;
  10. }
  11. /* exec查找完成无论是否有结果返回的都是SQLITE_OK, 所以判断查询结果得用计数器判断*/
  12. int sqlite3_select_exec (sqlite *db, char *table_name)
  13. {
  14. char sql[MAX_INPUT] = {0};
  15. char *err_msg = NULL;
  16. int data = 0;
  17. int ret;
  18. sprintf(sql, "select * from %s Where ID > 10", table_name);
  19. sqlite3_busy_timeout(db, 30*1000);
  20. ret = sqlite3_exec(db, sql, exec_handle, &data, &err_msg);
  21. if (ret != SQLITE_OK) {
  22. /* 查询失败*/
  23. printf("exec error is:%s\n", err_msg);
  24. return -1;
  25. } else {
  26. if (data == 0) {
  27. /* 查询成功,无查询结果*/
  28. return 0;
  29. } else {
  30. /* 查询成功,有查询结果*/
  31. return 1;
  32. }
  33. }
  34. }
  1. /* 执行sql, 将结果集的某一字段进行存储*/
  2. int sqlite3_select_table(sqlite3* db, char* table_name)
  3. {
  4. int ret = 0;
  5. char sql_str[MAX_INPUT] = {0};
  6. char **res;
  7. char **data;
  8. int* Idata;
  9. int row, col;
  10. char* err_msg = NULL;
  11. int i, j;
  12. /* 执行sql, 判断执行结果*/
  13. sprintf(sql_str, "select * from %s", table_name);
  14. sqlite3_busy_timeout(db, 30*1000);
  15. ret = sqlite3_get_table(db, sql_str, &res, &row, &col, &err_msg);
  16. if (ret != SQLITE_OK) {
  17. printf("error msg is %s", err_msg);
  18. sqlite3_close_database(db);
  19. sqlite3_free(err_msg);
  20. return -1;
  21. } else if (row == 0 || col == 0){
  22. sqlite3_close_database(db);
  23. return 0;
  24. }
  25. /* 初始化动态数组*/
  26. Idata = (int*)malloc(sizeof(int) * (row + 1));
  27. data = (char **)malloc(sizeof(char *) * (row + 1));
  28. if (data == NULL) {
  29. /* fails to malloc */
  30. sqlite3_close_database(db);
  31. return -1;
  32. } else {
  33. for (i = 0; i <= row; i++) {
  34. data[i] = (char *)malloc(1024);
  35. if (data[i] == NULL) {
  36. /* fails to malloc*/
  37. sqlite3_close_database(db);
  38. return -1;
  39. } else {
  40. memset(data[i], 0, 1024);
  41. }
  42. }
  43. }
  44. /* 接收返回数据*/
  45. for (j = 1; j <= row; j++) {
  46. /* 接收字符数据*/
  47. strcpy(data[j], res[col * (row + 1) - 1]);
  48. /* 接收整型数据*/
  49. Idata[j] = atoi(res[col * (row + 1) - 1]);
  50. }
  51. /* 释放空间*/
  52. sqlite3_free_table(res);
  53. for (i = 0; i<= row; i++) {
  54. memset(data[i], 0, 1024);
  55. if (data[i] != NULL) {
  56. free(data[i]);
  57. }
  58. }
  59. free(data);
  60. free(Idata);
  61. sqlite3_close_database(db);
  62. return 1;
  63. }
  1. int sqlite3_select_prepare(sqlite3* db)
  2. {
  3. int ret, rc, i, j;
  4. int send_flag = 0;
  5. int record_num;
  6. char package_id[16] = {0};
  7. int msg_len;
  8. char db_name[32] = "/data/device_property";
  9. char db_table[32] = "device";
  10. char sql_str[128] = {0};
  11. char* err_msg = NULL;
  12. char* *res_data;
  13. struct deviceNumber* *device;
  14. sqlite3* db;
  15. sqlite3_stmt *stmt;
  16. record_num = sqlite3_get_record_num(db_name, db_table);
  17. if (record_num == 0) {
  18. return -1;
  19. }
  20. db = sqlite3_open_database(db_name);
  21. if (db == NULL) {
  22. return -1;
  23. }
  24. memset(sql_str, 0, sizeof(sql_str));
  25. sprintf(sql_str, "select * from %s", db_table);
  26. rc = sqlite3_prepare_v2(db, sql_str, sizeof(sql_str), &stmt, NULL);
  27. if (rc != SQLITE_OK) {
  28. DEBUG_INFO("[read sqlite3 device] Select error");
  29. sqlite3_close_database(db);
  30. return -1;
  31. }
  32. /* 申请内存*/
  33. /* 字符串数组*/
  34. res_data = (char**)malloc(sizeof(char*) * record_num);
  35. if (res_data == NULL) {
  36. DEBUG_INFO("[read sqlite3 device] malloc error");
  37. sqlite3_close_database(db);
  38. return -1;
  39. }
  40. for (i = 0; i < record_num; i++) {
  41. res_data[i] = (char*)malloc(MAX_DEVICE_PROPERTY_SIZE);
  42. if (res_data[i] == NULL) {
  43. sqlite3_close_database(db);
  44. DEBUG_INFO("[read sqlite3 device] malloc2 error");
  45. return -1;
  46. }
  47. }
  48. /* 结构体内存*/
  49. device = (struct deviceNumber**)malloc(sizeof(struct deviceNumber) * record_num);
  50. if (device == NULL) {
  51. DEBUG_INFO("[read sqlite3 device malloc error]");
  52. sqlite3_close_database(db);
  53. return -1;
  54. }
  55. for (i = 0; i < record_num; i++) {
  56. device[i] = (struct deviceNumber*)malloc(sizeof(struct deviceNumber));
  57. if (device[i] == NULL) {
  58. sqlite3_close_database(db);
  59. DEBUG_INFO("[read sqlite3 device] malloc2 error");
  60. return -1;
  61. }
  62. }
  63. /* 获取数据*/
  64. j = 0;
  65. while(sqlite3_step(stmt) == SQLITE_ROW) {
  66. strcpy(res_data[j] ,sqlite3_column_text(stmt, 2));
  67. strcpy(device[j]->product_key, sqlite3_column_text(stmt,3));
  68. strcpy(device[j]->device_number, sqlite3_column_text(stmt,4));
  69. strcpy(device[j]->device_secret, sqlite3_column_text(stmt,5));
  70. device[j]->reporting_center = sqlite3_column_int(stmt, 1);
  71. if (res_data[j] != NULL) {
  72. //printf("%s\n", res_data[j]);
  73. } else {
  74. printf("get history text error\n");
  75. }
  76. j ++;
  77. }
  78. /* 删除数据*/
  79. if (record_num > 0 && send_flag > 0) {
  80. ret = sqlite3_delete_device_property(db_table, record_num);
  81. if (ret < 0) {
  82. DEBUG_INFO("sqlite3_delete device property error");
  83. }
  84. }
  85. /* 释放内存*/
  86. for (i = 0; i < record_num; i++) {
  87. if (res_data[i] != NULL) {
  88. free(res_data[i]);
  89. }
  90. if (device[i] != NULL) {
  91. free(device[i]);
  92. }
  93. }
  94. if (res_data != NULL) {
  95. free(res_data);
  96. }
  97. if (device != NULL) {
  98. free(device);
  99. }
  100. sqlite3_finalize(stmt);
  101. sqlite3_close_database(db);
  102. return 0;
  103. }

8. 管理数据库容量

  1. /* 按照容量进行管理*/
  2. void sqlite3_check_database(char* db_name, char* table_name, int size)
  3. {
  4. int ret;
  5. int rc;
  6. int record_num;
  7. struct stat fstat;
  8. char sql_str[128] = {0};
  9. char* err_msg = NULL;
  10. sqlite3* db;
  11. ret = stat(db_name, &fstat);
  12. if (ret == 0) {
  13. /*数据库文件存在 */
  14. if (fstat.st_size >= size) /* st_size 单位为byte*/
  15. {
  16. record_num = sqlite3_get_record_num(db_name, table_name);
  17. db = sqlite3_open_database(db_name);
  18. if (db != NULL && record_num > 0) {
  19. memset(sql_str, 0, sizeof(sql_str));
  20. sprintf(sql_str, "DELETE FROM realtime WHERE ID in(SELECT ID FROM realtime LIMIT %d);", record_num*0.4);
  21. sqlite3_busy_timeout(db, 30*1000);
  22. rc = sqlite3_exec(db, sql_str, &err_msg);
  23. if (rc != SQLITE_OK) {
  24. printf("Delete error :%s", err_msg);
  25. sqlite3_free(err_msg);
  26. }
  27. sqlite3_busy_timeout(db, 50*1000);
  28. rc = sqlite3_exec(db, "Vacuum", 0, 0, &err_msg);
  29. if (rc != SQLITE_OK) {
  30. printf("error msg is %s", err_msg);
  31. sqlite3_free(err_msg);
  32. }
  33. sqlite3_close_database(db);
  34. }
  35. } else {
  36. /* 未达到清理容量*/
  37. }
  38. }
  39. }

总结于:

https://sqlite.org/cli.html

https://blog.csdn.net/aohun0743/article/details/101702277

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号