折腾了1天,综合网上的各种经验终于搞定基本接口,测试可用,主要是为了保存交易记录。
/*
db.c
交易记录数据库模块
模块功能:对交易记录数据库系统进行各种操作
Author:Yin_zhipeng
Greate Data:2012.04.01
*/
#include <stdio.h>
#include <sys/ioctl.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <signal.h>
#include <stdlib.h>
#include "type.h"
#include "sqlite3.h"
#define SQLITE_MENU "/home/"
#define MAX_DB 32
#define TABLE_NAME "SensorData"
typedef struct
{
unsigned int id;
sqlite3 *db;
} sqlite_db;
sqlite_db user_db[MAX_DB];
int volid_db(void)
{
int i;
for (i = 0; i < MAX_DB; i++)
{
if (user_db[i].id == 0)
break;
}
if (i >= MAX_DB)
return -1;
return i;
}
int volid_db_item(int item)
{
int i;
for (i = 0; i < MAX_DB; i++)
{
if (user_db[i].id == item)
break;
}
if (i >= MAX_DB)
return -1;
return i;
}
/*
函数功能:创建交易记录数据库(数据库不能重名)并且名字不能超过16字节
*pucDBName:数据库名指针
uiRecLen:16~4090字节,该数据库的记录长度
返回值:0x0A-->内存变量校验出错
:0x00-->成功
:0x0B-->数据库系统崩溃
:0x04-->输入错误
:0x02-->数据库不存在
:0x0E-->数据库已经打开,不能删除
*/
int ST_DBCreate(unsigned char *pucDBName, unsigned int uiRecLen)
{
sqlite3 *db = NULL;
char sql[512];
char *zErrMsg = NULL;
int rc;
char fullname[40];
strcpy(fullname, SQLITE_MENU);
strcat(fullname, pucDBName);
rc = sqlite3_open(fullname,&db);
if (rc)
{
printf("get db %s error\n", pucDBName);
sqlite3_close(db);
return 0x0b;
}
else printf("get db sucess\n");
sprintf(sql, "CREATE TABLE %s(ID INTEGER PRIMARY KEY,RECORD VARCHAR(%d));",
TABLE_NAME, uiRecLen);
rc = sqlite3_exec(db, sql,NULL,NULL, &zErrMsg);
if (rc != SQLITE_OK)
{
printf("zErrMsg = %s \n", zErrMsg);
return -1;
}
else
return 0;
}
/*
函数功能:删除交易记录数据库
pszDBName:记录数据库名
返回值:0x0A-->内存变量校验出错
:0x00-->成功
:0x0B-->数据库系统崩溃
:0x02-->数据库不存在
:0x04-->输入错误
:0x08-->打开失败,已经打开了32个数据库
:0x0E-->数据库已经打开
*/
int ST_DBDel(char * pszDBName)
{
char fullname[40];
char cmd[256];
strcpy(fullname, SQLITE_MENU);
strcat(fullname, pszDBName);
sprintf(cmd, "rm %s", fullname);
if (system(cmd) == -1)
{
printf("rm error\n");
return 0x04;
}
return 0x00;
}
/*
函数功能:打开交易记录数据库
pcDBName:数据库名指针, 最多9字节
pucDBId:1~32,返回的数据库指针
返回值:0x0A-->内存变量校验出错
:0x00-->成功
:0x0B-->数据库系统崩溃
:0x02-->数据库不存在
:0x04-->输入错误
:0x08-->打开失败,已经打开了32个数据库
:0x0E-->数据库已经打开
*/
int ST_DBOpen(char *pcDBName, unsigned char *pucDBId)
{
int item;
sqlite3 *db = NULL;
int rc;
char fullname[40];
item = volid_db();
if (item == -1)
return 0x08;
strcpy(fullname, SQLITE_MENU);
strcat(fullname, pcDBName);
rc = sqlite3_open(fullname, &db);
if (!db)
{
printf("open db %s error\n",fullname);
return 0x0b;
}
memcpy(&user_db[item].db,&db,sizeof(db));
user_db[item].id = item + 1;
*pucDBId = user_db[item].id;
return 0;
}
/*
函数功能: 执行读交易记录操作
ucDBId:1~32,数据库文件号
nRecNo:表示读的起始记录号,记录号
nRecCount:表示要读的记录数,记录条数
szString:表示读入指针,记录指针
pnLen:读出记录的长度指针,记录长度
返回值:0x0A-->内存变量校验出错
:0x00-->成功
:0x0B-->数据库系统崩溃
:0x03-->数据库没有打开
:0x04-->输入错误
*/
int ST_DBReadRecord(unsigned char ucDBId, int nRecNo, int nRecCount,
char *szString, int *pnLen)
{
char sql[512];
int len = 0;
int nrow=0;
int ncolumn=0;
int rc;
char *zErrMsg = NULL;
char **azResult;
if ((user_db[ucDBId - 1].id < 0) || (user_db[ucDBId - 1].id > MAX_DB + 1))
return 0x04;
if (user_db[ucDBId - 1].id == 0)
return 0x03;
sqlite3 *db = (sqlite3 *) user_db[ucDBId - 1].db;
sprintf(sql, "SELECT * FROM %s WHERE ID BETWEEN %d AND %d;",
TABLE_NAME, nRecNo, nRecNo + nRecCount-1);
rc=sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
if (rc != SQLITE_OK)
{
printf("zErrMsg = %s \n", zErrMsg);
return -1;
}
int i = 0 ;
printf( "row:%d column=%d \n" , nrow , ncolumn );
printf( "\nThe result of querying is : \n" );
for( i=1 ; i<( nrow + 1 ) * ncolumn ; i++ )
{
printf( "azResult[%d] = %s\n", i , azResult[i] );
memcpy(szString+len,azResult[i],strlen(azResult[i]));
len+=strlen(azResult[i]);
}
*pnLen=len;
printf("result=%s\n",szString);
printf("len=%d\n",len);
return 0;
}
/*
函数功能:执行写交易记录操作
ucDBId:1~32,数据库文件号, 最多8字节
nRecNo:0表示添加在文件尾,1-N表示改写该记录;记录号
szString:如果是写记录,表示要写的记录指针;记录指针
pnLen:如果是写记录,表示记录长度指针;记录长度
返回值:0x0A-->内存变量校验出错
:0x00-->成功
:0x0B-->数据库系统崩溃
:0x03-->数据库没有打开
:0x04-->输入错误
:0x06-->无剩余空间
*/
int ST_DBWriteRecord(unsigned char ucDBId, int nRecNo, int nRecCount,
char *szString, int *pnLen)
{
char sql[512];
int ret;
char* g_caErrorMsg = NULL;
if ((user_db[ucDBId - 1].id < 0) || (user_db[ucDBId - 1].id > MAX_DB + 1))
return 0x04;
if (user_db[ucDBId - 1].id == 0)
return 0x03;
if (nRecNo != 0)
{
sprintf(sql, "UPDATE SensorData SET RECORD ='%s' WHERE ID=%d",
szString, nRecNo);
ret = sqlite3_exec(user_db[ucDBId - 1].db, sql, NULL, NULL,
&g_caErrorMsg);
if (ret != SQLITE_OK)
{
printf("changed record error%d\n", ret);
return -1;
}
else
{
sqlite3_changes(user_db[ucDBId - 1].db);
return 0x00;
}
}
else
{
sprintf(sql, "INSERT INTO %s VALUES(NULL,'%s');", TABLE_NAME,szString);
printf("%s\n",sql);
if(sqlite3_exec(user_db[ucDBId - 1].db, sql, NULL, NULL,&g_caErrorMsg)!=SQLITE_OK)
{
printf("zErrMsg = %s \n", g_caErrorMsg);
return 0x0b;
}
else return 0x00;
}
}
/*
函数功能:执行删除交易记录操作
ucDBId:1~32,数据库文件号, 最多8字节
nRecNo:表示删除的记录号;记录号
返回值:0x0A-->内存变量校验出错
:0x00-->成功
:0x0B-->数据库系统崩溃
:0x03-->数据库没有打开
:0x04-->输入错误
*/
int ST_DBDelRecord(unsigned char ucDBId, int nRecNo)
{
char sql[512];
int ret=-1;
char *zErrMsg =NULL;
if ((user_db[ucDBId - 1].id < 0) || (user_db[ucDBId - 1].id > MAX_DB + 1))
return 0x04;
if (user_db[ucDBId - 1].id == 0)
return 0x03;
sqlite3 *db = (sqlite3 *) user_db[ucDBId - 1].db;
sprintf(sql, "DELETE FROM SensorData WHERE ID=%d;", nRecNo);
ret=sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (ret != SQLITE_OK)
{
printf("zErrMsg = %s \n", zErrMsg);
return 0x0b;
}
return 0;
}
/*
函数功能:关闭交易记录数据库
ucDBID:0~32,要关闭的文件号,0表示关闭所有打开数据库文件,建议不要使用
返回值:0x0A-->内存变量校验出错
:0x00-->成功
:0x0B-->数据库系统崩溃
:0x03-->数据库没有打开
:0x04-->输入错误
*/
int ST_DBClose(unsigned char ucDBID)
{
if ((user_db[ucDBID - 1].id < 0) || (user_db[ucDBID - 1].id > MAX_DB + 1))
return 0x04;
if (user_db[ucDBID - 1].id == 0)
return 0x03;
sqlite3 *db = user_db[ucDBID - 1].db;
sqlite3_close(db);
user_db[ucDBID - 1].id = 0;
return 0;
}
/*
函数功能: 根据文件号查询文件信息,当ucItem为0~3时,需要先打开文件,当ucItem为4时,不需要打开文件
ucDBID:1~32,数据库文件号
ucItem:0-->查询当前有效记录数
:1-->查询所有记录数(包括被删除记录)
:2-->查询剩余可写记录数
:3-->查询记录长度
:4-->查询有效数据库个数
puiRecNum( 出口): 查询到的结果
返回值:0x0A-->内存变量校验出错
:0x00-->成功
:0x0B-->数据库系统崩溃
:0x03-->数据库没有打开
:0x04-->输入错误
*/
int ST_DBInfo(unsigned char ucDBID, unsigned char ucItem,
unsigned int *puiRecNum)
{
int ret;
if ((user_db[ucDBID - 1].id < 0) || (user_db[ucDBID - 1].id > MAX_DB + 1))
return 0x04;
if (user_db[ucDBID - 1].id == 0)
return 0x03;
if (ucItem == 2)
{
*puiRecNum = 1000;
return 0x00;
}
if (ucItem == 4)
{
int len = 0;
int i;
for (i = 0; i < MAX_DB; i++)
{
if (user_db[ucDBID - 1].id != 0)
len++;
}
*puiRecNum = len;
return 0;
}
if ((ucItem == 3) || (ucItem == 1))
{
const char* pTail;
sqlite3_stmt* stmt;
char sql[512];
sprintf(sql, "SELECT COUNT(*) FROM %s", TABLE_NAME);
ret = sqlite3_prepare(user_db[ucDBID - 1].db, sql, strlen(sql), &stmt,
&pTail);
if (ret != SQLITE_OK)
{
printf("get record number error\n");
return -1;
}
else
{
int recordCount = 0;
ret=sqlite3_step(stmt);
if(ret != SQLITE_ROW)
{
printf("search record number error\n");
return -1;
}
recordCount = sqlite3_column_int(stmt, 0);
printf("da have %d records\n", recordCount);
*puiRecNum = recordCount;
}
sqlite3_finalize(stmt);
return 0x00;
}
return 0x00;
}