繁体   English   中英

从数据字典创建表

[英]Creating table from a data dictionary

我是C ++的完全新手,无法解决以下情况:

假设我们有一个数据字典表,如下所示:

---------------------------------------
tbl_name | fld_name | fld_typ | is_pk |
---------------------------------------
  X      |  fld1    |   INT   |    1  |
---------------------------------------
  X      |  fld2    | TEXT    |    0  | 
---------------------------------------
  X      |  fld3    | TEXT    |    0  | 
---------------------------------------
  Y      |  fld1    |   INT   |    1  |
---------------------------------------     
  Y      |  fld2    | TEXT    |    0  | 

我想以这种方式创建表“ X”:

创建表X(fld1 INT,fld2 TEXT,fld3 TEXT,PRIMARY KEY(fld1));

现在,我有了一个C ++函数,该函数从data_dictionary中进行选择*,并将所有字段添加到向量中。 问题是如何从列表中检索字段以进行“ CREATE TABLE”查询?

我正在努力获取所有那些fld_names,table_name = X的fld_typs来进行查询。 如果有人有任何想法,将不胜感激!

谢谢堆!

这是源代码:

std::vector<std::string> gettableinfo(std::string table) {
    std::vector<std::string> list_table;
    string prep_query =
            string(
                    "SELECT table_name, column_name, data_type, is_pk, length, start_position FROM dd_table WHERE table_name = '")
                    + table + string("' ALLOW FILTERING;");
    boost::shared_ptr<cql::cql_query_t> select(
            new cql::cql_query_t(prep_query, cql::CQL_CONSISTENCY_ONE));
    query_result = session->query(select);
    query_result.wait();
    if (query_result.get().error.is_err()) {
        cout << "ERROR IN THE QUERY" << endl;
    } else {
        cout << "QUERY SUCCESSFUL: " + prep_query << endl;
    }
    if (query_result.get().result) {
        if (query_result.get().result != 0) {
            cql::cql_result_t& result = *query_result.get().result;
            std::size_t const columns(result.column_count());
            while (result.next()) {
                int counter = 0;
                for (std::size_t column(0); column != columns; ++column) {
                    cql::cql_column_type_enum type;
                    if (result.column_type(column, type)) {

                        switch (type) {
                        case cql::CQL_COLUMN_TYPE_INT: {
                            int value;
                            if (result.get_int(column, value)) {
                                list_table.push_back(
                                        static_cast<ostringstream*>(&(ostringstream()
                                                << value))->str());
                            } else {
                                std::cout
                                        << "failed to extract int for column \n";
                            }
                            break;
                        }
                        case cql::CQL_COLUMN_TYPE_VARCHAR: {
                            std::string value;
                            if (result.get_string(column, value)) {
                                list_table.push_back(value);
                            } else {
                                std::cout
                                        << "failed to extract text for column \n";
                            }
                            break;
                        }

                        }
                    }
                }
            }

        } else {
            cout << "0 ROW RETURNED" << endl;
        }
    }

    return list_table;
}

在我的数据库项目中,我有Field类和Record类。

Field类提供用于从结果集中提取数据成员以及检索字段名称的功能。

class Field
{
  public:  
    virtual std::string get_field_name(void) const = 0;
    virtual void load_from_result_set(const Result_Set& rs,
                                      unsigned int column) = 0;
};

表名被放置在记录中。 记录是Field的容器:

class Record
{
  public:
    virtual std::string get_table_name(void) const = 0;
    virtual void load_from_result_set(const Result_Set& rs) = 0;

  private:
     std::vector< boost::smart_ptr<Field> >  m_field_container;
};

该记录还支持访问者和迭代器。

各种类型的字段是从Field基类派生的类。

希望这可以帮助。
{您可以在StackOverflow上搜索我的一些问题:“ C ++ Thomas Matthews记录字段”。}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM