给Super-smack的gen-data程序添加整数长度控制

        在实际使用Super-smack对数据库进行压力测试的时候,我们常常需要控制整数的长度,如最大三位整数(从0-999),三位到7七位整数(从100-9999999)等等。这个时候,gen-data的%d格式又不够用了。分析gen-data的源代码(文件在解压出来的super-smack包的src目录下,gen-data.cc文件),发现虽然产生数字的程序接收了最小宽度和最大宽度参数,但是只是用来获取了一个最终的随机宽度。而这个宽度对最后数据的输出貌似并没有什么影响和控制。虽然搜fprintf()函数中使用到了这个参数。

        自己动手丰衣足食,既然原生的代码不能达到我的要求,就帮忙改改吧。改造代码的最终目的,是实现对%d产生的数字的长度控制。

        思路:

        如前所述,我希望能控制整数长度,3表示3位以内的数,即从0-999.因此,width为3时,最大可接受的值就是999.即:10的4次方-1。因此,只需要采用pow()函数来实现成方,就能得到能接受的最大值。pow()函数在math.h头文件中。

        由于gen-data用了rand()函数来获取随机数字,而C++的rand()函数显然没有C#的方便,没有办法直接在函数内部控制最大值和最小值,因此需要自己写算法来控制,对rand()函数产生的结果进行处理,达到控制大小的目的。我们采用取模运算。大家都知道,模运算的结果,绝对不会比除数大。利用这个特性,就能方便的对数字进行处理了。

        代码实现:

        找到void print_num(int min_width, int max_width)函数,在fprintf()函数前加上以下代码:

double max_num = pow(10,width+1)-1;
 
      max_num = max_num < 0 ? 0 : max_num;

        修改fprintf()函数的内容,将rand()修改为rand()%(int)max_num

        修改完成的函数如下:

        void print_num(int min_width, int max_width)
        {
            int width = get_width(min_width, max_width);

           double max_num = pow(10,width+1)-1;
           max_num = max_num < 0 ? 0 : max_num;

           if(max_width!=0)
     {
           fprintf(out, "%*d", width, rand()%(int)max_num);
     }
     else
     {
       fprintf(out, "%*d", width, rand());
     }
      }


     代码修改完成之后,保存文件,开始编译。编译命令:

        

        cd super-smack-1.3 

        ./configure --prefix=/usr/local/supersmack --with-mysql=/usr/local/mysql

        make

        这里要注意:

        第一行命令,是进入super-smack-1.3所在的目录,需要根据你的实际文件目录来决定,不要完全照搬我的命令啊。

        第二行命令,configure里面的prefix是make install用的,你可以不用加,如果你后面打算make install,你就加上。路径根据实际情况修改。 --with-mysql这里,根据你的实际情况,选择是oracle,mysql还是其他数据库,详细参考./configure --help。至于后面的路径,是你的数据库安装路径,根据实际情况修改。

        

        make完成之后,如果一切顺利,你就可以获取到修改后的gen-data程序了,拷贝覆盖你的旧程序,就可以搞定了。

下面贴几个我机器上的运行结果:

[root@localhost src]# gen-data --help

gen-data version 1.1 

MySQL AB, by Sasha Pachev

Prints lines random data to stdout in given format

Usage: gen-data [options]

-?, --help - this message

-V, --version - show version

-n, --num-rows=num - number of rows

-f, --format=fmt_str - format string

Format can contain any character + % followed by

a format specifier. Valid format specifiers: 

 s - string 

 d - integer 

 t - datetime 



Additionally, you can prefix a format speficier with: 

 n - generate exactly n characters 

 m-n - generate between m and n  characters 


===========================================================

[root@localhost ~]# gen-data -n 10 -f %3d
43
7
997
39
1
868
682
409
0
55

===========================================================

[root@localhost ~]# gen-data -n 10 -f %1-3d
664
268
997
39
253
40
25
409
54
55

        如果要把数据结果放文件里面去,可以用以下命令:

        gen-data -n 10 -f %1-3d > /root/test.dat


你可能感兴趣的:(Super-smack)