2007-02-28

SQLite database中获取tables

SQLite是个不错的文件型数据库,轻量级的。有很多程序中都使用了这个,如:FireFox。
如果只是想在单机上储存一些信息,希望对这些数据能够像操作数据库那样,又不想安装MySQL那些专业的数据库,这个是个很好的选择。 :)

SQLite的API接口中没有提供获取相应database中所有表的接口。
不过SQLite的database中默认有个"sqlite_master"表,储存了该database的相关信息,包括了该database包含的所有表。

// 获取所有表名,并按名称排列
SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;
// 获取所有索引,并按名称排列
SELECT name FROM sqlite_master WHERE type = 'index' ORDER BY name;


以下是获取某database中的所有表名(当然其中不包括"sqlite_master"本身)
typedef struct _table_names {
    int count;    // table count
    char **text;    // table name
} table_names;

void getTables ()
{
    const char *szSQL = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;";
    char **zRet = 0;
    int nrow, ncol;
    int i;
    if (sqlite3_get_table(pDb, szSQL, &zRet, &nrow, &ncol, &zErrMsg)) {
        fprintf (stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free (zErrMsg);
        return;
    }
    printf ("row[%d] column[%d]\n", nrow, ncol);
    tn.text = (char**) malloc (nrow*ncol*sizeof(char*));
    // 注意:这里zRet[0]是该列的表头,数据从zRet[1]开始。
    // (如果结果有3列则zRet[0],zRet[1],zRet[2]是表头)
    for (i=ncol; i<=(nrow*ncol); i++) {
        printf (" %s\t", zRet[i]);
        tn.text[i-ncol] = strdup (zRet[i]);
        tn.count++;
    }
    printf("\n");

    sqlite3_free_table (zRet);
} /* getTables () */

//EOF Read More...

2007-02-27

无聊的小游戏

今天无聊在网上做了个小测试:http://astro.sina.com.cn/t/2005-08-08/153720215.shtml
我的结果是:

选项N阿散井恋次 关键字:梦想

  你如同阿散井恋次一样,是一个追逐梦想的人。你可能本来以为你对梦想并不在意,你在意仅仅是某个人。但是,当那个人慢慢离你远去,你可能才会发现,其实你喜欢的是做某事,并且会把某事当成是梦想去追逐。我想,你最快乐的就是在追逐梦想的过程吧!祝你好运!

说我是追逐梦想的。。。仔细想想里面说的似乎也没错啊(对于我来说)
其实,这类东西都是每个都说的模令两可的。。。 不过娱乐嘛~就不要想那么多了,呵呵 :D

BTW: bleach里面我满喜欢“剑八”的,其他的人到不怎么样——虽然已经有很久没看过Bleach了。
//EOF Read More...

2007-02-25

VirtualBox桥接局域网

一般情况下用VirtualBox虚拟个东西上网直接用"NAT"(guest安装VBoxGuestAdditions.iso后)就可以了,可以实现guest<->host及guest<->Intenet。
但要guest和局域网内的机器互访,还是虚拟个网卡后用bridge好些。

首先,需要内核的支持,在编译的时候加入"802.1d Ethernet Bridging" (in "Networking options") <CONFIG_BRIDGE>支持bridge 和 "Universal TUN/TAP device driver support" (in "Network device support")<CONFIG_TUN>支持tun设备(虚拟网卡)。

以下用到的命令tunctl在包uml-utilities中,brctl在包bridge-utils中。
(uml-utilities可以在 http://user-mode-linux.sourceforge.net/dl-sf.html 下载到,我只编译了uml_utilities_20040406.tar.bz2中的./tools/tunctl)

(注:其中'davy'是我的用户名,已加入'vboxusers'组)

# ifconfig eth0 down
# modprobe tun #如果没有/dev/net/tun的话用这个加载tun模块
# tunctl -t tap1 -u davy #创建虚拟网卡tap1
# brctl addbr br_vm #创建一个网桥br_vm
# brctl addif br_vm eth0 #向网桥br_vm添加物理网卡eth0
# brctl addif br_vm tap1 #向网桥br_vm添加虚拟网卡tap1
# ifconfig eth0 0.0.0.0 promisc up
#网桥的每个物理网卡作为一个端口,运行于混杂模式,而且是在链路层工作,所以就不需要IP了。
# ifconfig br_vm 192.168.1.21 netmask 255.255.255.0 broadcast 192.168.1.255 up
#然后给br_vm的虚拟网卡配置IP:192.168.1.21,那样就能远程管理网桥。
# route add default gw 192.168.1.2 dev br_vm #为br_vm添加网关
# ifconfig tap1 up
# chown root:vboxusers /dev/net/tun
# chmod 660 /dev/net/tun


VirtualBox中把Adapter0改成 Host interface,把Interface Name 那一栏添上tap1,然后启动虚拟系统,设置好IP,就可以访问局域网上的资源了。

用完后,删除桥接:
# ifconfig br_vm down
# brctl delif br_vm eth0 #移除和网桥间的关系
# brctl delif br_vm tap1
# brctl delbr br_vm #删除br_vm
# tunctl -d tap1 #删除虚拟网卡tap1
# ifconfig eth0 192.168.1.21 netmask 255.255.255.0 broadcast 192.168.1.255 up
# route add default gw 192.168.1.2 # 重新设置IP和网关


参考资料:
http://edeca.net/articles/bridging/index.html
http://linux-net.osdl.org/index.php/Bridge (http://bridge.sourceforge.net/)

//EOF Read More...

2007-02-20

New Year Eve

今年的 New Year Eve 我们这里下了一场暴雨,记得以往的三十夜我们这边或多或少都会下场雪的,特别在我小的时候。“瑞雪兆丰年”嘛!
但是近几年下雪的时间越来越少了,去年还是下了雪。到了今年干脆就不下了——不,还是下过一点点雪,好像是“大雪”的时候,但是下到地上就融了一点下雪的样子都没有~~
记得原来小时候常看到的“冰凌”也有很久没见过了。这就是“全球变暖”吧?
//EOF Read More...