Я новичок в 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» таким образом:
CREATE TABLE X (fld1 INT, fld2 TEXT, fld3 TEXT, ПЕРВИЧНЫЙ КЛЮЧ (fld1));
На данный момент у меня есть функция C ++, которая делает выбор * из data_dictionary и добавляет все поля в векторе. Проблема в том, как я могу получить поля из списка, чтобы сделать мой запрос «CREATE TABLE»?
Я изо всех сил пытаюсь получить все эти fld_names, fld_typs для 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;
}
В моем проекте базы данных у меня есть классы поля и классы записи.
Класс 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».}
Других решений пока нет …