sqlite 增删改查程序,测试可用

折腾了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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值