免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1310 | 回复: 0
打印 上一主题 下一主题

在嵌入式Linux上实现SQLite数据库 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-16 21:20 |只看该作者 |倒序浏览

v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

  Normal
  0
  
  7.8 磅
  0
  2
  
  false
  false
  false
  
   
   
   
   
   
   
   
   
   
   
   
   
  
  MicrosoftInternetExplorer4



st1\:*{behavior:url(#ieooui) }
/* Style Definitions */
table.MsoNormalTable
        {mso-style-name:普通表格;
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-noshow:yes;
        mso-style-parent:"";
        mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
        mso-para-margin:0cm;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:10.0pt;
        font-family:"Times New Roman";
        mso-ansi-language:#0400;
        mso-fareast-language:#0400;
        mso-bidi-language:#0400;}
在嵌入式Linux上实现SQLite数据库
Author:
mistry(qibing83@yahoo.com.cn)
1.1      
SQLite在PC机上的实现
1.1.1           
下载及安装
到网站:http://www.sqlite.org/download.html 上下载最新的版本或到chinaunix.com上下载sqlite-3.3.5。
解压后,configure的时候要指定安装路径和去掉tcl的支持,#./configure
–disable-tcl –prefix=/home/qibing/opt,然后#make #make install即可。安装后在安装目录的lib下有libsqlite3.a库和在include下有sqlite3.h头文件。
1.1.2           
编译文件及验证
在目录sqlite下编辑文件hello.c,
Hello.c
#include
#include

static
int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i;
   
    for (i = 0; i
        printf("%s = %s\n",
azColName, argv ? argv : "NULL");
    }
    printf("\n");
    return 0;
}

int
main(int argc, char **argv)
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
   
    if (argc != 3) {
        fprintf(stderr, "Usage: %s
DATABASE SQL-STATEMENT\n", argv[0]);
        exit(1);
    }
    rc = sqlite3_open(argv[1], &db);
    if (rc) {
        fprintf(stderr, "Can't open
database: %s\n", Sqlite3_errmsg(db));
        sqlite3_close(db);
        exit(1);
    }
    rc = sqlite3_exec(db, argv[2], callback, 0,
&zErrMsg);
    if (rc != SQLite_OK) {
        fprintf(stderr, "SQL error:
%s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    sqlite3_close(db);
    return 0;
}
End of hello.c
运行下面命令编译,
gcc
-I/home/qibing/opt/include -L/home/qibing/opt/lib -o hello hello.c -lsqlite3
其中-I指定sqlite3头文件的路径,-L指定sqlite3的lib库路径,-lsqlite3表示链接到sqlite3库。另外运行时还需要把/home/qibing/opt/lib路径加到LD_LIBRARY_PATH环境变量中,
#export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH: /home/qibing/opt/lib
自此,运行hello程序后跟SQL命令就可以操作数据库了。
参考《在ARM-Linux平台上移植SQLite》

       
        文件:hello.rar
        大小:0KB
        下载:
下载
       


  
  
  
  
  
  
  
  
  
  
  
  







1.2      
SQLite3的移植工作
1.1.3           
修改Makefile.linux-gcc文件
在SQLite源代码根目录下有一个Makefile.linux-gcc文件是交叉编译的参考Makefile原型。可以直接修改Makefile.linux-gcc这个文件,并在make的时候指定此文件。
l        
修改TOP,指定项目的根目录
l        
修改编译器、归档工具等为交叉编译工具
l        
去掉与TCL相关的编译选项,sqlite默认情况下会绑定tcl语言的,在这里我们不需要,可以在此处去掉
然后,#make –f  Makefie.linux-gcc 即可。
1.1.4           
SQLite的输入和输出
SQLite3是通过控制台进行用户交互的。默认情况下,SQLite的输入为stkin,输出为stkout,数据库保存在memory即内存中,SQLite是内存型数据库。
在实际应用中,数据库系统需要与MainControl进程交互,即MainControl进程将SQL语句输入给SQLite,然后由SQLite将输出结果发给MainControl进程,并将中间的数据操作结果保存在Flash中。
l        
输入,输入源为MainControl进程,通过进程间通讯实现,传输的数据大部分为SQL语句
l        
输出,输出源为MainControl进程,这里的数据有时会很大,暂时不考虑进程间通讯方式
1.1.5           
操作结果保存在Flash上
将SQLite的数据库操作结果保存在flash上有两种方法,
l        
将flash通过mount的方式挂载到Linux的文件系统上
l        
用Flash的驱动接口改写Os_Linux.c下的UnixRead()函数的实现方式
这里我们用第一种方法实现,只需把flash mount到文件系统上,并在mount的目录下建立数据库文件data.db即可。

1.3      
数据库事务性能优化
通过查看SQLite数据库事务处理的实现,事务处理模块对一个事务的最终处理是分解为多个指令而完成的。那么对于频繁操作的事务而言,数据库实现很耗时,可以通过改变执行方式来优化这些处理。在一个整体事务开始前,通过sqlite_exec()调用”BEGIN”命令禁止启动事务并禁止“自动提交”特性。整体事务完成后,通过sqlite_exec()调用”COMMIT”命令进行事务提交并启用“自动提交”特性。
下面是实现方式的模型,
事务性能的优化
cha
*pcBegin = "BEGIN";
sqlite3_exec(data.db,
pcBegin, 0, 0, 0);

int
i;
for(i
= 0; i {
       char acInsertStr[64] = {0};
       snprintf(acInsertStr, 63,
"%s%s", "INSERT INFO workers VALUES(", ,
'qixiangbing');");
       sqlite3_exec(data.db, acInsertStr, 0,
(void *)&pcErrorMsg);
}

char
*pcCommit = "COMMIT";
sqlite3_exec(data.db,
pcCommit, 0, 0, 0);
End of 事务性能的优化




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/70351/showart_1003351.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP