注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

sqlite安装及基本功能调试  

2012-07-01 23:43:35|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、嵌入式数据库
sqlite是比较常用的嵌入式数据库,至于为什么是这个样子,我就不再追究了,反正感觉它的接口比较简单,可以简单的包含一个sqlite3.h头文件而在代码中使用,这对于大部分使用C语言编写的嵌入式小系统有比较大的诱惑力。整个工程二进制文件也比较小,官方文档中说大概二进制文件在200KB左右。不过因为之前参与的一些嵌入式系统中使用的就是sqlite数据库,所以第一印象感觉这个数据库可能是比较适合在嵌入式中使用的,就像现在说嵌入式系统中觉得gohead http服务器应该比较流行一样。鲁迅先生“那时并不知道这所谓猹的是怎么一件东西——便是现在也没有知道——只是无端的觉得状如小狗而很凶猛。”,看来鲁迅先生也是很早一批的“不明真相的群众”。
很多相同目的的软件在基本功能上相差不大,只是说外延性的东西或多或少。对于linux操作系统,当时1W行左右的代码已经有了内核功能的雏形,虽然到现在内核将近千万行代码,里面的很多基本功能依然是作为骨干存在。或者说一个公司的企业文化,从刚创业的时候可能就已经确定,而不管之后公司发展到多大。
使用sqlite可以看到数据库中最为核心和本质的一些功能和实现方法,这些功能可以隔离外延功能的干扰,比较适合初学者,便于看到骨干内容和本质。所以可以通过这个工程来测试和分析一下数据库的入门级基础概念。
二、sqlite的安装
1、安装tclsh
sqlite在linux下的安装需要依赖tclsh工具,这个工具在默认的Fedora Core发行版中是没有安装的,所以需要手动安装。可以在http://www.tcl.tk/software/tcltk/downloadnow85.html下载源文件,将源文件下载到系统文件中,
tar xvf tcl8.5.11-src.tar.gz
cd ../tcl8.5.11/unix/
make
make install
安装完成后,在命令行中输入 tcl 后按‘tab’键,shell会自动补全为tclsh8.5,通过which tclsh8.5可以看到默认安装路径为
/usr/local/bin/tclsh8.5
由于编译错误提示为
tclsh ./tool/mksqlite3h.tcl . >sqlite3.h
/bin/sh: tclsh: command not found
所以需要手动建立tclsh的链接,执行
ln -s `which tclsh8.5` /usr/local/bin/tclsh
从而建立链接。
注意,如果在没有安装tclsh之前执行过sqlite的make,那么在安装之后需要执行一次make clean,因为上次的tclsh ./tool/mksqlite3h.tcl . >sqlite3.h命令已经生成了一个空的sqlite.h头文件,在第二次make的时候该头文件不会重新生成,导致很多编译错误。
2、sqlite安装
在tclsh安装之后,sqlite的安装就简单的多了,就是万用模式,到文件夹下执行configure,然后执行make,而make install则是可选的,本地调试即可。
为了更好的调试sqlite,可以在执行make 之前手动修改一下make中的编译选项,禁掉编译时代码的优化,也就是删除-O2选项,从而在调试的时候更加准确。
使用vim打开sqlite文件夹生成的Makefile文件,将其中的
      TCC = gcc   -g -O2 -DSQLITE_OS_UNIX=1 -I. -I${TOP}/src -I${TOP}/ext/rtree
行的-O2 删掉,从而可以更加方便的调试生成的sqlite数据库。
三、sqlite的简单测试
1、sqlite shell创建和打开数据库
这个其实无所谓shell的概念,就是编译后生成的名字为sqlite3的可执行程序,在命令行通过sqlite3后面跟上数据库文件的名字即可,如果该文件不存在,则会新建一个,如果已存在,则打开该文件
[root@Harry sqlite-src-3071300]# ./sqlite3 testinsert.db
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
2、命令格式
在其中sqlite自己的命令(相对于sql通用命令)使用‘.’开始,而对于sql语句,可以直接书写,并且需要以‘;’结束,从内部实现来看,不是以'.'开始的命令都将会转发给sql语法分析器,而语法分析器的检测就比较严格,不讲人情,不输入分号就是不让这个结束。所以如果大家在输入过程中遇到sqlite提示中出现提示符变为省略号'……',那么就意识到可能需要输入一个分号作为结束,例如下面的形式
sqlite> create
   ...>
   ...>
四、通过SQL语句看一下基本操作语义
1、查看当前系统系统中所有已经创建的表格
sqlite> .tables
tbl1  tbl2
sqlite> .schema
CREATE TABLE tbl1(one varchar(10), two smallint);
CREATE TABLE tbl2 (f1 varchar(30) primary key,f2 text,f3 real);
2、是否指定主键区别
sqlite> select * from tbl1;
hello!|10
hello!|10
hello!|10
sqlite> select * from tbl2;
hello|test|3.14
sqlite> insert into tbl1 values("hello",10);
sqlite> select * from tbl1;
hello!|10
hello!|10
hello!|10
hello|10
sqlite> insert into tbl2 values("hello","test",3.14);
Error: column f1 is not unique
在没有指定键值的情况下,完全相同的记录可以被插入任意多次,当如果指定了主键,那么在插入的过程中如果指定表中已经包含了相同键值的记录项,则操作失败。
3、通过update看sqlite的vdbe()
vdbe是sqlite对SQL语句的本地化,因为SQL语句一般比较笼统,所以需要有一个编译的机制来生成更加详细的指令动作。就像一个函数需要由库函数分解为更多条编程语言,然后由编译器转换为CPU指令,然后CPU内部可能再转换为伪指令等各种细化工作。
sqlite> explain update tbl2 set f3=3.1415926 where f1="world";
0|Trace|0|0|0||00|
1|Goto|0|25|0||00|
2|Null|0|1|2||00|
3|OpenWrite|0|3|0|3|00|
4|OpenRead|2|4|0|keyinfo(1,BINARY)|00|
5|String8|0|6|0|world|00|
6|SeekGe|2|11|6|1|00|
7|IdxGE|2|11|6|1|01|
8|IdxRowid|2|7|0||00|
9|Seek|0|7|0||00|
10|IdxRowid|2|2|0||00|
11|Close|2|0|0||00|
12|NotNull|2|14|0||00|
13|Goto|0|23|0||00|
14|NotExists|0|13|2||00|
15|Null|0|3|5||00|
16|Column|0|0|3||00|
17|Column|0|1|4||00|
18|Real|0|5|0|3.1415926|00|
19|NotExists|0|20|2||00|
20|MakeRecord|3|3|7|aae|00|
21|Insert|0|7|2|tbl2|05|
22|Goto|0|13|0||00|
23|Close|0|0|0||00|
24|Halt|0|0|0||00|
25|Transaction|0|1|0||00|
26|VerifyCookie|0|2|0||00|
27|TableLock|0|3|1|tbl2|00|
28|Goto|0|2|0||00|
sqlite>
4、各种指令的解释
对于这些编码,可以在源代码中搜索一下他们的说明(可能一些官方文档中也有,但是看代码还是最为准确的方式)。例如下面内容来自vdbe.c中注释
/* Opcode: NotNull P1 P2 * * *
**
** Jump to P2 if the value in register P1 is not NULL. 
*/


/* Opcode: NotExists P1 P2 P3 * *
**
** Use the content of register P3 as an integer key.  If a record
** with that key does not exist in table of P1, then jump to P2.
** If the record does exist, then fall through.  The cursor is left
** pointing to the record if it exists.
**
** The difference between this operation and NotFound is that this
** operation assumes the key is an integer and that P1 is a table whereas
** NotFound assumes key is a blob constructed from MakeRecord and
** P1 is an index.
**
** See also: Found, NotFound, IsUnique
*/
5、各种指令的字符串形式表示的由来
大家注意到其中生成了各种形式的指令说明,例如开始的
NotExists
直观的想,这应该有一个对应的"NotExists"字符串形式在源代码中,但是你使用任何工具搜索都找不到这种形式的单独字符串定义。所以我就自己找了一下由来,的确在源代码中没有,而是动态生成的,结果没有那么重要,现在演示一下方法:
[root@Harry sqlite-src-3071300]# grep NotExists . -r
……
Binary file ./opcodes.o matches
./opcodes.c:     /*  54 */ "NotExists",
整个sqlite工程源代码中没有这个文件,所以是动态生成的,执行
root@Harry sqlite-src-3071300]# make opcodes.c
make: `opcodes.c' is up to date.
[root@Harry sqlite-src-3071300]# make opcodes.c -B
./config.status
config.status: creating Makefile
config.status: creating sqlite3.pc
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing libtool commands
gcc  -g -O2 -o lemon ./tool/lemon.c
cp ./src/lempar.c .
cp ./src/parse.y .
rm -f parse.h
./lemon -DSQLITE_OMIT_LOAD_EXTENSION=1  parse.y
mv parse.h parse.h.temp
gawk -f ./addopcodes.awk parse.h.temp >parse.h
cat parse.h ./src/vdbe.c | gawk -f ./mkopcodeh.awk >opcodes.h
gawk -f ./mkopcodec.awk opcodes.h >opcodes.c
[root@Harry sqlite-src-3071300]#
其中mkopcodeh.awk文件中代码:
# Scan for "case OP_aaaa:" lines in the vdbe.c file
/^case OP_/ {
  name = $2
  sub(/:/,"",name)
  sub("\r","",name)
也就是它只关心vdbe.c中 case OP_AAAA形式的源代码内容,对它们进行统一提取,大家在上面的make输出中也可以看到对/src/vdbe.c内容的cat;接下来在mkopcodec.awk的工作就相对简单一下,因为前一个awk脚本已经生成了所有的OP_XXX形式,所以它搜索这个正则表达式“define OP_”,然后生成字符串就可以:
define OP_/ {
  sub("OP_","",$2)
  i = $3+0
  label[i] = $2
  if( mx<i ) mx = i
}
END {
  for(i=1; i<=mx; i++){
    printf "     /* %3d */ \"%s\",\n", i, label[i]
  }
  print "  };"
  print "  return azName[i];"
  print "}"
  print "#endif"
}
6、opcodes.h和opcode.c生成内容
有些同学可能没有时间或者懒得做这个测试(之后我可能也不会再这么做了),所以把两个文件内容贴一下:
[root@Harry sqlite-src-3071300]# cat opcodes.h
/* Automatically generated.  Do not edit */
/* See the mkopcodeh.awk script for details */
#define OP_Goto                                 1
#define OP_Gosub                                2
#define OP_Return                               3
#define OP_Yield                                4
#define OP_HaltIfNull                           5
#define OP_Halt                                 6
#define OP_Integer                              7
#define OP_Int64                                8
#define OP_Real                               130   /* same as TK_FLOAT    */
#define OP_String8                             94   /* same as TK_STRING   */
#define OP_String                               9
#define OP_Null                                10
#define OP_Blob                                11
#define OP_Variable                            12
#define OP_Move                                13
#define OP_Copy                                14
#define OP_SCopy                               15
#define OP_ResultRow                           16
#define OP_Concat                              91   /* same as TK_CONCAT   */
#define OP_Add                                 86   /* same as TK_PLUS     */
#define OP_Subtract                            87   /* same as TK_MINUS    */
#define OP_Multiply                            88   /* same as TK_STAR     */
#define OP_Divide                              89   /* same as TK_SLASH    */
#define OP_Remainder                           90   /* same as TK_REM      */
#define OP_CollSeq                             17
#define OP_Function                            18
#define OP_BitAnd                              82   /* same as TK_BITAND   */
#define OP_BitOr                               83   /* same as TK_BITOR    */
#define OP_ShiftLeft                           84   /* same as TK_LSHIFT   */
#define OP_ShiftRight                          85   /* same as TK_RSHIFT   */
#define OP_AddImm                              20
#define OP_MustBeInt                           21
#define OP_RealAffinity                        22
#define OP_ToText                             141   /* same as TK_TO_TEXT  */
#define OP_ToBlob                             142   /* same as TK_TO_BLOB  */
#define OP_ToNumeric                          143   /* same as TK_TO_NUMERIC*/
#define OP_ToInt                              144   /* same as TK_TO_INT   */
#define OP_ToReal                             145   /* same as TK_TO_REAL  */
#define OP_Eq                                  76   /* same as TK_EQ       */
#define OP_Ne                                  75   /* same as TK_NE       */
#define OP_Lt                                  79   /* same as TK_LT       */
#define OP_Le                                  78   /* same as TK_LE       */
#define OP_Gt                                  77   /* same as TK_GT       */
#define OP_Ge                                  80   /* same as TK_GE       */
#define OP_Permutation                         23
#define OP_Compare                             24
#define OP_Jump                                25
#define OP_And                                 69   /* same as TK_AND      */
#define OP_Or                                  68   /* same as TK_OR       */
#define OP_Not                                 19   /* same as TK_NOT      */
#define OP_BitNot                              93   /* same as TK_BITNOT   */
#define OP_Once                                26
#define OP_If                                  27
#define OP_IfNot                               28
#define OP_IsNull                              73   /* same as TK_ISNULL   */
#define OP_NotNull                             74   /* same as TK_NOTNULL  */
#define OP_Column                              29
#define OP_Affinity                            30
#define OP_MakeRecord                          31
#define OP_Count                               32
#define OP_Savepoint                           33
#define OP_AutoCommit                          34
#define OP_Transaction                         35
#define OP_ReadCookie                          36
#define OP_SetCookie                           37
#define OP_VerifyCookie                        38
#define OP_OpenRead                            39
#define OP_OpenWrite                           40
#define OP_OpenAutoindex                       41
#define OP_OpenEphemeral                       42
#define OP_SorterOpen                          43
#define OP_OpenPseudo                          44
#define OP_Close                               45
#define OP_SeekLt                              46
#define OP_SeekLe                              47
#define OP_SeekGe                              48
#define OP_SeekGt                              49
#define OP_Seek                                50
#define OP_NotFound                            51
#define OP_Found                               52
#define OP_IsUnique                            53
#define OP_NotExists                           54
#define OP_Sequence                            55
#define OP_NewRowid                            56
#define OP_Insert                              57
#define OP_InsertInt                           58
#define OP_Delete                              59
#define OP_ResetCount                          60
#define OP_SorterCompare                       61
#define OP_SorterData                          62
#define OP_RowKey                              63
#define OP_RowData                             64
#define OP_Rowid                               65
#define OP_NullRow                             66
#define OP_Last                                67
#define OP_SorterSort                          70
#define OP_Sort                                71
#define OP_Rewind                              72
#define OP_SorterNext                          81
#define OP_Prev                                92
#define OP_Next                                95
#define OP_SorterInsert                        96
#define OP_IdxInsert                           97
#define OP_IdxDelete                           98
#define OP_IdxRowid                            99
#define OP_IdxLT                              100
#define OP_IdxGE                              101
#define OP_Destroy                            102
#define OP_Clear                              103
#define OP_CreateIndex                        104
#define OP_CreateTable                        105
#define OP_ParseSchema                        106
#define OP_LoadAnalysis                       107
#define OP_DropTable                          108
#define OP_DropIndex                          109
#define OP_DropTrigger                        110
#define OP_IntegrityCk                        111
#define OP_RowSetAdd                          112
#define OP_RowSetRead                         113
#define OP_RowSetTest                         114
#define OP_Program                            115
#define OP_Param                              116
#define OP_FkCounter                          117
#define OP_FkIfZero                           118
#define OP_MemMax                             119
#define OP_IfPos                              120
#define OP_IfNeg                              121
#define OP_IfZero                             122
#define OP_AggStep                            123
#define OP_AggFinal                           124
#define OP_Checkpoint                         125
#define OP_JournalMode                        126
#define OP_Vacuum                             127
#define OP_IncrVacuum                         128
#define OP_Expire                             129
#define OP_TableLock                          131
#define OP_VBegin                             132
#define OP_VCreate                            133
#define OP_VDestroy                           134
#define OP_VOpen                              135
#define OP_VFilter                            136
#define OP_VColumn                            137
#define OP_VNext                              138
#define OP_VRename                            139
#define OP_VUpdate                            140
#define OP_Pagecount                          146
#define OP_MaxPgcnt                           147
#define OP_Trace                              148
#define OP_Noop                               149
#define OP_Explain                            150


/* Properties such as "out2" or "jump" that are specified in
** comments following the "case" for each opcode in the vdbe.c
** are encoded into bitvectors as follows:
*/
#define OPFLG_JUMP            0x0001  /* jump:  P2 holds jmp target */
#define OPFLG_OUT2_PRERELEASE 0x0002  /* out2-prerelease: */
#define OPFLG_IN1             0x0004  /* in1:   P1 is an input */
#define OPFLG_IN2             0x0008  /* in2:   P2 is an input */
#define OPFLG_IN3             0x0010  /* in3:   P3 is an input */
#define OPFLG_OUT2            0x0020  /* out2:  P2 is an output */
#define OPFLG_OUT3            0x0040  /* out3:  P3 is an output */
#define OPFLG_INITIALIZER {\
/*   0 */ 0x00, 0x01, 0x01, 0x04, 0x04, 0x10, 0x00, 0x02,\
/*   8 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x24, 0x24,\
/*  16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\
/*  24 */ 0x00, 0x01, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00,\
/*  32 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00,\
/*  40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11,\
/*  48 */ 0x11, 0x11, 0x08, 0x11, 0x11, 0x11, 0x11, 0x02,\
/*  56 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
/*  64 */ 0x00, 0x02, 0x00, 0x01, 0x4c, 0x4c, 0x01, 0x01,\
/*  72 */ 0x01, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\
/*  80 */ 0x15, 0x01, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\
/*  88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x01, 0x24, 0x02, 0x01,\
/*  96 */ 0x08, 0x08, 0x00, 0x02, 0x01, 0x01, 0x02, 0x00,\
/* 104 */ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
/* 112 */ 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01, 0x08,\
/* 120 */ 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00,\
/* 128 */ 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\
/* 136 */ 0x01, 0x00, 0x01, 0x00, 0x00, 0x04, 0x04, 0x04,\
/* 144 */ 0x04, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00,}
[root@Harry sqlite-src-3071300]# cat opcodes.c
/* Automatically generated.  Do not edit */
/* See the mkopcodec.awk script for details. */
#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG)
const char *sqlite3OpcodeName(int i){
 static const char *const azName[] = { "?",
     /*   1 */ "Goto",
     /*   2 */ "Gosub",
     /*   3 */ "Return",
     /*   4 */ "Yield",
     /*   5 */ "HaltIfNull",
     /*   6 */ "Halt",
     /*   7 */ "Integer",
     /*   8 */ "Int64",
     /*   9 */ "String",
     /*  10 */ "Null",
     /*  11 */ "Blob",
     /*  12 */ "Variable",
     /*  13 */ "Move",
     /*  14 */ "Copy",
     /*  15 */ "SCopy",
     /*  16 */ "ResultRow",
     /*  17 */ "CollSeq",
     /*  18 */ "Function",
     /*  19 */ "Not",
     /*  20 */ "AddImm",
     /*  21 */ "MustBeInt",
     /*  22 */ "RealAffinity",
     /*  23 */ "Permutation",
     /*  24 */ "Compare",
     /*  25 */ "Jump",
     /*  26 */ "Once",
     /*  27 */ "If",
     /*  28 */ "IfNot",
     /*  29 */ "Column",
     /*  30 */ "Affinity",
     /*  31 */ "MakeRecord",
     /*  32 */ "Count",
     /*  33 */ "Savepoint",
     /*  34 */ "AutoCommit",
     /*  35 */ "Transaction",
     /*  36 */ "ReadCookie",
     /*  37 */ "SetCookie",
     /*  38 */ "VerifyCookie",
     /*  39 */ "OpenRead",
     /*  40 */ "OpenWrite",
     /*  41 */ "OpenAutoindex",
     /*  42 */ "OpenEphemeral",
     /*  43 */ "SorterOpen",
     /*  44 */ "OpenPseudo",
     /*  45 */ "Close",
     /*  46 */ "SeekLt",
     /*  47 */ "SeekLe",
     /*  48 */ "SeekGe",
     /*  49 */ "SeekGt",
     /*  50 */ "Seek",
     /*  51 */ "NotFound",
     /*  52 */ "Found",
     /*  53 */ "IsUnique",
     /*  54 */ "NotExists",
     /*  55 */ "Sequence",
     /*  56 */ "NewRowid",
     /*  57 */ "Insert",
     /*  58 */ "InsertInt",
     /*  59 */ "Delete",
     /*  60 */ "ResetCount",
     /*  61 */ "SorterCompare",
     /*  62 */ "SorterData",
     /*  63 */ "RowKey",
     /*  64 */ "RowData",
     /*  65 */ "Rowid",
     /*  66 */ "NullRow",
     /*  67 */ "Last",
     /*  68 */ "Or",
     /*  69 */ "And",
     /*  70 */ "SorterSort",
     /*  71 */ "Sort",
     /*  72 */ "Rewind",
     /*  73 */ "IsNull",
     /*  74 */ "NotNull",
     /*  75 */ "Ne",
     /*  76 */ "Eq",
     /*  77 */ "Gt",
     /*  78 */ "Le",
     /*  79 */ "Lt",
     /*  80 */ "Ge",
     /*  81 */ "SorterNext",
     /*  82 */ "BitAnd",
     /*  83 */ "BitOr",
     /*  84 */ "ShiftLeft",
     /*  85 */ "ShiftRight",
     /*  86 */ "Add",
     /*  87 */ "Subtract",
     /*  88 */ "Multiply",
     /*  89 */ "Divide",
     /*  90 */ "Remainder",
     /*  91 */ "Concat",
     /*  92 */ "Prev",
     /*  93 */ "BitNot",
     /*  94 */ "String8",
     /*  95 */ "Next",
     /*  96 */ "SorterInsert",
     /*  97 */ "IdxInsert",
     /*  98 */ "IdxDelete",
     /*  99 */ "IdxRowid",
     /* 100 */ "IdxLT",
     /* 101 */ "IdxGE",
     /* 102 */ "Destroy",
     /* 103 */ "Clear",
     /* 104 */ "CreateIndex",
     /* 105 */ "CreateTable",
     /* 106 */ "ParseSchema",
     /* 107 */ "LoadAnalysis",
     /* 108 */ "DropTable",
     /* 109 */ "DropIndex",
     /* 110 */ "DropTrigger",
     /* 111 */ "IntegrityCk",
     /* 112 */ "RowSetAdd",
     /* 113 */ "RowSetRead",
     /* 114 */ "RowSetTest",
     /* 115 */ "Program",
     /* 116 */ "Param",
     /* 117 */ "FkCounter",
     /* 118 */ "FkIfZero",
     /* 119 */ "MemMax",
     /* 120 */ "IfPos",
     /* 121 */ "IfNeg",
     /* 122 */ "IfZero",
     /* 123 */ "AggStep",
     /* 124 */ "AggFinal",
     /* 125 */ "Checkpoint",
     /* 126 */ "JournalMode",
     /* 127 */ "Vacuum",
     /* 128 */ "IncrVacuum",
     /* 129 */ "Expire",
     /* 130 */ "Real",
     /* 131 */ "TableLock",
     /* 132 */ "VBegin",
     /* 133 */ "VCreate",
     /* 134 */ "VDestroy",
     /* 135 */ "VOpen",
     /* 136 */ "VFilter",
     /* 137 */ "VColumn",
     /* 138 */ "VNext",
     /* 139 */ "VRename",
     /* 140 */ "VUpdate",
     /* 141 */ "ToText",
     /* 142 */ "ToBlob",
     /* 143 */ "ToNumeric",
     /* 144 */ "ToInt",
     /* 145 */ "ToReal",
     /* 146 */ "Pagecount",
     /* 147 */ "MaxPgcnt",
     /* 148 */ "Trace",
     /* 149 */ "Noop",
     /* 150 */ "Explain",
  };
  return azName[i];
}
#endif
[root@Harry sqlite-src-3071300]#
7、sqlite主要代码贡献者和发起者
http://en.wikipedia.org/wiki/D._Richard_Hipp
和开源运动发起人 richard stallman 同名。
  评论这张
 
阅读(1870)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017