MySQL- Руководство разработчика

Sql_create


В дополнение к базисным структурам Вы можете устанавливать расширенные структуры, которые также имеют методы определенные, чтобы помочь в создании запросов и во вставке данных в таблицах. Например: sql_create_5(stock, 1, 5, string, item, int, num, double, weight, double, price, MysqlDate, date) создаст определение, эквивалентное следующему: struct stock { ... static char *names[]; static char *table; template <class Manip> stock_value_list<Manip> value_list(cchar *d = ",", Manip m = mysql_quote) const; template <class Manip> stock_field_list<Manip> field_list(cchar *d = ",", Manip m = mysql_do_nothing) const; template <class Manip> stock_equal_list<Manip> equal_list(cchar *d = ",", cchar *e = " = ", Manip m = mysql_quote, ) const; template <class Manip> stock_cus_value_list<Manip> value_list([cchar *d, [Manip m,]] bool i1, bool i2 = false, ... , bool i5 = false) const; template <class Manip> stock_cus_value_list<Manip> value_list([cchar *d, [Manip m,]] stock_enum i1, stock_enum i2=stock_NULL, ..., stock_enum i5 = stock_NULL) const; template <class Manip> stock_cus_value_list<Manip> value_list([cchar *d, [Manip m,]] vector<bool> *i) const; ...(логический эквивалент для field_list и equal_list)... }; value_list() возвращает специальный класс, который при использованни с оператором << в ostream слева вернет разделенный запятыми список правильно цитированных и экранированных значений.

field_list() возвращает специальный класс, который делает то же самое, но возвращает список полей, которые хранит структура. Имена полей не цитируются и не экранируются.

equal_list() возвращает разделенный запятыми список в формате имя поля=значение. Имена полей не цитируются и не экранируются, а значения цитируются и экранируются только по мере надобности. Например: stock s("Dinner Roles",75,0.95,0.97,"1998-05-25"); cout << "Value List: " << s.comma_list() << endl; cout << "Field List: " << s.field_list() << endl; cout << "Equal List: " << s.equal_list() << endl; вернет нечто вроде следующего: Value List: 'Dinner Roles',75,0.95,0.97,'1998-05-25' Field List: item,num,weight,price,date Equal List: item = 'Dinner Roles',num = 75,weight = 0.95, price = 0.97,date = '1998-05-25' Комбинация списков полей и значений может использоваться для запросов замены или вставки. Например: query << "insert into stock (" << s.field_list() ") values " << s.value_list(); вставит s в таблицу stock.

Вы можете также использовать SQLQuery::insert или SQLQuery::replace (и таким образом вызвать Query::insert или Query::replace), чтобы выполнить ту же самую задачу: query.insert(s); Это использует s.table для имени таблицы, которое задано по умолчанию в имени структуры.

Вы можете также определять различные разделители "d". Если ни один не определен явно, по умолчанию берется ",". Вы можете использовать разделитель " AND " для equal_list, чтобы помочь в запросах выбора и модификации. Например: stock s2 = s; s2.item = "6 Dinner Roles"; query << "UPDATE TABLE stock SET " << s2.equal_list() << " WHERE " << s.equal_list(" AND "); будет аналогично запросу: UPDATE TABLE stock SET item = '6 Dinner Roles',num=75,weight = 0.95, price = 0.97,date = '1998-05-25' WHERE item = 'Dinner Roles' AND num = 75 AND weight = 0.95 AND price = 0.97 AND date = '1998-05-25' который изменит запись в таблице так, чтобы элемент был теперь "6 Dinner Roles" вместо "Dinner Roles".

Вы можете использовать SQLQuery::update (и обратиться таким образом к Query::update) для выполнения той же самой задачи: stock s2 = s; s2.item = "6 Dinner Roles"; query.update(s,s2); Подобно SQLQuery::insert, это использует s.table для имени таблицы, который задан по умолчанию для имени структуры.

Вы можете также определять манипулятор, который методами c++ цитирует или экранирует значения. Это может быть любой имеющий силу манипулятор потока, который только обрабатывает элемент справа от манипулятора. Списки value_list и equal_list имеют значение по умолчанию escape, а field_list имеет do_nothing. Для equal_list манипулятор обрабатывает только часть value, но не трогает часть field name.

Это может быть полезным при экспорте в файл, где Вы не хотите получить кавычки вокруг строк. Например: table_out << q.value_list("\ t", mysql_escape) << endl; конкатенирует данные к файлу, который обрабатывается table_out.

Три не базисных формы позволяют Вам определять, которые элементы будут Вам возвращены. Например: cout << q.value_list(false,false,true,true,false) << endl; cout << q.value_list(stock_weight, stock_price) << endl; Оба варианта вернут: 0.95,0.97 bool form ожидает булевы параметры, где каждый бит представляет собой инструкцию, что именно надо показывать. Например: cout << q.value_list(false,false,true,true) << endl; выведет показанное в предыдущем примере.

list form позволяет Вам определять то, которые элементы будут показываться. Значения enum созданы для каждой переменной с именем структуры плюс символ подчеркивания в качестве префикса, например, item обозначается как stock_item.

Эти формы могут быть полезны в запросах выбора. Например: query << "SELECT * FROM stock WHERE " << q.equal_list(" AND ",stock_weight,stock_price); произведет такой запрос: SELECT * FROM stock WHERE weight=0.95 AND price=0.97 Который выберет все строки из stock, которые имеют weight и price, заданные в операторе как значение q.

vector form (не показанный выше) позволяет Вам передавать булев вектор, который экономит время, если Вы используете некоторый образец больше, чем однажды. Дело в том, что такой подохд позволяет обойти необходимость создавать вектор из параметров каждый раз. Если a представляет собой булев вектор, то a[0] хранит первую переменную, a[1] соответственно вторую и так далее. Например: vector<bool> a; a[0] = false; a[1] = false; a[2] = true; a[3] = true; a[4] = false; query << "SELECT * FROM stock WHERE " << q.equal_list(" AND ", a);



Содержание раздела