存档

文章标签 ‘sqlite’

OpenFetion V2.0正式版发布

十月 24th, {2010 74 条评论 22,149 人阅读过  


经过近一个月的修改测试,Openfetion 2.0正式版今天release出来了,相比于之前的1.x版本相比,2.0有更多的优点和特性,最重要的是2.0稳定性较之于之前版本登录速度更快,稳定性更高。

这次版本主要集中在解决历史版本中所存在的登录崩溃,运行时崩溃的问题,以及用户所普遍反映的登录速度过慢的问题,引入了SQLITE3来实现了数据的本地化,使登录过程需要下载的数据量很小,从而大大提高了用户登录速度,也因为实现了数据的本地化,新版本也增加了离线和离线登录功能。

新版本另一个重要的特性是检测网络状态,可以实现断线检测并自动重连,失败时会显示用户离线,而不是之前离线时直接退出程序。检测网络状态需要NetworkManager的支持,此依赖库为可选,如果安装时disable,则不具有自动重连功能。

另外新版本增加了空闲时间自动离开功能,空闲时间目前固定为3分钟。此功能需要XScreenSaver的支持,此依赖库也为可选。

另外新版本再一次更换了图标,新图标由@riku设计,由@xhacker修改,感谢二位对OpenFetion做出的贡献。

下面是ChangeLog:

2010-10-24 levin

* 修复了登录和运行时的崩溃问题
* 修复了群发短信时的崩溃问题
* 修复了添加好友时的崩溃问题
* 添加了数据本地化,实现了离线登录功能
* 添加了断线自动重连功能
* 添加了空闲时间自动离开功能
* 添加了关闭上线提示的功能
* 优化了登录过程,登录速度更快
* 更换了新版图标,更美观

程序添加的依赖库为libsqlite3,NetworkManager,XScreenSaver,Ubuntu下的安装方法如下:

sudo apt-get install libxml2-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install libssl-dev
sudo apt-get install libnotify-dev
sudo apt-get install libgstreamer0.10-dev
sudo apt-get install intltool
sudo apt-get install libsqlite3-dev
sudo apt-get install libnm-glib-dev
sudo apt-get install libxss-dev

ubuntu用户推荐使用happyaron制作的PPA安装,该PPA于10.24日晚将会更新到最新版本,安装方法如下:

sudo apt-add-repository ppa:happyaron/ppa
sudo apt-get update
sudo apt-get install openfetion

Fedora用户依赖库安装方法如下:

pkcon install gcc gstreamer-devel gtk2-devel libxml2-devel openssl-devel intltool 
sqlite-devel NetworkManager-devel libXScrnSaver-devel libnotify-devel

期待各方打包人士制作相关安装包

源码下载地址:
http://code.google.com/p/ofetion/downloads/list

Follow Me @levin108

分类: Linux 标签: , , ,

sqlite3使用手记

十月 23rd, {2010 5 条评论 16,884 人阅读过  

前几天为了解决openfetion登录速度过慢的问题,决定实现数据的本地化功能,以往采用二进制文件直接写入磁盘的形式效率和灵活性显然远远不够,于是毅然决定采用sqlite3来实现,用过之后才发现sqlite3果然是绝佳的选择,作为一种轻量型的数据库,sqlite3有着它独特的优势,简单易用,而且极为高效,当初在引入这个依赖库的时候还在犹豫,但完成后发现它所带来的用户体验绝对可以掩盖住安装时多一个小步骤的繁琐。

sqlite3第一次用,简单地把自己的使用过程写一下,以后再用到可以参考。

sqlite3对很多通过的SQL语句都支持,像SELECT,UPDATE,INSERT,DELETE等等都支持地很好,只要懂SQL语句就可以用sqlite3。

1,下面是几个比较重要的API函数:

/* 打开数据库,如果不存在则创建一个 */
int sqlite3_open(const char*, sqlite3**);
 
/* 关闭数据库 */
int sqlite3_close(sqlite3*);
 
/* 获取错误信息字符串 */
const char *sqlite3_errmsg(sqlite3*);
 
/* 执行SQL语句 */
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);
 
/* 获取SQL查询结果,其实这个函数是不推荐使用的,一方面是因为它不安全,另一方面它不能处理BLOG类型的字段,当然,在这里我在查询的时候还是使用了它,因为没有涉及到多复杂多庞大的数据,这个使用起来又简单,所以就选用了这个方法 */
int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);

还有复杂一些的API如下,我没仔细看,像sqlite3_get_table这些函数就是由下面这些API组合而成的

INT sqlite3_prepare(sqlite3*, const CHAR*, INT, sqlite3_stmt**, const CHAR**);
INT sqlite3_bind_double(sqlite3_stmt*, INT, DOUBLE);
INT sqlite3_bind_int(sqlite3_stmt*, INT, INT);
INT sqlite3_bind_int64(sqlite3_stmt*, INT, long long INT);
INT sqlite3_bind_null(sqlite3_stmt*, INT);
INT sqlite3_bind_text(sqlite3_stmt*, INT, const CHAR*, INT n, void(*)(void*));
INT sqlite3_bind_text16(sqlite3_stmt*, INT, const void*, INT n, void(*)(void*));
INT sqlite3_step(sqlite3_stmt*);

2,创建自增长类型的字段

CREATE TABLE history (id INTEGER PRIMARY KEY AUTOINCREMENT,
			name TEXT,userid TEXT,message TEXT,
			updatetime TEXT,issend INTEGER);

这个语句中创建的id字段即为自增长的字段,在插入记录的时候只需把id字段写为NULL即可实现其自增长,如:

INSERT INTO history VALUES(NULL,"levin","123456","hello sqlite3","2010-10-23",1);

3.sqlite3的限制读取条数

/* 在其它SQL数据库中SELECT指定条数的记录用如下语句:*/
SELECT TOP 10 * FROM history;
 
/* 而在sqlite3中使用下面语句:*/
SELECT * FROM history LIMIT 10

4.sqlite3的日期函数

sqlite3的日期函数还是很强大的,列举几个常用的。

/* 获取当前时间 */
SELECT DATETIME('now')
输出:2010-10-23 12:10:50
 
/* 获取当前时间偏移 */
SELECT DATETIME('now','+20 days');
输出:2010-11-12 12:12:54
 
/* 获取今年开始时间 */
SELECT DATETIME('now','start of year');
输出:2010-01-01 00:00:00
 
/* 获取本月开始时间 */
SELECT DATETIME('now','start of month');
输出:2010-10-01 00:00:00
 
/* 获取今天开始时间 */
SELECT DATETIME('now','start of day');
输出:2010-10-23 00:00:00

另外,sqlite3里面有个很重要的时间函数,strftime,这个跟POSIX里面的strftime函数很像,也是将日期类型格式化为字符串类型,如:

SELECT strftime('%Y|%m|%d','now');
2010|10|23

它的格式化字符和POSIX的strftime也完全一样,再例如我要查询本月的聊天记录,可以使用下面语句:

SELECT * FROM history WHERE 
strftime('%Y',updatetime) == strftime('%Y','now') AND
strftime('%m',updatetime) == strftime('%m','now') ;

5.写入较大数据时采用事务提高效率
我在应用sqlite3的时候其实只是写入了少量的数据,刚开始觉得效率不是什么大问题,后来有用户反馈说他的290+好友的飞信号在登录时要向磁盘写入几十S的数据,这个效率问题着实需要改善,于是采用事务来处理写入,事务的使用也非常简单,其实也就是下面的语句:

sqlite3_exec(db, "BEGIN TRANSACTION;", 0,0, &errMsg);
 
for(;;){
  insert into.....
}
 
sqlite3_exec(db, "COMMIT TRANSACTION;", 0, 0, &errMsg);

这样一系列地插入语句就可以被作为一个事务来执行,在COMMIT TRANSACTION的时候将插入操作写入磁盘,避免了每次插入记录时频繁地读写磁盘数据库,从而使效率大大提高,据说可以比单纯地插入快1000倍,这个我无从考证,不过我这里确实快了很多,几百条记录可以瞬间写入。

就在昨天一本科同学还问我会不会sqlite,我正好前两天也用了,就跟她交流了下,她问我怎么写入多条数据,呃..这个问题很简单,就是循环,在程序里面循环,想在SQL里面循环用sqlite3是做不到的,因为sqlite3忽略了很多数据库很重要的特性,它不支持存储过程,而且也没有其它数据库地高并发性,因此有的时候我多个线程同时访问同一个数据库文件的时候,便会报错说database is locked。

OK,以上只是我个人使用过程中的一点小小地总结,拿过来就用,也没做多少研究,sqlite3一些复杂的机制都没有去了解,把这些基础的东西写下来,给自己做个备份,说不定哪天还会再用到。

分类: C/C++ 标签: ,