使用MySQL ODBC一次提交多条SQL语句

MySQL ODBC3.51.18版本开始支持一次提交多个语句(请参考:http://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html)。方法是要给odbc.ini的数据源配置值为67108864option。如下图所示:

[DB1]
......
option = 67108864

注意这个option一定要配在odbc.ini的数据源上,而不能配在odbcinst.ini的驱动上。因为MySQLODBC代码只从odbc.ini文件查找option

int ds_lookup(DataSource *ds)
{
    ......
    for (used= 0; used < size; used += sqlwcharlen(entries) + 1,
                             entries += sqlwcharlen(entries) + 1)
      {
        int valsize;
        ds_map_param(ds, entries, &dest, &intdest, &booldest);

        if ((valsize= SQLGetPrivateProfileStringW(ds->name, entries, W_EMPTY,
                                                  val, ODBCDATASOURCE_STRLEN,
                                                  W_ODBC_INI)) < 0)
        {
          rc= 1;
          goto end;
        }
        else if (!valsize)
          /* skip blanks */;
        else if (dest && !*dest)
          ds_set_strnattr(dest, val, valsize);
        else if (intdest)
          *intdest= sqlwchartoul(val, NULL);
        else if (booldest)
          *booldest= sqlwchartoul(val, NULL) > 0;
        else if (!sqlwcharcasecmp(W_OPTION, entries))
          ds_set_options(ds, ds_get_options(ds) | sqlwchartoul(val, NULL));

        RESTORE_MODE();
      }

    ......
}

验证这个配置项是否成功,可以通过wireshark查看建立连接时的抓包:

捕获
可以看到“Multiple Statements”值为1,设置成功。

小评《理解Unix进程》

双“十一”期间参加CSDN活动,中了一本《理解Unix进程》,这两天花时间看完了。简单谈一下对这本书的的评价,谨代表个人意见。

这本书很薄,只有100来页,分为20章还有4节附录,这就表明每一章内容不是很多。书中的示例是用ruby语言写的,但是我相信大家都能看懂,不需要对ruby有很深的了解。总体来讲,这本书还是讲解了很多关于Unix的知识点,可以作为参考手册,或者可以在上下班的车上抽空读一读。不管是新手还是老兵,个人觉得都值得一看。价格也还好,20多元,应该不算贵。

另外,如果本身就是ruby程序员的,我非常推荐,应该会给你一些帮助!

在RedHat上快速安装gcc

今天需要在一台干净的RedHat上快速安装gcc,好能编译一些lib库。登录https://idp.redhat.com/idp/,下载了能找到的最高版本的安装包:cpp-3.2.3-60.x86_64.rpmgcc-3.2.3-60.x86_64.rpm,安装一气呵成:

[root@localhost nan]# rpm -ivh cpp-3.2.3-60.x86_64.rpm
warning: cpp-3.2.3-60.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID db42a60e: NOKEY
Preparing...            ########################################### [100%]
   1:cpp                ########################################### [100%]
[root@localhost nan]# rpm -ivh gcc-3.2.3-60.x86_64.rpm 
warning: gcc-3.2.3-60.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID db42a60e: NOKEY
Preparing...            ########################################### [100%]
   1:gcc                ########################################### [100%]

验证一下:

[root@localhost nan]# gcc -v
Reading specs from /usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=x86_64-redhat-linux
Thread model: posix
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-60)

尽管版本有点低,最起码现在有个能用的gcc了。如果需要高版本,再用这个gcc编译吧。

unixODBC的SYSTEM_FILE_PATH

unixODBC中,SYSTEM_FILE_PATH定义了像odbc.iniodbcinst.ini这些系统文件存放的位置。默认情况下,是在“/usr/local/etc”这个文件夹下。我们看一下用到SYSTEM_FILE_PATH的地方。

(1)odbcinst_system_file_path

char *odbcinst_system_file_path( char *buffer )
{
    char *path;
    static char save_path[ 512 ];
    static int saved = 0;

    if ( saved ) {
        return save_path;
    }

    if (( path = getenv( "ODBCSYSINI" ))) {
        strcpy( buffer, path );
    strcpy( save_path, buffer );
    saved = 1;
        return buffer;
    }
#ifdef SYSTEM_FILE_PATH
    else {
    strcpy( save_path, SYSTEM_FILE_PATH );
    saved = 1;
        return SYSTEM_FILE_PATH;
    }
#else
    else {
    strcpy( save_path, "/etc" );
    saved = 1;
        return "/etc";
    }
#endif
}

可以看到在查找系统文件路径时,首先会看ODBCSYSINI这个环境变量有没有赋值,如果有,以这个变量定义的值为准,否则如果SYSTEM_FILE_PATH定义了,则用SYSTEM_FILE_PATH。最后才考虑使用“/etc”。

(2)odbc_configmain函数:

int main( int argc, char **argv )
{
    ......
    else if ( strcmp( argv[ i ], "--odbcini" ) == 0 )
    {
        printf( "%s/odbc.ini\n", SYSTEM_FILE_PATH );
    }
    else if ( strcmp( argv[ i ], "--odbcinstini" ) == 0 )
    {
        printf( "%s/odbcinst.ini\n", SYSTEM_FILE_PATH );
    }
    ......
}

可以看到,在使用odbc_config程序获得odbc.iniodbcinst.ini文件位置时,也要用的SYSTEM_FILE_PATH

unixODBC的代码库

unixODBC的代码目前还托管在sourceforge上,它的项目主页是:http://sourceforge.net/projects/unixodbc/?source=directory。感兴趣的朋友也可以checkout项目的svn代码:

svn checkout svn://svn.code.sf.net/p/unixodbc/code/trunk unixodbc-code

trunk上的代码可以看到,Nick还是会不时更新的。

此外,也可以访问unixODBCftp站点:ftp://ftp.unixodbc.org/pub/unixODBC/。这里包含各个版本的代码包,可以按需下载。

我为unixODBC提过的bug

今天在使用unixODBC 2.3.2时,无意中又发现了一个bug。就是在调用configure程序生成config.h文件时,关于软件包版本字符串是:

/* Define to the full name and version of this package. */
#define PACKAGE_STRING "unixODBC 2.3.2-pre"

/* Define to the version of this package. */
#define PACKAGE_VERSION "2.3.2-pre"

而实际这个已经是正式的release版本了,所以软件包版本字符串应该是:

/* Define to the full name and version of this package. */
#define PACKAGE_STRING "unixODBC 2.3.2"

/* Define to the version of this package. */
#define PACKAGE_VERSION "2.3.2"

Nick发了个邮件,他也承认是个bugA question about config.h )。屈指一算,这已经是我提给unixODBC的第四个bug了。记录一下,做个纪念:-):
Add missing unicode setting when returning a connection to the pool
Wrap lt_dlinit and dlerror in the lib mutex
Change mutex protection around release_env

开博一周年纪念

去年的今天,我写下了自己的第一篇博文:Solaris操作系统网络编程经验分享。一眨眼,一年过去了,特发小文,纪念一下。

在这一年里,我从开始只写中文文章发展到也写英文文章,从CSDN的博客到自己买域名租服务器搭建自己的网站。这些经历可以说极大地丰富了我的业余生活,也带给了我很大乐趣。我觉得把自己的技术经验分享出来,如果可以帮助别人,是很快乐的一件事。此外,若干年后,看到自己当初记载下生活的点点滴滴,是不是也很好玩呢?就像现在的自己,看到初中时期的日记,也会觉得自己当初是如此的幼稚。

希望自己可以坚持下去,keep moving……

纪念MSN

第一次见到MSN是2005年6月,当时我念大四。由于就差答辩了,所以大家每天过得都很轻松。宿舍一个同学认识了一个海外的留学生,他们每天在网上都用MSN聊天。那是我第一次看到MSN聊天界面,白色的界面感觉很清新,另外旁边的头像也给我眼前一亮的感觉。据同学介绍:“外国人都用MSN,不用QQ”,这就是我对MSN的最初印象。

2006年研究生暑假,我在一家公司实习。由于同事之间沟通都用MSN,我也让同事帮我申请了一个账号,就是现在还在使用的这个。第一次看到国际象棋棋子旋转的登录界面让我觉得很好玩。后来回到学校后,发现周围有很多同学也都有了MSN账号。当时给我的感觉就是:“用MSN比用QQ高端一些”。

2008年毕业后,由于公司对IM软件的限制,我就没再用过MSN。直到2010年来到现在的公司,才重新开始使用了MSN。不过从此以后,听到的都是有关MSN的负面新闻了。像“逐渐关闭MSN服务,中国大陆除外”,“MSNskype整合”等等。虽然每次都是“狼来了”,MSN过后还可正常使用。但是这次MSN终于消失了。

那个经典的登录界面只能存在于回忆里了,我很怀念它。

北京Golang爱好者聚会活动

Go友团网站昨晚发布了北京Golang爱好者聚会活动:Go语言技术聚会——北京(2015年1月),感兴趣的朋友可以关注一下。

个人感觉Go语言写的code确实很清爽,是一门值得学习的语言。其实目前很多公司都已经开始使用Go语言了,不过似乎Gopher们交流真是不多,至少感觉在北京是这样的。我印象中只有前一段时间并发编程网举办的技术沙龙上七牛的工程师分享了一篇Go的讲座。

有兴趣的同学关注一下这个活动吧,也关注一下Go语言。毕竟老牌黑客Rob PikeC语言发明者Ken Thompson弄出来的东西应该是有它独到之处吧。

P.S,昨天是Go语言5周岁生日,大家可以阅读一下官网上的文章:Half a decade with Go,了解一下Go的过去,现在和将来。