MySQL Connector++ 使用getString获取表字段数据出错

Linux下一个使用MySQL Connector++ 1.1.0 连接MySQL数据库的程序,在连接数据库获取数据时程序崩溃,
确定数据库中存在记录值,查看Core Dump文件,发现崩溃点发生在调用 MySQL 库的 getString 方法时的那一行,

通过google搜索,发现好一些getString出错的问题,但是多数是Windows下VS编译环境不同造成的,终于发现下面一篇中有和我的问题类似

http://stackoverflow.com/questions/4822958/mysql-c-connector-getstring-doesnt-work-correctly-while-getint-works-perfe

I had a similar problem the program would give a memory exception. Here is what I did to fix it:
std::string version = result->getString( COLUMN_NAME ).c_str();

This didn't work:
sql::SQLString sString  = result->getString( COLUMN_NAME ); <<

我的不正常代码是

std::string value = result->getString( field);

按照上面的方法将代码修改为

std::string value = result->getString( field).c_str();

暂时获取同样的数据没有出错,希望后面也不要出错。
MySQL Connector++ 从版本1.1.4开始编译依赖于BOOST库

Popularity: 2% [?]

Random Posts

    SQLite数据存取速度慢的原因分析

    写了一个小工具,使用SQLite作为本地数据结构的存取,但是在默认情况下,发现大批量插入数据的速度很慢,100条不到的记录,花了快10秒,没错不是毫秒,是秒,深感SQLite的存取速度太慢,现在很多软件都在使用SQLite作为本地数据存取,这么慢存取的效率怎么能用呢,估计是有什么参数没有设置对,网上搜索后发现如下一篇文章Increasing SQLite Performance
    文章主要是通过PRAGMA对一些参数设置不同值做效率对比

    方式 测试结果值 说明
    TEMP_STORE DEFAULT 235 不同值区别不大
    FILE 225
    MEMORY 215
     
    JOURNAL_MODE DELETE * 235 使用MEMORY和OFF方式速度较快
    TRUNCATE 210
    PERSIST 220
    MEMORY 65
    OFF 63
     
    SYNCHRONOUS FULL 235 OFF有较大提升
    NORMAL 175
    OFF 43
     
    LOCKING_MODE NORMAL 235 EXCLUSIVE独占有较大提升
    EXCLUSIVE 155

    另外 PAGE_SIZE 和 CACHE_SIZE 的只修改,对性能影响不是很明显,所以为了提升插入效率,在使用事物的基础上还可以通过修改 JOURNAL_MODE、SYNCHRONOUS和LOCKING_MODE的值

    PRAGMA locking_mode=EXCLUSIVE
    PRAGMA synchronous=0
    PRAGMA journal_mode=MEMORY
    

    Popularity: 2% [?]

    Random Posts

      libevent2的evhttp获取网页数据失败(dns未能正确解析)

      使用libevent2的evhttp请求阿里大于接口,调用失败,没有正确请求数据,但是利用curl可以正确访问。
      使用抓包工具抓包分析,和curl发起的请求对比发现libevent2在dns查询后没有连接实际的ip地址建立连接,怀疑libevent2没有正确的对dns解析结果做处理。
      网上搜索发现如下这篇文章:域名随机大小写导致libevent2的异步DNS解析失败

      经过检验,确实时dns查询阿里大于api接口域名返回的应答信息中,域名大小写和请求时的有所不同,
      于是翻看libevent2的代码,发现有函数evdns_base_set_option可以设置global_randomize_case的值,

      在阿里大于接口请求前添加一样代码:
      evdns_base_set_option(dnsbase, “randomize-case”, “0″);
      重新编译运行,解决问题。

      Popularity: 2% [?]

      Random Posts

        libcurl请求速度慢问题解决

        一直使用libcurl请求接口数据,最近发现一个问题,post部分请求速度变慢,每次都要超过一秒,get速度没有变化,0.1秒左右获取完毕。
        对POST请求打开VERBOSE开关,看到发出请求头信息包含 Expect: 100-Continue, 网上查找对应说明,当POST数据大于1024字节时,
        有这个头信息会先等待服务端一个继续接受的应答才继续上传,如果服务端没有应答会等待1秒再继续上传后续数据,对照VERBOSE输出的信息,
        发现发出的Content-Length 大小1026字节,刚好超出1024字节,服务端没有对100-Continue做应答于是libcurl多等了1秒才发送数据。
        修改方法,让libcurl不处理Expect 头信息

        1.   /* 添加头信息 */
        2.   struct curl_slist *list = NULL;
        3.   list = curl_slist_append(list, "Expect: ");
        4.  
        5.  /* 设置头信息 */
        6.   curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
        7.   …
        8.   curl_slist_free_all(list); /* 释放头信息 */

        添加这段代码后,再次请求,时间降到0.x秒内,速度正常

        Popularity: 2% [?]

        Random Posts

          Linux下df和du看到的剩余空间不一致处理方式

          昨日突然测试用的Linux服务器报存储空间不足,使用 df 查看,磁盘已经使用 100%,使用du 命令查看使用空间最大的目录,结果发现 du 显示的总使用空间才占用总磁盘空间的 70%左右,剩下的 30%空间跑哪去了呢?
          找了一下df和du区别的资料,发现他们的工作方式有所区别,所以造成了看到的结果不一致

          du的工作原理
          du命令会对待统计目录下的文件逐个调用fstat,获取每个文件大小。它的数据获取是基于文件目录中的文件的,可以跨越多个分区操作。如果目录中文件很多,那么du的速度就会很慢.

          df的工作原理
          df命令使用statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它只能针对整个分区块,运行速度不受文件多少的影响。

          du和df不一致的一般原因
          常见的df和du不一致情况是文件删除造成的,当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果这个时候还有运行的进程持有这个已被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

          一般处理方法
          使用lsof命令找到还持有被删除文件句柄的进程,然后关闭进程或者杀掉进程用以释放空间。

          lsof | grep deleted

          避免这个问题的一般方法
          1.可以使用清空文件的方式来代替删除文件,方式是:

          echo > myfile

          2.对于要经常做删除操作的日志文件,以改名、清空、删除的顺序操作

          Popularity: 2% [?]

          Random Posts

            NDK回调Java类方法碰到的问题解决

            以前写的一个Android程序,使用NDK回调Java中的类函数方法,以前在Android 4.x之前的系统上都没有问题,5.x,6.x系统的手机上在回调Java类函数时,出错,报:… invalid object …

            搜索Google发现,是由于jni接口触发时,传入的jobject对象使用的是Local reference方式,而自己写的ndk代码是将这个类对象存起来作为全局对象使用了。

            http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html

            JNI 函数参数中 jobject 或者它的子类,其参数都是 local reference。Local reference 只在这个 JNI函数中有效,JNI函数返回后,引用的对象就被释放,它的生命周期就结束了。若要留着日后使用,则需根据这个 local reference 创建 global reference。Global reference 不会被系统自动释放,它仅当被程序明确调用 DeleteGlobalReference 时才被回收。(JNI多线程机制)
            gobj=(*evn)->NewGlobalRef(evn, object);

            需要在存起来的地方将这个类对象先NewGlobleRef一下,使其不会由于在退出这个保存对象的jni调用后就因为Local临时对象引用被销毁掉,导致后续的NDK调用访问不到这个临时对象,报错跳出程序。

            代码做了这个小修改后,再在NDK代码中调用这个java类的方法,程序没有再报错。

            Popularity: 2% [?]

            Random Posts

              发现一个Delphi的静态代码检查工具FixInsight

              C++,Java, C#等常用编程语言都有静态代码检查工具,帮助发现编写代码过程中存在的一些问题,从而有效提升代码质量,将一些缺陷在编译阶段就发现解决掉。
              Delphi作为一个已经有几十年历史的语言,一直没有发现类似的静态代码检查工具,引以为憾,但是今天发现了一款工具 FixInsight 填补了这个缺憾。
              下载地址 http://sourceoddity.com/fixinsight/download.html
              软件的售价对于个人版只要 $95, 相对于排查代码缺陷所花的时间是完全值得的。

              Popularity: 2% [?]

              Random Posts

                使用CodeTyphon做FPC交叉编译的问题记录

                在mac下安装了CodeTyphon尝试做freepascal代码的跨平台编译。

                首先编译安装CodeTyphon环境

                步骤1:安装 mac ports
                步骤2:首先解压下载来的CodeTyphon安装包,运行解压目录下下的setup.sh, 使用 sudo 执行
                步骤3:选择0,安装系统库
                步骤4:选择8, 清空之前的全部组件,重新编译安装
                经过漫长等待后,可以在应用程序中看到有CodeTyphon和Typhon32两个图标,运行CodeTyphon

                编译所需目标平台的工具链

                主要是CrossBuild菜单项目下的几个菜单项处理。
                步骤1:选择 CrossBuild 菜单下面的 ToolChains Build 项目,选择期望的目标平台,主要是第一列的 FPC CPU-OS Targets 中选择, 选择好后点击 Build 按钮进行编译。在自己手动编译前可以先选择 CrossBuild 菜单下面的 Download ToolChains项目,看服务器上有无预先编译好的可可以下载来用(手工编译速度比下载速度慢很多)下载前,要用sudo 运行CodeTyphon, 否则会下载失败,提示目录不存在的错误,其实就是没有权限写目录
                步骤2:选择 CrossBuild 菜单下的 Download Libaraies 项目,下载对应目标平台的库文件
                步骤3:选择 CrossBuild 菜单下的 FreePascal 32bits(64bits), 编译所需平台的 cross elements,
                如果没有做第一步, 则这儿没有对应平台的cross elements可以选择

                编译目标平台的程序

                步骤1. 运行Typhon32
                步骤2. 新建或打开工程
                步骤3. 设置工程的相关搜索路径,菜单 工程=》工程选项=》编译选项=》路径, 主要为Libraries路径,为了变更目标平台时不修改这边的路径,可以采用相对路径。
                Libraries 可以填 $(CTDir)/binLibraries/$(TargetCPU)-$(TargetOS)
                单元输出目录可以填 lib/$(TargetCPU)-$(TargetOS)
                步骤4. 选择目标平台,菜单 工程=》工程选项=》Config and Target, 设置目标OS和目标CPU

                编译中碰到问题:
                问题1: 编译提示 system 单元未找到
                这一般是由于没有创建好对应平台的cross elements 或者 在工程的路径设置中没有设置对 units的路径

                问题2: 代码中的中文信息在编译后输出了乱码
                这个一般是由于Freepascal默认按照utf8解释的原因,之前代码中的中文是在Win下编写,GBK编码,将文件转为UTF8格式重新编译问题解决。

                Popularity: 2% [?]

                Random Posts

                  Klocwork Insight在Mac下的eclipse插件安装使用

                  搞到一套可以在mac下运行的klocwork insight,终于在不开虚拟机的情况下也可以做c/c++代码的静态检查了。
                  首先安装服务端,双击运行服务端安装包的 pkg文件,安装后会自动建立 /usr/local/kw/ 符号连接,
                  再安装客户端,解压客户端的zip压缩包,得到cmd安装包盒eclipse的update site。双击运行cmd客户端安装包的pkg文件进行安装。

                  使用eclipse的install site将eclipse插件装好,
                  修改eclipse中的 c++项目build属性
                  1. 选中项目,鼠标右击,转到 Project Properties > C/C++ Build > Tool Chain Editor.
                  2. 将活动配置的 Current Builder 从 CDT Internal Builder 修改为 Gnu Make Builder 并点击 Apply .
                  3. 选中项目,鼠标右击,转到 Project Properties > C/C++ Build.
                  4. 在Builder Settings 标签页, 取消选中 Use default build command.
                  5.在 Build command 输入框中,将原先的 make 修改为

                  kwinject -u -o ${ProjDirPath}/kwinject.out make
                  

                  注意:要将之前安装的路径添加到PATH中,否则会报kwinject命令找不到的错误
                  6. 点击 OK 按钮确定修改

                  首先 clean project, 然后再build project这样就创建好了klocwork的 Build specification。

                  7. 选中项目,鼠标右击,转到 Project Properties – > Klocwork > Clockwork Build Settings.
                  8. 选中 Use build specification file, 浏览选中刚创建的 build specification 文件 ( kwinjec.out ), 然后点击 OK.

                  后面就可以使用klocwork分析C++代码中存在的问题了。

                  命令行下运行

                  kwadmin create-project myproject
                  cd myprojectpath
                  make clean
                  kwinject make
                  kwbuildproject --project myproject -f -o table kwinject.out
                  kwadmin load myproject table
                  

                  在客户端分析
                  首先进入到项目所在的路径(工程所在的路径下)
                  1. 创建本地项目名
                  kwcheck create 会在当前目录下生成一个 .kwlp .kwps 的目录,用来存放数据和配置文件的
                  2. 获取构建配置文件
                  kwbuildproject –project myproject -f -o table kwinject.out

                  用命令分析并查看结果
                  kwcheck run –b kwinject.out

                  这时缺陷是不能在 web 中查看的但可以导出 txt 和 xml 格式的文件,命令为:
                  kwcheck list -F xml > report.xml
                  kwcheck list -F detailed > report.txt

                  Popularity: 2% [?]

                  Random Posts

                    尝试安装使用Checkmarx过程中碰到的问题解决方法记录

                    最近找到了一份Checkmarx安装包,这是一款比较强大的用于静态分析源代码,找出代码中可能存在的安全漏洞,
                    对常见的语言都有支持,比如ASP,PHP,Rubby,Python,JavaScript,CSharp,Java等

                    在尝试安装使用的过程中碰到了如下一些问题:

                    1. 使用的SQLServer数据库连接不上
                    2. 开始默认安装的系统认证方式连接数据库,结果启动服务时起不来,看日志为数据库连接不上,提示NT Authrity失败,于是尝试使用SQLServer的认证,修改Config目录下的数据库连接配置文件,添加上User Id,Password数据库连接账号,重新启动Checkmarx的服务,发现还是连不上,查看SQL Server的文档,发现Integrated Security要设置为False值,否则还是会忽略数据库的账号密码,使用系统认证连接数据库。再次修改后,重新启动服务,启动成功。

                    3. Git版本库连接不上
                    4. 添加要扫描的项目代码时,使用Git版本库作为来源,但是总是提示ssh认证不通过,最后发现使用git2.x的客户端不行,网上找了一个git1.9的客户端在Checkmarx的扫描服务器上重新安装,问题解决。

                    5. 使用中文界面,部分漏洞的中文说明显示为乱码
                    6. 分析显示的文字,感觉是没有正确采用编码显示,感觉像utf-8编码未能正常显示,在数据库服务器上打开CxDB数据库,找到cwe表,看到里面有LanguageId为2052的Description字段中文字有中文,抽样看了一些字段中数据值,部分正常显示中文,部分显示出来为乱码。写了一个小工具,对显示不正常的记录数据读取出啦,转为Utf8编码重新保存到数据库中(一共200多条中文描述记录中有90来条乱码),Web页面上原先显示不正常的中文显示正常。但是生成的中文报告,原先乱码的在报告中还是乱码,应该需要修订另外一个字段中的值。

                    Popularity: 2% [?]

                    Random Posts

                      ← Previous PageNext Page →