Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9176
  • 博文数量: 22
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-04 07:52
文章分类
文章存档

2012年(22)

我的朋友
最近访客

分类:

2012-12-04 07:53:50

原文地址:linux 下sqlite的 C编程 作者:luozhiyong131

点击(此处)折叠或打开

  1. /**
  2. * 交易记录数据库模块
  3.  * 模块功能:对交易记录数据库系统进行各种操作
  4.  * Author:Lzy
  5.  * Greate Dat:2012.11.01
  6.  */
  7. #include <stdio.h>
  8. #include <sys/ioctl.h>
  9. #include <string.h>
  10. #include <fcntl.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <sys/time.h>
  14. #include <signal.h>
  15. #include <stdlib.h>

  16. #include "sqlite3.h"

  17. #define SQLITE_MENU "/home/"
  18. #define MAX_DB 32
  19. #define TABLE_NAME "SensorData"

  20. typedef struct
  21. {
  22.     unsigned int id;
  23.     sqlite3 *db;
  24. } sqlite_db;
  25. sqlite_db user_db[MAX_DB];

  26. int volid_db(void)
  27. {
  28.     int i;
  29.     for (i = 0; i < MAX_DB; i++)
  30.     {
  31.         if (user_db[i].id == 0)
  32.             break;

  33.     }
  34.     if (i >= MAX_DB)
  35.         return -1;
  36.     return i;

  37. }

  38. int volid_db_item(int item)
  39. {
  40.     int i;
  41.     for (i = 0; i < MAX_DB; i++)
  42.     {
  43.         if (user_db[i].id == item)
  44.             break;
  45.     }
  46.     if (i >= MAX_DB)
  47.         return -1;
  48.     return i;
  49. }

  50. /**
  51.  * 函数功能:创建交易记录数据库(数据库不能重名)并且名字不能超过16字节
  52.  * *pucDBName:数据库名指针
  53.  * uiRecLen:16~4090字节,该数据库的记录长度
  54.  * 返回值         0x0A    内存变量校验出错        0x00    成功        0x0B    数据库系统崩溃        0x04    输入错误        0x0C    数据库已经存在        0x0E    数据库已经打开,不能删除
  55.  */
  56. int ST_DBCreate(char *pucDBName, unsigned int uiRecLen)
  57. {
  58.     sqlite3 *db = NULL;
  59.     char sql[512];
  60.     char *zErrMsg = NULL;
  61.     int rc;

  62.     printf("ST_DBCreate\n");
  63.     char fullname[100];
  64.     strcpy(fullname, SQLITE_MENU);
  65.     strcat(fullname, pucDBName);
  66.     rc = sqlite3_open(fullname, &db); /* 打开数据库 */
  67.     if (rc)
  68.     {
  69.         printf("get db %s error\n", pucDBName);
  70.         sqlite3_close(db);
  71.         return 0x0b;
  72.     }
  73.     else
  74.         printf("get db sucess\n");
  75.     sprintf(sql, "CREATE TABLE %s(ID INTEGER PRIMARY KEY,RECORD VARCHAR(%d));", TABLE_NAME, uiRecLen);
  76.     rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);
  77.     if (rc != SQLITE_OK)
  78.     {
  79.         printf("zErrMsg = %s \n", zErrMsg);
  80.         return 0x0c;
  81.     }
  82.     else
  83.         return 0;
  84. }

  85. /*
  86.  * 函数功能:删除交易记录数据库
  87.  * pszDBName:记录数据库名
  88.  * 返回值:0x0A-->内存变量校验出错 :0x00-->成功 :0x0B-->数据库系统崩溃 :0x02-->数据库不存在 :0x04-->输入错误 :0x08-->打开失败,已经打开了32个数据库 :0x0E-->数据库已经打开
  89.  */
  90. int ST_DBDel(char * pszDBName)
  91. {
  92.     char fullname[40];
  93.     char cmd[256];

  94.     printf("ST_DBDel\n");
  95.     strcpy(fullname, SQLITE_MENU);
  96.     strcat(fullname, pszDBName);
  97.     sprintf(cmd, "rm %s", fullname);
  98.     if (system(cmd) == -1)
  99.     {
  100.         printf("rm error\n");
  101.         return 0x04;
  102.     }
  103.     return 0x00;

  104. }

  105. /**
  106.  * 函数功能:打开交易记录数据库
  107.  * pcDBName:数据库名指针, 最多9字节
  108.  * pucDBId:1~32,返回的数据库指针
  109.  * 返回值:0x0A-->内存变量校验出错 :0x00-->成功:0x0B-->数据库系统崩溃 :0x02-->数据库不存在 :0x04-->输入错误 :0x08-->打开失败,已经打开了32个数据库 :0x0E-->数据库已经打开
  110.  */
  111. int ST_DBOpen(char *pcDBName, unsigned char *pucDBId)
  112. {
  113.     int item;
  114.     sqlite3 *db = NULL;
  115.     int rc;
  116.     char fullname[40];
  117.     //    printf("ST_DBOpen %s\n",*pcDBName);
  118.     item = volid_db();
  119.     if (item == -1)
  120.         return 0x08;

  121.     strcpy(fullname, SQLITE_MENU);
  122.     strcat(fullname, pcDBName);
  123.     rc = sqlite3_open(fullname, &db);
  124.     printf("open db %s \n", fullname);
  125.     if (!db)
  126.     {
  127.         printf("open db %s error\n", fullname);
  128.         return 0x0b;
  129.     }
  130.     memcpy(&user_db[item].db, &db, sizeof(db));
  131.     user_db[item].id = item + 1;
  132.     *pucDBId = user_db[item].id;
  133.     printf("id=%d\n", *pucDBId);
  134.     return 0;
  135. }

  136. /**
  137.  * 函数功能: 执行读交易记录操作
  138.  * ucDBId:1~32,数据库文件号
  139.  * nRecNo:表示读的起始记录号,记录号
  140.  * nRecCount:表示要读的记录数,记录条数
  141.  * szString:表示读入指针,记录指针
  142.  * pnLen:读出记录的长度指针,记录长度
  143.  * 返回值:0x0A-->内存变量校验出错 :0x00-->成功 :0x0B-->数据库系统崩溃 :0x03-->数据库没有打开 :0x04-->输入错误
  144.  */
  145. int ST_DBReadRecord(unsigned char ucDBId, int nRecNo, int nRecCount, char *szString, int *pnLen)
  146. {
  147.     char sql[2056];
  148.     int len = 0;
  149.     int nrow = 0;
  150.     int ncolumn = 0;
  151.     int rc;
  152.     char *zErrMsg = NULL;
  153.     char **azResult;
  154.     printf("get record\n");
  155.     printf("ucDBId=%d\n", ucDBId);
  156.     if (ucDBId > MAX_DB || ucDBId < 0)
  157.         return 0x04;
  158.     if ((user_db[ucDBId - 1].id < 0) || (user_db[ucDBId - 1].id > MAX_DB + 1))
  159.         return 0x04;
  160.     if (user_db[ucDBId - 1].id == 0)
  161.         return 0x03;
  162.     printf("ucDBId=%d\n", ucDBId);
  163.     sqlite3 *db = (sqlite3 *) user_db[ucDBId - 1].db;
  164.     sprintf(sql, "SELECT * FROM %s WHERE ID BETWEEN %d AND %d;", TABLE_NAME, nRecNo, nRecNo + nRecCount - 1);
  165.     printf("%s\n", sql);
  166.     rc = sqlite3_get_table(db, sql, &azResult, &nrow, &ncolumn, &zErrMsg);
  167.     printf("get table ok\n");
  168.     if (rc != SQLITE_OK)
  169.     {
  170.         printf("zErrMsg = %s \n", zErrMsg);
  171.         return 0x04;
  172.     }

  173.     int i = 0;
  174.     printf("row:%d column=%d \n", nrow, ncolumn);
  175.     if ((nrow == 0) && (ncolumn == 0))
  176.         return 0x04;
  177.     printf("\nThe result of querying is : \n");
  178.     for (i = 3; i < (nrow + 1) * ncolumn; i += 2)
  179.     {
  180.         printf("azResult[%d] = %s\n", i, azResult[i]);
  181.         memcpy(szString + len, azResult[i], strlen(azResult[i]));
  182.         len += strlen(azResult[i]);
  183.     }
  184.     *pnLen = len;
  185.     printf("len=%d\n", len);
  186.     for (i = 0; i < len; i++)
  187.     {
  188.         if (*(szString + i) == 0x01)
  189.             *(szString + i) = 0x00;
  190.     }
  191.     return 0;
  192. }

  193. /**
  194.  * 函数功能:执行写交易记录操作
  195.  * ucDBId:1~32,数据库文件号, 最多8字节
  196.  * nRecNo:0表示添加在文件尾,1-N表示改写该记录;记录号
  197.  * szString:如果是写记录,表示要写的记录指针;记录指针
  198.  * pnLen:如果是写记录,表示记录长度指针;记录长度
  199.  * 返回值:0x0A-->内存变量校验出错 :0x00-->成功 :0x0B-->数据库系统崩溃 :0x03-->数据库没有打开 :0x04-->输入错误 :0x06-->无剩余空间
  200.  */
  201. int ST_DBWriteRecord(unsigned char ucDBId, int nRecNo, int nRecCount, char *szString, int *pnLen)
  202. {
  203.     char sql[2056];
  204.     char db_string[2056];
  205.     int ret;
  206.     char *string = (char *) db_string;
  207.     memcpy(db_string, szString, *pnLen);
  208.     int i;
  209.     printf("ucDBId=%d\n", ucDBId);
  210.     printf("ST_DBWriteRecord\n");
  211.     if (ucDBId > MAX_DB || ucDBId < 0)
  212.         return 0x04;
  213.     for (i = 0; i < *pnLen; i++)
  214.     {
  215.         if (*(string + i) == '\0')
  216.             *(string + i) = 0x01;
  217.     }
  218.     char* g_caErrorMsg = NULL;
  219.     if ((user_db[ucDBId - 1].id < 0) || (user_db[ucDBId - 1].id > MAX_DB + 1))
  220.         return 0x04;
  221.     if (user_db[ucDBId - 1].id == 0)
  222.         return 0x03;
  223.     if (nRecNo != 0)
  224.     {
  225.         sprintf(sql, "UPDATE SensorData SET RECORD ='%s' WHERE ID=%d", szString, nRecNo);
  226.         ret = sqlite3_exec(user_db[ucDBId - 1].db, sql, NULL, NULL, &g_caErrorMsg);
  227.         if (ret != SQLITE_OK)
  228.         {
  229.             printf("changed record error%d\n", ret);
  230.             return -1;
  231.         }
  232.         else
  233.         {
  234.             sqlite3_changes(user_db[ucDBId - 1].db);
  235.             return 0x00;
  236.         }
  237.     }
  238.     else
  239.     {
  240.         printf("len=%d\n", *pnLen);
  241.         printf("string:%s\n", string);
  242.         sprintf(sql, "INSERT INTO %s VALUES(NULL,'%s');", TABLE_NAME, string);
  243.         printf("%s\n", sql);
  244.         if (sqlite3_exec(user_db[ucDBId - 1].db, sql, NULL, NULL, &g_caErrorMsg) != SQLITE_OK)
  245.         {
  246.             printf("zErrMsg = %s \n", g_caErrorMsg);
  247.             return 0x0b;
  248.         }
  249.         else
  250.             return 0x00;
  251.     }
  252. }

  253. /**
  254.  * 函数功能:执行删除交易记录操作
  255.  * ucDBId:1~32,数据库文件号, 最多8字节
  256.  * nRecNo:表示删除的记录号;记录号
  257.  * 返回值:0x0A-->内存变量校验出错 :0x00-->成功 :0x0B-->数据库系统崩溃 :0x03-->数据库没有打开 :0x04-->输入错误
  258.  */
  259. int ST_DBDelRecord(unsigned char ucDBId, int nRecNo)
  260. {
  261.     char sql[2056];
  262.     int ret = -1;
  263.     char *zErrMsg = NULL;
  264.     printf("ST_DBDelRecord\n");
  265.     printf("ucDBId=%d\n", ucDBId);
  266.     if (ucDBId > MAX_DB || ucDBId < 0)
  267.         return 0x04;
  268.     if ((user_db[ucDBId - 1].id < 0) || (user_db[ucDBId - 1].id > MAX_DB + 1))
  269.         return 0x04;
  270.     if (user_db[ucDBId - 1].id == 0)
  271.         return 0x03;
  272.     sqlite3 *db = (sqlite3 *) user_db[ucDBId - 1].db;
  273.     sprintf(sql, "DELETE FROM SensorData WHERE ID=%d;", nRecNo);
  274.     ret = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
  275.     if (ret != SQLITE_OK)
  276.     {
  277.         printf("zErrMsg = %s \n", zErrMsg);
  278.         return 0x0b;
  279.     }
  280.     return 0;

  281. }

  282. /**
  283.  * 函数功能:关闭交易记录数据库
  284.  * ucDBID:0~32,要关闭的文件号,0表示关闭所有打开数据库文件,建议不要使用
  285.  * 返回值:0x0A-->内存变量校验出错 :0x00-->成功 :0x0B-->数据库系统崩溃 :0x03-->数据库没有打开 :0x04-->输入错误
  286.  */
  287. int ST_DBClose(unsigned char ucDBID)
  288. {
  289.     printf("ST_DBClose\n");
  290.     printf("ucDBId=%d\n", ucDBID);
  291.     if (ucDBID > MAX_DB || ucDBID < 0)
  292.         return 0x04;
  293.     if ((user_db[ucDBID - 1].id < 0) || (user_db[ucDBID - 1].id > MAX_DB + 1))
  294.         return 0x04;
  295.     if (user_db[ucDBID - 1].id == 0)
  296.         return 0x03;
  297.     printf("close db \n");
  298.     sqlite3 *db = user_db[ucDBID - 1].db;
  299.     sqlite3_close(db);
  300.     user_db[ucDBID - 1].id = 0;
  301.     app_sleep(2000);
  302.     return 0;
  303. }

  304. /**
  305.  * 函数功能: 根据文件号查询文件信息,当ucItem为0~3时,需要先打开文件,当ucItem为4时,不需要打开文件
  306.  * ucDBID:1~32,数据库文件号
  307.  * ucItem: 0-->查询当前有效记录数 :1-->查询所有记录数(包括被删除记录) :2-->查询剩余可写记录数
  308.  *              :3-->查询记录长度     :4-->查询有效数据库个数
  309.  * puiRecNum( 出口):    查询到的结果
  310.  * 返回值:0x0A-->内存变量校验出错     :0x00-->成功     :0x0B-->数据库系统崩溃     :0x03-->数据库没有打开 :0x04-->输入错误
  311.  */
  312. int ST_DBInfo(unsigned char ucDBID, unsigned char ucItem, unsigned int *puiRecNum)
  313. {
  314.     int ret;
  315.     printf("ST_DBInfo\n");
  316.     printf("ucDBId=%d\n", ucDBID);
  317.     if (ucDBID > MAX_DB || ucDBID < 0)
  318.     {
  319.         *puiRecNum = 0;
  320.         return 0x04;
  321.     }
  322.     if ((user_db[ucDBID - 1].id < 0) || (user_db[ucDBID - 1].id > MAX_DB + 1))
  323.         return 0x04;
  324.     if (user_db[ucDBID - 1].id == 0)
  325.         return 0x03;
  326.     if (ucItem == 2)
  327.     {
  328.         *puiRecNum = 1000;
  329.         return 0x00;
  330.     }
  331.     if (ucItem == 4)
  332.     {
  333.         int len = 0;
  334.         int i;
  335.         for (i = 0; i < MAX_DB; i++)
  336.         {
  337.             if (user_db[ucDBID - 1].id != 0)
  338.                 len++;
  339.         }
  340.         *puiRecNum = len;
  341.         return 0;
  342.     }
  343.     if ((ucItem == 3) || (ucItem == 1) || (ucItem == 0))
  344.     {
  345.         const char* pTail;
  346.         sqlite3_stmt* stmt;
  347.         char sql[512];
  348.         sprintf(sql, "SELECT COUNT(*) FROM %s", TABLE_NAME);
  349.         ret = sqlite3_prepare(user_db[ucDBID - 1].db, sql, strlen(sql), &stmt, &pTail);
  350.         if (ret != SQLITE_OK)
  351.         {
  352.             printf("get record number error\n");
  353.             return -1;
  354.         }
  355.         else
  356.         {
  357.             int recordCount = 0;
  358.             ret = sqlite3_step(stmt);
  359.             if (ret != SQLITE_ROW)
  360.             {
  361.                 printf("search record number error\n");
  362.                 return -1;
  363.             }
  364.             recordCount = sqlite3_column_int(stmt, 0);
  365.             printf("da have %d records\n", recordCount);
  366.             *puiRecNum = recordCount;
  367.         }
  368.         sqlite3_finalize(stmt);
  369.         return 0x00;
  370.     }

  371.     return 0x00;
  372. }

源码: db.zip   

 

阅读(134) | 评论(0) | 转发(0) |
0

上一篇:Linux_C定时器实现

下一篇:Linux_C计时器

给主人留下些什么吧!~~