2008-11-30

冷啊!!!没有暖气的北京的冬天的屋子实在是可怕。我有点希望我现在抱着的不是一台thinkpad而是头儿那台每天倍受散热底座和御用电风扇呵护的华硕笔记本。thinkpad本来就是冷色系,而且又没温度,太发指了!冻死我了!

今天去mysql的网站寻找对mysql api更高层的封装。发现两个很令人中意的,一个是仿jdbc的Connector/C++,一个是历史相当悠久(但是貌似后来换了人维护)的mysql++。我记得以前mysql++是很简陋的,但是现在发现它真的是做的不错。有这么几点:

  • 文档很漂亮。doxygen生的reference manual和一篇排版及内容都很漂亮的user manual。
  • 支持简单的Structure mapping。嗯,我说的不是ORM。因为首先,它是简单的类似POD那样的东西。不存在继承和多态,于是充其量算ADT,和OO无缘。其次,它只支持 表 <-> struct 之间的 一一对应,不能把一个用户自定义的collection影射到多张表,反之亦然。呃,无论如何,对于像我这些被hibernate惯坏的孩子来说,它太可爱了
  • 支持参数化查询。就是先用一个带%d、%s这样的sql字符串构造一个Query,然后AddParamXXX的方式添加参数,然后执行查询。呃,我在说别的,ADO.net或JDBC。mysql++的参数化查询要简单的多,只有两种格式,大写的%Q和小写的%q,但是,也足够了。说句题外话,我以前在一家很NB的公司工作看一些很NB的C/C++程序员写下来的NB代码,它们很好很精致,但是sql注入漏洞频频。另外,asp的程序员也好这个口。但是从那些满大街都是的无论多小白的C#程序员的代码中,却很少遇见这样的漏洞。因为越傻越天真就越懒,绝不会自己去构造sql查询语句或者自己写转义函数。我还真见有人放着mysql的escape api不用,自己去写转义函数。结果忽略了字符集的影响。呃……

mysqlpp尽管进步不少,但是在使用的时候还是会有那么些奇奇怪怪的问题。比如我最初在cygwin下把它编译成dll使用的时候,一般都没有问题,但是有一个option类,却遇到了奇怪的dll导出的问题。还有,给数据库连接设定字符集,多么常见的操作啊,但是mysqlpp的文档只字不提这个,笔墨被花去夸赞icu和iconv了。还有,它在将它那套structure mapping 方案的时候,完全没有提及遇到auto increment字段的时候该怎么办。多常见的问题啊。我的解决办法是放个NULL进去,然后让mysql server去取默认值。另外,我不知道它的ResultSet的insert_id()函数的实现是什么样的。是否是又去执行了一条sql语句?翻了下maillist,以前这个咚咚是放在connection类或者query中的。如果是在connection类中,必然是单独执行一条语句了?我可不希望这样。万一我add了一个user,然后再去查insert_id因为并发性得到的却是另外一个user的uid,那么我可要疯了。(后面会发生什么?)

另外,最近几天就是在eclipse和vc9之间徘徊。因为最近大半年都在写java,所以对eclipse十分偏爱,但是无奈它的cdt还是很简陋,而且bug颇多,而且非常不适合我的使用习惯。我就是想手写makefile,让它生,那我放服务器上编译的时候怎么办?autoconf导出的那些参数怎么引用?还有,我不想把源代码和项目文件放一个目录,因为我还得建vc的工程呢,我不喜欢cdt规定的那样的代码目录。但是新建项目的时候偏偏还不让我把src目录设置为当前目录。那好,我导入吧,它采用的是copy的方式复制到项目的src目录下去,我填E:\Projects\xxx\src的结果是它在当前目录给我建了个Projects\xxx\src。气死我。那我做link呢?无休止的报error后怎么也进行不下去。当我最终不知怎么终于建成功了,然后又发现一些很致命的问题。首先,eclipse在win下主要是使用cygwin/mingw的gcc组件来编译,而cygwin的路径都是/cygdrive/xxxx/xxx这样的,但是eclipse在处理文件的时候直接走的是win的api于是当然找不到这样的路径。结果是,尽管可执行文件中有符号表,但是对应的文件eclipse全都找不到。另外,它关于include目录的解析的bug也很多,可能由于我采用的不是managed makefile。还有,它的语法处理能力已经差到一种境界。你说你处理不了复杂的宏,那么罢了。可是这么简单的语法,你也认不出来吗?

#define HTMLDIR "/home/snnn/www"
const char* myfilename= HTMLDIR "/index.html"

多简单啊!但是它看不懂字符串连接这样的事情。

挣扎的结果是我最终还是选择了eclipse,因为它的文本编辑功能做的的确是要比vc强。微软那帮人整天忙着去搞那套clr了,什么新特性全是针对clr的。但是vc9的代码分析功能的确是很让人赞叹。比如它像eclipse的java一样,能帮助分析出哪里可能会有空指针异常,甚至p=realloc(p,...)这样的可能发生的内存泄露问题。

主要是,用vc就意味着任何编译参数我都得设置两遍,一套for gcc,一套for vc。任何库我都得编译两份,一套for cygwin,一套for vc。而且还得细心的放好,防止它运行的时候本该读取cygwin版的libACE.dll的时候读到了vc版的libACE.dll。

oh dear~ 睡去了。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥