从数据字典创建表

时间:2014-03-13 17:18:04

标签: c++ database cql

我是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执行select *并在向量中添加所有字段。问题是如何从列表中检索字段以使我的" CREATE TABLE"查询?

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

谢谢堆!

以下是源代码:

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;
}

1 个答案:

答案 0 :(得分:0)

在我的数据库项目中,我有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;
};

表名放在Record中。记录是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:&#34; C ++ Thomas Matthews记录字段&#34;。}