2005年03月01日

SQLite编译安装步骤
  1. Why

    为了编译应用程序,首先要把sqlite源码包编译安装到系统。

  2. What
    1. 输入
    2. 输出
      1. 头文件

        /usr/local/include/sqlite.h

      2. 库文件

        /usr/local/lib/libsqlite.a
        /usr/local/lib/libsqlite.la
        /usr/local/lib/libsqlite.so
        /usr/local/lib/libsqlite.so.0
        /usr/local/lib/libsqlite.so.0.8.6

      3. 文档

        bld/doc目录下的超文本文件。

      4. 运行程序

        /usr/bin/sqlite

  3. Where

    在Fedora 3.0环境下进行。

  4. How
    1. 下载

      下载sqlite:你可以到http://www.sqlite.org/download.html,下载sqlite-2.8.16.tar.gz软件包;

    2. 解压

      将下载的软件包解压缩到uClinux-dist/user目录下;

        命令:

      $tar zxvf sqlite-2.8.16.tar.gz -C uClinux-dist/user/

        现在在uclinux的user目录下,你应该可以看到sqlite目录了。解压缩到这个user目录主要是要将sqlite编译成一个普通的用户应用程序。

    3. 建立安装目录

      在同级目录下建立一个子目录:
      mkdir bld
      cd bld
      ../sqlite/configure

    4. 修改配置

      好,现在我们就要对sqlite进行修改,来做移植工作。

        在下面的描述中,我们将对以下几个文件进行一定的添加、修改,从而来完成sqlite在uclinux下的编译:

      bld/main.mk 修改
      bld/Makefile 添加
      sqlite/src/os.c 修改
      sqlite/src/shell.c 修改

        对这几个文件进行修改时,请自己做好这些文件的备份,比如你可以将它们拷贝一份,改名成文件名后面带.bak。这个很重要,可以避免你在修改的过程出现问题而无法还原。

      1. 修改main.mk

        一、修改sqlite/main.mk

          1、TCCX

          将

        TCCX = $(TCC) $(OPTS) $(THREADSAFE) $(USLEEP) -I. -I$(TOP)/src

          修改为

        TCCX = $(TCC) $(OPTS) $(THREADSAFE) $(USLEEP) -I. -I$(TOP)/src $(CFLAGS)

          即加上$(CFLAGS)标记。

          2、 LIBOBJ

          找到 # Object files for the SQLite library.

          将其中的tclsqlite.o去掉。即去掉tcl有关的东西。

          如果没有tclsqlite.o,那么不用处理它。

          3、 sqlite$(EXE)

          找到类似sqlite$(EXE)的一句,将:

        sqlite$(EXE): $(TOP)/src/shell.c libsqlite.a sqlite.h
        $(TCCX) $(READLINE_FLAGS) -o sqlite$(EXE) $(TOP)/src/shell.c \
        libsqlite.a $(LIBREADLINE) $(THREADLIB)

          替换为:

        shell.o: $(TOP)/src/shell.c sqlite.h
        $(TCCX) $(READLINE_FLAGS) -c $(TOP)/src/shell.c

        sqlite$(EXE): shell.o libsqlite.a
        $(TCC) $(LDFLAGS) -o $@ shell.o \
        libsqlite.a $(LIBREADLINE) $(THREADLIB) $(LDLIBS)

          即在sqlite$(EXE)上一行加上shell.o,及在其后加上$(LDLIBS)标记。这个是对/src/shell.c的编译方法的修改。

          4、romfs

          将:

        install: sqlite libsqlite.a sqlite.h
        mv sqlite /usr/bin
        mv libsqlite.a /usr/lib
        mv sqlite.h /usr/include

          替换为:

        romfs: sqlite
        $(ROMFSINST) /bin/sqlite

          即去掉make install项,加上make romfs项。 这个很重要,这将在romfs的/bin目录下生成sqlite。

          5、clean

          将:

        clean:
        rm -f *.o sqlite libsqlite.a sqlite.h opcodes.*
        rm -f lemon lempar.c parse.* sqlite*.tar.gz
        rm -f $(PUBLISH)
        rm -f *.da *.bb *.bbg gmon.out
        rm -rf tsrc

          替换为:

        clean:
        rm -f *.o sqlite libsqlite.a sqlite.h opcodes.* sqlite.gdb
        rm -f $(PUBLISH)
        rm -f *.da *.bb *.bbg gmon.out
        rm -rf tsrc

        distclean: clean
        rm -f lemon lempar.c parse.* sqlite*.tar.gz
        rm -f config.h

          即增加make distclean项。

      2. 修改Makefile

        删除包含TCLSQLITE的部分。

      3. 修改sqlite/src/os.c

        修改sqlite/src/os.c

          如果你的sqlite包中包括os.c文件那么就对其进行修改,没有os.c文件可能是你的sqlite版本比较新,那么无须修改。

          将所有你找到的:

        if( s!=0 )

          用:

        if( s!=0 && errno != ENOSYS )

          替换。

      4. 修改sqlite/src/shell.c

        修改sqlite/src/shell.c

          1、struct previous_mode_data 结构定义项:

          将 int colWidth[100];

          用 int colWidth[20];

          替换。

          2、struct callback_data 结构定义项

          将:

        int colWidth[100];
        int actualWidth[100];
        char outfile[FILENAME_MAX];

          用:

        int colWidth[20];
        int actualWidth[20];
        char *outfilep;

          对应替换。

          再在结构下面增加:

        #ifndef FILENAME_MAX
        #define FILENAME_MAX 4095
        #endif
        char outfilename[FILENAME_MAX]; /* Filename for *out */

          即

        struct callback_data
        {

        };
        #ifndef FILENAME_MAX
        #define FILENAME_MAX 4095
        #endif
        char outfilename[FILENAME_MAX]; /* Filename for *out */

          3、函数do_meta_command(…)

          找到类似这样的一句:

        sqlite_exec(p->db, “PRAGMA database_list; “, callback, &data, &zErrMsg);

          在它的前面有一句

        memcpy(&data, p, sizeof(data));

          现在在memcpy下面增加一行

        data.cnt = 0;

          即将结构中cnt的值赋为0 ;

          现在代码会被修改成类似:

        open_db(p);
        memcpy(&data, p, sizeof(data));
        data.cnt = 0;

          再继续。

          找到类似这样的一句:

        strcmp(azArg[1],”stdout”)==0

          在它的下面的括号中:

          将 strcpy(p->outfile,”stdout”);

          用 p->outfilep = “stdout”;

          来替换。

          再在它下面的5-6行处

          将:

        strcpy(p->outfile,azArg[1]);

          用:

        strcpy(outfilename,azArg[1]);
        p->outfilep = outfilename;

          替换。

          再继续,找到类似这样的一句:

        fprintf(p->out,”%9.9s: %s\n”,”output”,

          将:

        fprintf(p->out,”%9.9s: %s\n”,”output”, strlen(p->outfile) ? p->outfile : “stdout”);

          用:

        fprintf(p->out,”%9.9s: %s\n”,”output”, p->outfilep && strlen(p->outfilep) ? p->outfilep : “stdout”);

           替换。

          完成修改。

    5. 编译

      make

    6. 安装

      make install
      make doc
      make test

2005年01月23日

IAR.visualSTATE.v5.1.2.105-NiTROUS

它是业界第一个图形化状态机设计工具, 它能为嵌入式系统产生非常紧凑的c代码。
自动从状态机模型生成C/C++ 代码
自动产生全部文档
直观的, 容易的使用图形化编辑器
丰富的验证和模拟工具,包括使用RealLink进行器件上调试能力
满足UML状态机标准[转自官方网站]

组织有效时间并优化利用

为了充分利用我们的时间, 我们应该对最大结果进行有效计划。这取决于我们的计划的质量。在开始计划您的时间之前, 您应该明确以下几点:

什么是我的长期目标? 我要在8 到10年后成为什么样?


什么是我的中期目标? 在下个10 年的目标之外, 在以后4 到5 年之内完成什么?


在下6 个月的时间之内应该完成什么以便接近我的五年计划?


什么应该是我下星期的关注点? 这个星期多少小时用于睡觉, 多少小时用于阅读, 多少小时用于训练, 多少小时用于社交等等? 关于时间的投资是现实的吗?


一旦您是确认上面这些, 然后有许多工具。如果您去任一家商店您能看以下这些东西:


日记本: 有天天式的, 星期式的, 月式的, 年计划等。不要仅仅买日记本。检查日记本的结构是否适合您的profile and responsibility。就象是选择鞋子或任一鞋类,如果没有适当地选择, 它也许捏您!


每周计划表: 您将找到显示空闲时间和日程放在桌面上的每周计划表。


日计划表: 您将发现事项列表和每日组织的材料。笔记本将符合这个目的。


定时器: 大多体育商店有定时器。您能设置定时器为固定的时间在之后提醒您活动的时间是否结束。


电子日志和计算机: 这些是非常有用帮助您管理您的时间。如果您仔细地分析各种各样的特点, 您将惊奇更多能构造您的时间。


我重覆已经说过的话:there is no such thing as no time。我们大家有同样时间。我们不同在于使用有效时间的方法不同。


想要更多要诀关于怎样组织您的时间?

请等待….

Structuring the available time to optimum use.

In order to make full use of our time, we should plan effectively for maximum results. This depends on the quality of our plan. Before starting to plan your time, you should be clear on the following:

What is my long-term goal? What is that I want to be in 8 to 10 years’ time?


What is my medium term goal? Out of the next 10-year goal, what I am going to accomplish within the next 4 to 5 years?


What I should accomplish within the next 6 months’ time so that I am nearer to my five-year plan?


What should be my focus for the next week? How many hours I should sleep, how many hours I should read, how many hours I should exercise, how many hours I should socialise, etc. in this week? Am I realistic with reference to my time investment?


Once you are clear on the above, then there are many tools. If you go to any stationary shop you can see the following:


Diaries: there are day at sight, week at sight, month at sight, yearly planners etc. Do not just buy a diary. Check if the structure of the diary fits your profile and responsibility. It is like choosing a shoe or any footwear. If not chosen properly, it may pinch you!


Weekly planners: you will find tabletop weekly planners showing time slots and schedules.


Daily sheet planners: you will find to do lists and daily organising materials. Even a notebook will serve this purpose.


Timers: there are timers available in most of the sports shops. You can set the timer for a pre determined duration after which the alarm will go off reminding you that the time that you planned for the activity on hand is over.


Electronic diaries and computers: these are very useful to help you to manage your time. If you carefully analyse the various features, you will be amazed how much more you can structure your time.


I repeat what I have been saying: there is no such thing as no time. All of us have the same amount of time. We differ in the way we use our available time.


Want more tips on how to structure your time?

Read further….

本文英文原文转自[Time-Management] 邮件列表

2005年01月22日

RistanCASE.Development.Assistant.for.C.v4.0

C 语言开发辅助工具─Development Assistant for C (DAC). 顾名思义, DAC 是一套协助您软件开发的工具,它是一个整合式的集成开发环境。主要在帮助您在C或ASM汇编语言上的写作开发与维护。
http://www.ristancase.com/dac/v40/index.php

多种开发语言项目管理工具,通过端到端的协作和版本控制工具,可以允许使用不同开发语言的程序员通过局域网、VPN、电子邮件来合作开发项目,无需服务器

Code Co-op: Peer-to-peer Version Control

Code Co-op is the version control system for collaborative software development that uses email to synchronize project files between remote locations and LAN on-site. Developers all over the world are using it for managing their day-to-day development.

Code Co-op is a full-featured, easy to use, affordable VCS that requires no server. Since there is no server to configure, Code Co-op is the easiest VCS to install and run.

2005年01月16日
解压出全部文件,编译就可以生成sqlite程序了

用VC6的编译步骤:
新建一个空的控制台程序名字就叫sqlite
将上面的全部文件加入工程
在定义一个预处理变量NO_TCL

编译生成sqlite.exe就可以用了
既然是嵌入式,哦想应该是把sqlite嵌入别的程序吧

改代码:
打开文件shell.c
把原来的main函数关掉

加入自己的代码如下
CODE

//–test
//–请参考callback
int select_callback(void *pArg, int nArg, char **azArg, char **azCol){
 int i;
 struct callback_data *p = (struct callback_data*)pArg;
 switch( p->mode ){
   case MODE_Semi:
   case MODE_List: {
     if( azArg==0 ) break;
     for(i=0; i<nArg; i++){
       char *z = azArg[i];
       if( z==0 ) z = p->nullvalue;
       fprintf(p->out, “%s”, z);
       if( i<nArg-1 ){
         fprintf(p->out, “%s”, p->separator);
       }else if( p->mode==MODE_Semi ){
         fprintf(p->out, “;\n”);
       }else{
         fprintf(p->out, “\n”);
       }
     }
     break;
   }
 }
 return 0;
}

int main(int argc, char **argv){

 char *zErrMsg = 0;
 struct callback_data data;
 int i;
 extern int sqlite3OsFileExists(const char*);

 char * SQL;
 int rc;

 main_init(&data);

 //–数据库文件
 data.zDbFilename = “C:\\tmp\\sqlitet1.db”;
 data.out = stdout;

 if( sqlite3OsFileExists(data.zDbFilename) )
 {
   open_db(&data);
 }
 else
 {
   //–open先
   open_db(&data);

//–删除表
SQL = “drop table t1;”;
   rc = sqlite3_exec(data.db, SQL, NULL, &data, &zErrMsg);

//–建表
SQL = “create table t1(id INTEGER, name VARCHAR(100));”;
   rc = sqlite3_exec(data.db, SQL, NULL, &data, &zErrMsg);

//–插入初始化数据
SQL = “insert into t1 values(0, ‘大话王’);”;
   rc = sqlite3_exec(data.db, SQL, NULL, &data, &zErrMsg);
//–continue
for (i = 1; i < 100; i++)
{
 SQL = “insert into t1 values(%d, ‘%d大话王’);”;
 rc = sqlite3_exec_printf(data.db, SQL, NULL, &data, &zErrMsg,
  i, i);
}
 }

 //–查询
 SQL = “select count(*) from t1;”;
 rc = sqlite3_exec(data.db, SQL, select_callback, &data, &zErrMsg);
 //–continue
 SQL = “select * from t1;”;
 rc = sqlite3_exec(data.db, SQL, select_callback, &data, &zErrMsg);

 set_table_name(&data, 0);
 if( db ) sqlite3_close(db);

 return 0;
}
开源嵌入式数据库Berkeley DB
作者:肖文鹏 发文时间:2004.04.09

像MySQL这类基于C/S结构的关系型数据库系统虽然代表着目前数据库应用的主流,但却并不能满足所有应用场合的需要。有时我们需要的可能只是一个简单的基于磁盘文件的数据库系统。这样不仅可以避免安装庞大的数据库服务器,而且还可以简化数据库应用程序的设计。Berkeley DB正是基于这样的思想提出来的。

Berkeley DB简介

Berkeley DB是一个开放源代码的内嵌式数据库管理系统,能够为应用程序提供高性能的数据管理服务。应用它程序员只需要调用一些简单的API就可以完成对数据的访问和管理。与常用的数据库管理系统(如MySQL和Oracle等)有所不同,在Berkeley DB中并没有数据库服务器的概念。应用程序不需要事先同数据库服务建立起网络连接,而是通过内嵌在程序中的Berkeley DB函数库来完成对数据的保存、查询、修改和删除等操作。

Berkeley DB为许多编程语言提供了实用的API接口,包括C、C++、Java、Perl、Tcl、Python和PHP等。所有同数据库相关的操作都由Berkeley DB函数库负责统一完成。这样无论是系统中的多个进程,或者是相同进程中的多个线程,都可以在同一时间调用访问数据库的函数。而底层的数据加锁、事务日志和存储管理等都在Berkeley DB函数库中实现。它们对应用程序来讲是完全透明的。俗话说:“麻雀虽小五脏俱全。”Berkeley DB函数库本身虽然只有300KB左右,但却能够用来管理多达256TB的数据,并且在许多方面的性能还能够同商业级的数据库系统相抗衡。就拿对数据的并发操作来说,Berkeley DB能够很轻松地应付几千个用户同时访问同一个数据库的情况。此外,如果想在资源受限的嵌入式系统上进行数据库管理,Berkeley DB可能就是惟一正确的选择了。

Berkeley DB作为一种嵌入式数据库系统在许多方面有着独特的优势。首先,由于其应用程序和数据库管理系统运行在相同的进程空间当中,进行数据操作时可以避免繁琐的进程间通信,因此耗费在通信上的开销自然也就降低到了极低程度。其次,Berkeley DB使用简单的函数调用接口来完成所有的数据库操作,而不是在数据库系统中经常用到的SQL语言。这样就避免了对结构化查询语言进行解析和处理所需的开销。

基本概念

Berkeley DB简化了数据库的操作模式,同时引入了一些新的基本概念,从而使得访问和管理数据库变得相对简单起来。在使用Berkeley DB提供的函数库编写数据库应用程序之前,有必要先了解以下这些基本概念。

关键字和数据

关键字(Key)和数据(Data)是Berkeley DB用来进行数据库管理的基础,由这两者构成的Key/Data对(见表1)组成了数据库中的一个基本结构单元,而整个数据库实际上就是由许多这样的结构单元所构成的。通过使用这种方式,开发人员在使用Berkeley DB提供的API来访问数据库时,只需提供关键字就能够访问到相应的数据。

Key Data 
sport football
Fruit orange
Drink beer


表1 Key/Data对

如果想将第一行中的“sport”和“football”保存到Berkeley DB数据库中,可以调用Berkeley DB函数库提供的数据保存接口。此时“sport”和“football”将分别当成关键字和数据来看待。之后如果需要从数据库中检索出该数据,可以用“sport”作为关键字进行查询。此时Berkeley DB提供的接口函数会返回与之对应的数据“football”。

关键字和数据在Berkeley DB中都是用一个名为DBT的简单结构来表示的。实际上两者都可以是任意长度的二进制数据,而DBT的作用主要是保存相应的内存地址及其长度,其结构如下所示:

typedef struct {
  void *data;
  u_int32_t size;
  u_int32_t ulen;
  u_int32_t dlen;
  u_int32_t doff;
  u_int32_t flags;
} DBT;



在使用Berkeley DB进行数据管理时,缺省情况下是一个关键字对应于一个数据,但事实上也可以将数据库配置成一个关键字对应于多个数据。

对象句柄

在Berkeley DB函数库定义的大多数函数都遵循同样的调用原则:首先创建某个结构,然后再调用该结构中的某些方法。从程序设计的角度来讲,这一点同面向对象的设计原则是非常类似的,即先创建某个对象的一个实例,然后再调用该实例的某些方法。正因如此,Berkeley DB引入了对象句柄的概念来表示实例化后的结构,并且将结构中的成员函数称为该句柄的方法。

对象句柄的引入使得程序员能够完全凭借面向对象的思想,来完成对Berkeley DB数据库的访问和操作,即使当前使用的是像C这样的结构化语言。例如,对于打开数据库的操作来说,可以调用DB的对象句柄所提供的open函数,其原型如下所示:

int DB->open(DB *db, DB_TXN *txnid, const char *file,
const char *database, DBTYPE type, u_int32_t flags, int mode);



错误处理

对于任何一个函数库来说,如何对错误进行统一的处理都是需要考虑的问题。Berkeley DB提供的所有函数都遵循同样的错误处理原则,即函数成功执行后返回零,否则的话则返回非零值。

对于系统错误(如磁盘空间不足和访问权限不够等),返回的是一个标准的值;而对于非系统错误,返回的则是一个特定的错误编码。例如,如果在数据库中没有与某个特定关键字所对应的数据,那么在通过该关键字检索数据时就会出现错误。此时函数的返回值将是DB_NOTFOUND,表示所请求的关键字并没有在数据库中出现。所有标准的errno值都是大于零的,而由Berkeley DB定义的特殊错误编码则都是小于零的。

要求程序员记住所有的错误代号既不现实也没有什么实际意义,因为Berkeley DB提供了相应的函数来获得错误代号所对应的错误描述。一旦有错误发生,只需首先调用db_strerror()函数来获得错误描述信息,然后再调用DB->err()或DB->errx()就可以很轻松地输出格式化后的错误信息。  开源嵌入式数据库Berkeley DB(2) 
作者:肖文鹏 发文时间:2004.04.09

接上一篇:开源的嵌入式数据库Berkeley DB(1)



应用统一的编程接口

使用Berkeley DB提供的函数来进行数据库的访问和管理并不复杂,在大多数场合下只需按照统一的接口标准进行调用就可以完成最基本的操作。

打开数据库

打开数据库通常要分两步进行:首先调用db_create()函数来创建DB结构的一个实例,然后再调用DB->open()函数来完成真正的打开操作。Berkeley DB将所有对数据库的操作都封装在名为DB的结构中。db_create()函数的作用就是创建一个该结构,其原型如下所示:

typedef struct__db DB;
int db_create(DB **dbp, DB_ENV *dbenv, u_int32_t flags);



将磁盘上保存的文件作为数据库打开是由DB->open()函数来完成的,其原型如下所示:

int DB->open(DB *db, DB_TXN *txnid, const char *file,
const char *database, DBTYPE type, u_int32_t flags, int mode);



下面这段代码示范了如何创建DB对象句柄及如何打开数据库文件:

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <db.h>
#define DATABASE “demo.db”
/* 以下程序代码的程序头同此*/
int main()
{ DB *dbp;
int ret;
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
  fprintf(stderr, “db_create: %s\n”, db_strerror(ret));
  exit (1);
}
if ((ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
  dbp->err(dbp, ret, “%s”, DATABASE);
  exit (1);
}
}



代码首先调用db_create()函数来创建一个DB对象句柄。变量dbp在调用成功后将成为数据库句柄,通过它可以完成对底层数据库的配置或访问。接下去调用DB->open()函数打开数据库文件,参数“DATABASE”指明对应的磁盘文件名为demo.db;参数“DB_BTREE”表示数据库底层使用的数据结构是B树;而参数“DB_CREATE”和“0664”则表明当数据库文件不存在时创建一个新的数据库文件,并且将该文件的属性值设置为0664。

错误处理是在打开数据库时必须的例行检查,这可以通过调用DB->err()函数来完成。其中参数“ret”是在调用Berkeley DB函数后返回的错误代码,其余参数则用于显示结构化的错误信息。

添加数据

向Berkeley DB数据库中添加数据可以通过调用DB->put()函数来完成,其原型如下所示:

int DB->put(DB *db, DB_TXN *txnid, DBT *key, DBT *data, u_int32_t flags);



下面这段代码示范了如何向数据库中添加新的数据:

int main()
{ DB *dbp;
DBT key, data;
int ret;
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
  fprintf(stderr, “db_create: %s\n”, db_strerror(ret));
  exit (1);
}
if ((ret = dbp->open(dbp,
  NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
  dbp->err(dbp, ret, “%s”, DATABASE);
  exit (1);
}
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = “sport”;
key.size = sizeof(“sport”);
data.data = “football”;
data.size = sizeof(“football”);
if ((ret = dbp->put(dbp, NULL, &key, &data, 0)) == 0)
  printf(“db: %s: key stored.\n”, (char *)key.data);
else
  dbp->err(dbp, ret, “DB->put”);
}



代码首先声明了两个DBT结构变量,并分别用字符串“sport”和“football”进行填充。它们随后作为关键字和数据传递给用来添加数据的DB->put()函数。DBT结构几乎会在所有同数据访问相关的函数中被用到。

在向数据库中添加数据时,如果给定的关键字已经存在,大多数应用会对于已经存在的数据采用覆盖原则。也就是说,如果数据库中已经保存了一个“sport/basketball”对,再次调用DB->put()函数添加一个“sport/football”对,那么先前保存的那些数据将会被覆盖。但Berkeley DB允许在调用DB->put()函数时指定参数“DB_NOOVERWRITE”,声明不对数据库中已经存在的数据进行覆盖,其代码如下:

if ((ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE)) == 0)
printf(“db: %s: key stored.\n”, (char *)key.data);
else
dbp->err(dbp, ret, “DB->put”);



一旦给出“DB_NOOVERWRITE”标记,如果DB->put()函数在执行过程中发现给出的关键字在数据库中已经存在了,就无法成功地把该Key/Data对添加到数据库中,于是将返回错误代号“DB_KEYEXIST”。

检索数据

从Berkeley DB数据库中检索数据可以通过调用DB->get()函数来完成,其原型如下所示:

int DB->get(DB *db, DB_TXN *txnid, DBT *key, DBT *data, u_int32_t flags);



下面这段代码示范了如何从数据库中检索出所需的数据:

int main()
{ DB *dbp;
DBT key, data;
int ret;
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
  fprintf(stderr, “db_create: %s\n”, db_strerror(ret));
  exit (1);
}
if ((ret = dbp->open(dbp,
  NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
  dbp->err(dbp, ret, “%s”, DATABASE);
  exit (1);
}
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = “sport”;
key.size = sizeof(“sport”);
if ((ret = dbp->get(dbp, NULL, &key, &data, 0)) == 0)
  printf(“db: %s: key retrieved: data was %s.\n”,
   (char *)key.data, (char *)data.data);
else
  dbp->err(dbp, ret, “DB->get”);
}



代码同样声明了两个DBT结构变量,并且调用memset()函数对它们的内容清空。虽然Berkeley DB并不强制要求在进行数据操作之前先清空它们,但出于提高代码质量考虑还是建议先进行清空操作。在进行数据检索时,对DB->get()函数的返回值进行处理是必不可少的,因为它携带着检索操作是否成功完成等信息。下面列出的是DB->get()函数的返回值:

◆ 0 函数调用成功,指定的关键字被找到;

◆ DB_NOTFOUND 函数调用成功,但指定的关键字未被找到;

◆大于0 函数调用失败,可能出现了系统错误。

删除数据

从Berkeley DB数据库中删除数据可以通过调用DB->del()函数来完成,其原型如下所示:

int DB->del(DB *db, DB_TXN *txnid, DBT *key, u_int32_t flags);



下面这段代码示范了如何从数据库中删除数据:

int main()
{ DB *dbp;
DBT key;
int ret;
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
  fprintf(stderr, “db_create: %s\n”, db_strerror(ret));
  exit (1);
}
if ((ret = dbp->open(dbp,
  NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
  dbp->err(dbp, ret, “%s”, DATABASE);
  exit (1);
}
memset(&key, 0, sizeof(key));
key.data = “sport”;
key.size = sizeof(“sport”);
if ((ret = dbp->del(dbp, NULL, &key, 0)) == 0)
  printf(“db: %s: key was deleted.\n”, (char *)key.data);
else
  dbp->err(dbp, ret, “DB->del”);
}



删除数据只需给出相应的关键字,不用指明与之对应的数据。

关闭数据库

对于一次完整的数据库操作过程来说,关闭数据库是不可或缺的一个环节。这是因为Berkeley DB需要依赖于系统底层的缓冲机制,也就是说只有在数据库正常关闭的时候,修改后的数据才有可能全部写到磁盘上,同时它所占用的资源也才能真正被全部释放。关闭数据库的操作是通过调用DB->close()函数来完成的,其原型如下所示:

int DB->close(DB *db, u_int32_t flags);



下面这段代码示范了如何在需要的时候关闭数据库:

int main()
{ DB *dbp;
DBT key, data;
int ret, t_ret;
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
  fprintf(stderr, “db_create: %s\n”, db_strerror(ret));
  exit (1);
}
if ((ret = dbp->open(dbp,
  NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
  dbp->err(dbp, ret, “%s”, DATABASE);
  goto err;
}
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = “sport”;
key.size = sizeof(“sport”);
if ((ret = dbp->get(dbp, NULL, &key, &data, 0)) == 0)
  printf(“db: %s: key retrieved: data was %s.\n”,
   (char *)key.data, (char *)data.data);
else
  dbp->err(dbp, ret, “DB->get”);
if ((t_ret = dbp->close(dbp, 0)) != 0 && ret == 0)
  ret = t_ret;
exit(ret);
}



小结

Berkeley DB这个嵌入式数据库系统使用非常简单。它没有数据库服务器的概念,也不需要复杂的SQL语句,所有对数据的操作和管理都可以通过函数调用来完成,非常适合于那些需要对数据进行简单管理的应用场合。
2005年01月05日

1 2. Cygwin的安装


1.1 2.1. Cygwin是可以在Windows下执行的Linux运行环境


本来我是安装了Linux10,但是使用过程中还是需要经常回到windows查看一些文档啊、拷贝一些文件啊,太烦了,所以呢还是决定把Cygwin搞起来,这样在windows下工作就方便多了。

Cygwin的安装有两种方法:

一种是直接在线安装,这是按配置需要下载的,但是下载的东西会很多很大,400M左右,需要的时间比较长。

第二种是先到macraigor下载一个安装包,60多M,下载速度很快。安装选项也简单。然后再执行在线安装,安装Ncurses libraries就可以了。

我开始使用第一种方法,搞了几天,重复了很多次,可老是安装不好,最后还是用第二种方法搞定的。


1.2 2.2. 下载


1.2.1 2.2.1. CYGWIN(2.0.0)


See document:
http://www.macraigor.com/full_gnu.htm <http://www.macraigor.com/full_gnu.htm>

60M.下载速度很快,我用ADSL下载速度达到70多K,比一般下载得快多了,不过我是后半夜下载的。:)


1.3 2.3. 安装


从macraigor下载的Cygwin2.0直接安装就可以了,安装过程很简单。但是似乎缺少一个组件Ncurses libraries,在make menuconfig的时候会报错,需要执行在线安装的步骤添加这个组件。


1.4 2.4. 在线安装


1.4.1 2.4.1. 下载setup.exe


See document:
www.cygwin.com <outbind://1/www.cygwin.com>

登陆
www.cygwin.com,页面上有一个Install Cygwin Now的连接,是一个setup.exe文件,直接打开也可以,推荐下载下来,存到一个目录里,这样可以把文件下载下来,以后安装就方便了。


1.4.2 2.4.2. 安装选项


必须安装的子目录(sub category): (把子目录旁边的”default”用鼠标点一下,直到变成”install”)



Archive



Base



Devel:包括gcc、make等编译工具



Libs



Net



DEShells



Utils: 包括bzip2等实用工具



如果是已经从macraigor下载安装了Cygwin,那么选择安装 Devel下的libncurses-devel一项就可以了。



大家可选择较快的下载地址,我是用的
mirrors.rcn.net,下载速度在20k左右。



必须通过cygwin提供的setup.exe进行安装,可根据安装提示一步一步进行,提供通过internet安装方式或本地安装方式。建议把cygwin整个安装包下载到本地再进行本地安装比较方便。如果无特殊需求,可简单按它的缺省安装方式安装最少数量的软件包。建议不要安装到c:\下。cygwin的问题和解答可参考cygwin FAQ。




1.5 设置


1.5.1 批处理文件


在自己生成交叉编译器之前,首先对Cygwin进行一些设置。假设Cygwin安装在e目录下,在打开Cygwin窗口之前,进入到E:\Cygwin目录。在这个目录下,有一个文件名为Cygwin.bat的批处理文件,编辑该文件,在第一行后加入set CYGWIN=title ntea,这是因为Cygwin的启动批处理文件需要启动Unix文件系统模拟。修改完毕且保存后退出。


1.5.2 SH链接


运行cygwin,在根目录下输入,cd bin

mv sh.exe sh-original.exe

ln –s bash.exe sh.exe

现在对cygwin的修改搞定。(有关修改问题大家可以看那个脚本给出的一个文档,
www.uclinux.org/pub/uclinux/archive/8306.html,帮助很大,因为这个文档对一些地方的修改做了非常详细的描述,大家仔细看看,按着进行相应改动就可以了,但是有些步骤因为由我们现在的patch就可以实现的,大家就可以不必修改,由补丁程序自动完成。


1.6 2.5. 运行


从程序组或者桌面启动Cygwin

输入:

cd /

ls

能列出目录说明就ok了。

2004年12月21日

Time based activity planning…

 

Success is nothing but a systematic application of efforts. Our activities should have an inbuilt rhythm and structure. There should be consistency, continuity, and focus. If we can ensure these parameters, we can accomplish anything without any last minute rush. We will discover that we have more time than we perceived. A well thought out plan is the pre requisite for achieving any super ordinate goal. The bigger and more difficult the goal, the better should be the quality of our planning. In fact it is all a matter of discipline.

 

You can plan your activities on the following pattern:

 

  1. Things that you should do on a daily basis: e.g. reading, exercising, going to office, checking your in-box of the computer, etc. You should also have a time frame for each activity as to how much time you want to read, how much you want to exercise, etc.
  2. Things that you should do on a weekly basis: e.g., meeting people, checking how much progress you have made in your long term goals, checking on some important projects on hand etc.
  3. Things to be done on a monthly basis: e.g. paying your phone bills, balancing your bank passbook, etc.
  4. Things that you should do every six months: e.g. checking your progress on the medium term plans, renewing old contacts, developing new contacts, etc.
  5. Things that you should do on a yearly basis: e.g. renewing your insurance policy, going for a master health check up, deciding for the investment for the year ahead, arriving at your balance sheet of income and expenditure, greeting people on their birth days and wedding days, etc.
  6. Things to be done at some other periodicity: for example renewing passport, painting your house or doing minor maintenance work for your house or office.

 

You need to know that that if the above activities are not properly planned, they may land you in a last minute crisis and tension. You should remember that nothing would be done automatically unless we plan and initiate a systematic action plan.

 

基于活动时间进行计划

 

成功是系统化应用的成果。我们的活动应该有一个内部的节奏和结构。在那里应该一致、连续和全神贯注。如果我们能确保这些因素,我们能够完成任何事情而在最后关头没有任何匆忙。我们会发现比我们预想的有更多的时间。经过严密思考的计划对于达到任意正确目标是必须的。对于大的和困难的目标,需要我们的计划有更好的质量。实际上这是训练的所有内容。 

 

你可以按照以下的方式计划你的活动:

 

1、你每天要做的事情:例如阅读、锻炼、去办公室、检查计算机的收件箱等等。对于每一项活动你应该有一个时间框架例如多少时间用于阅读、多少时间用于锻炼等等。 

 

2、每周你要做的事情:例如与人会面、检查你的长期目标完成了多少步骤,检查手上一些重要的项目等等。

 

3、每月要完成的事情:例如支付电话账单,平衡你的银行存折等等。

 

4、你每六个月要做的事情:例如检查你中期计划的过程,续订旧的合同,制定新的合同等等。

 

5、每年要做的事情:例如续订保险单,健康检查,决定下年的投资,完成你的收入和支出的资产负债表,在其他人的生日和结婚纪念日对他们进行祝贺等等。

 

6、按照其他周期要完成的事情:例如续签护照,粉刷或日常保养你的家或者办公室。

 

你需要知道如果上面这些事情没有适当的计划,会使你在最后关头处于恐慌和紧张。你应该明白除非我们进行计划和开始一个系统化的行动计划没有事情能够自动完成。

2004年10月07日

创业 | 创业论坛 | 创业项目超市| 创业联盟 | 创业指南 | 点子创业人才 | 点子论坛 | 点子,创新,广告创意,策划,发明,专利OIC点子创业俱乐部http://www.myoic.com