• 【原创】8. MYSQL++中的Row类型


    一、mysqlpp::Row类型

    在之前的介绍中我们看到了如何通过mysqlpp::Query找到各种Result类型,然后又仔细分析了各种Result类型又是如何生成对应的Row类型(如下所示)。

    image_thumb13

    接下去的问题就是,到底mysqlpp::Row是什么。

    1. Row类型的使用(先不提SSQLS)

    还是先来看如何使用这个Row类型,照样是通过sample程序。

    mysqlpp::Connection conn(false);
    conn.connect(...);
    mysqlpp::Query query = conn.query("select * from stock");
    mysqlpp::UseQueryResult res = query.use();
    while (mysqlpp::Row row = res.fetch_row()) {
    
        cout << setw(30)   << row["item"] << ' ' 
             << setw(9)    << row["num"]  << endl;
    }

    OR

    mysqlpp::Connection conn(false);
    conn.connect(...);
    mysqlpp::Query query = conn.query("select * from stock");
    mysqlpp::UseQueryResult res = query.use();
    while (mysqlpp::Row row = res.fetch_row()) {
    
        cout << setw(30)   << row[0] << ' ' 
             << setw(9)    << row[1] << endl;
    }
     

    上面的例子中提到的两种最为基本的用法,主要就是查看每行数据的各个列的不同方式。至于查找Row的列的信息,可以通过row[0]等返回回来的String,具体可以看下文和对于mysqlpp::String的介绍的章节。

    2. mysqlpp::Row的实现

    关于mysqlpp::Row的定义主要在row.h和row.cpp中。在说明中,我们可以看到,作者对Row的定义是const,这是因为他认为通过返回的Row去修改database是不合适的。所以不直接从vector进行派生,而自己去实现一些必要的方法。

    mysqlpp::Row是直接从OptionalExceptions进行派生的。

    • 成员变量

    list_type data_;                              
    RefCountedPointer<FieldNames> field_names_;
    bool initialized_;

    list_type是什么?typedef std::vector<mysqlpp::String> list_type;

    FieldNames是一个派生自vecot<std::string>的类型

    在类型声明的一开头,作者首先typedef了list_type相关的迭代器,反响迭代器,引用迭代器,元素类型值,元素类型长度等信息。

    • 成员方法

    首先来看各种构造方法和等号赋值方法。

    主要定义了两种构造器

    image

    image

    image

    主要看一下在本节一开始的实例中所使用的第二个构造器。

    image

    首先我们看到的是使用一个initialized_进行构造成功与否的保护,估计在之后所有的方法上都会先对这个变量进行查询,如果是false直接返回错误或者抛出异常。

    其次,是对于data_(一个vector<String>类型)的初始化和填充,需要注意的是第45行。value_type是这样定义的,也就是一个vector<String>::value_type

    image

    查看STL文档得知,vector<T>::value_type是A type that represents the data type stored in a vector. value_type is a synonym for the template parameter Type.换句话说,作者为了减少冗余,这里采用了通用的方式。值得学习!

    所以说,其实在第45行,主要做的事情就是调用mysqlpp:: String的构造函数,这个请查看String的介绍。

    这里还要注意的是第48行,跟着进去看到的是ResultBase:: field_type( )方法,定义是

    image

    又出现了熟悉的value_type,那么FieldTypes是什么呢?

    image

    又回到了之前介绍过的mysql_type_info。这样子即使你没有看过String的构造函数,你也已经很明白了,这个String很神通广大,他居然能够知道值以及具体的类型!也就是说,MySQL++就用了一个String包装了MYSQL C API中的行信息和行所对应的列的信息。

    接下来在52行把所有的field_names的信息传递给了mysqlpp::Row的成员变量field_names_,所有都已经成功了之后,就大胆地设置初始化标志为true。

    再来分析一下在mysqlpp::Row中delegate  std::vector的方法

    image

    image

    image

    不多说,完全就是delegate,只不过原来一直没有注意过一点的是,vector<T>:: begin( )居然被定义了两个版本(只怪自己学艺不精)

    iterator begin();
    const_iterator begin() const;

    当然,上面用的版本都是非const版本,这是因为data_被定义为vector<String>没有带const,但是返回值都是const的!

    顺带便说一下,const_reference以及const_iterator的定义

    image

    image

    还有就是

    image

    获取Row中Field值的方法

    从上面的例子中我们可以简单的看到,要获取一行数据的值还是很简单的,主要的方法就是通过operator [ ]

    方法一,通过index查找Row中对应的field的值

    image

    再来说明一下上面提到的为什么该参数一定要是int而不是size_type的问题。下文我们可以知道,作者重载了一个operator[](char*)。如果出现了row[0]或者row[NULL](假设这个平台将NULL定义为0),我们有理由说编译器会搞不清楚到底你要的是size_type还是char*,毕竟我们同样可以把NULL赋值给char*。但是如果有了int,由于0是int型,所以会被匹配到这里。

    这里的at方法还是很简单的。

    image

    方法二,通过field的字符串形式的name来查找Row中对应的field的值

    image

    image

    其中field_num方法的定义如下

    image

    该函数的实现代码如下,

    image

    需要注意的是划红色圈的地方,这里其实调用的是mysqlpp:: FieldNames(一个派生自vector<string>的类型)的operator[ ]的重载方法

    image

    image

    以下这些方法是用于SSQLS,基于value_list_b结构体

    equal_list

    在Row的定义中,我们可以看到两个同名不同参的函数equal_list,这两个函数主要用在了SSQLS中,用于生成"equals clause",例如在SELECT语句中的WHERE就是一个典型的"equals clause",例如,

    SELECT * FROM Tbl1 WHERE  id = ‘1’, name = ‘root’

    这个是需要配合使用equal_list_b结构以及一个用于做quoting和escaping的类型。

    这几个重要方法请参看SSQLS的具体解释。

    field_list

    这几个方法同样也是用于SSQLS的,主要用于返回各种FieldNames。这个函数会有一些输入(某些重构是vector<bool>,有些就是很多bool参数)来表明一个row中哪些field是需要被返回到结果集中的。不需要的就用false。

    value_list

    这个函数是获取mysqlpp::Row的整个(或者部分)值的函数。这个函数会有一些输入(某些重构是vector<bool>,有些就是很多bool参数)来表明一个row中哪些field是需要被返回到结果集中的。不需要的就用false。

    原创作品,转载请注明出处www.cnblogs.com/aicro

  • 相关阅读:
    第8月第15天 app支持后台播放
    第8月第12天 python json.dumps danmu
    第7月第27天 c++11 boost
    第7月第26天 iOS httpserver
    第7月第25天 xcode bundle calayer动画
    我曾七次鄙视自己的灵魂
    learning shell display alert function(5)
    learning armbian steps(6) ----- armbian 源码分析(一)
    learning scala 数组和容器
    learning scala ide tools install
  • 原文地址:https://www.cnblogs.com/aicro/p/3633509.html
Copyright © 2020-2023  润新知