RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

Глава 3. C++ API

3.1. Mysql++. Введение

3.1.1 Что такое Mysql++

Mysql++ представляет собой полноценный C++ API для Mysql (а в скором времени и для других баз данных на SQL также). Цель этого API: сделать работу с запросами столь же простой, как работа с другими STL Контейнерами

3.1.2 Получение Mysql++

Последняя версия Mysql++ лежит на web-сайте mysql++ по адресу http://www.mysql.com/download_mysql++.html

3.1.3 Список рассылки Mysql++

Инструкции по присоединению к списку рассылки (и архив списка рассылки) могут быть найдены на домашней страничке Mysql++ по адресу http://www.mysql.com/download_mysql++.html. Если Вы желаете только задать вопрос, можете писать на mysql-plusplus@lists.mysql.com.


3.2. Обзор

Mysql++ API очень сложен и обладает большой мощностью. В этом разделе обеспечивается краткий обзор многих различных компонентов этой библиотеки.

Подобно работе с большинством других SQL API, процесс выполнения запросов тот же самый: 1) Вы открываете подключение, 2) Вы формируете и выполняете запросы, 3) Вы выполняете итерации через набор результатов. Однако имеется много дополнительных функциональных возможностей.

Основной дескриптор базы данных

Это тот класс, который обрабатывает подключение к серверу Mysql. Вы всегда нуждаетесь по крайней мере в одном из этих объектов, чтобы делать что-нибудь с сервером. Этот класс может создать отдельный объект запросов или непосредственно выполнять запросы. Отдельный объект запроса является рекомендуемым путем, поскольку это дает Вам гораздо больше мощности.

Объект запроса

Этот объект представляет собой рекомендуемый путь выполнения запросов. Это подкласс от strstream, что означает, что Вы можете писать в него данные подобно любому другому потоку. Это сделано, чтобы помочь Вам в гибком и простом формировании запросов.

Вы можете также устанавливать запросы Template с этим классом. Запросы Template представляют собой путь установки запросов с заменяемыми параметрами, которые Вы можете изменять через Вашу программу.

Вы можете также использовать специализированные структуры и даже динамические (на сайте разработчиков они почему-то названы драматическими) наборы результатов, чтобы упростить создание и обработку запросов.

Объект Query возвращает объект с информацией относительно успеха запроса для запросов не-select (запросы, которые не возвращают набор результатов).

Наборы результатов

Для запросов, которые возвращают набор результатов, имеются два различных пути обработки результатов: в динамическом наборе или в статическом.

Динамический набор результатов

Динамический набор результатов представляет собой такой набор результатов, в котором имена столбцов и тип информации столбцов не должны быть определены во времени компиляции. Набор результатов может быть полностью постоянным, в нем жанные будут возвращены Вам в классе constant string link class, частично постоянным, тогда Вы можете изменять данные по одной строке за раз, или полностью переменным, в этом случае Вы можете менять данные как угодно.

Постоянный набор результатов почти аналогичен набору результатов в C API. Он обеспечивает наибольшие функциональные возможности. С этим набором результатов Вы можете выяснять детализированную информацию относительно типа информации, сохраненной в каждом из столбцов. Это также самое быстрое решение потому, что данные не должны быть скопированы вообще.

Частично постоянный набор результатов подобен постоянному набору результатов за исключением того, что Вы можете изменять данные по одной строке за раз. Данные, которые Вы изменяете, фактически копия данных, возвращенных сервером. Это означает, что изменение данных не изменяет фактический набор результатов.

Частично постоянный набор результатов почти то же самое, что и постоянный набор результатов. Единственное различие в том, что когда Вы запрашиваете строку из результата, Вы можете объявить ее изменяемой явно. Это означает, что Вы можете получать некоторые строки как постоянные, а другие как изменчивые.

Полностью изменяемый набор результатов подобен постоянному за исключением того, что данные полностью изменчивы в том смысле, что Вы можете изменять данные в фактическом наборе результатов. Однако, в отличие от первого, этот набор результатов не связан с набором результатов из C API. Взамен это создается копия данных, возвращенных C API в двухмерном векторе. Из-за этого детализированная информация относительно каждого из столбцов в настоящее время не доступна, только имена столбца и тип в C++, который наиболее близко соответствует оригинальному типу из SQL. Кроме того, поскольку это делает копию данных, возвращенных из C API, быстродействие будет чуть пониже.

Строки во всех динамических наборах результатов очень близки к контейнеру произвольного доступа из Standard Template Library (STL). Это означает, что они имеют iterator, который может использоваться для STL-алгоритмов. Имеется несколько специализированных сервисных функций, чтобы помочь в использовании наборов результатов в STL-алгоритмах.

Столбцы во всем динамическом результате также очень близки к контейнеру произвольного доступа из STL. Однако, в дополнение к доступу к столбцам по по их индексным числам, Вы можете также обращаться к столбцам через их имена полей.

Кроме того, поскольку строки и столбцы подобны контейнерам, Вы можете также обрабатывать набор результатов как двумерный массив. Например, Вы можете получить 5-ый элемент в 3-ей строке простым запросом result[3][5]. А так как Вы можете также использовать имена полей, Вы можете написать вместо номера поля его имя, например, result[3]["price"], чтобы получить элемент "price" в 3-ей строке.

Фактические данные, возвращаемые динамическим набором результатов, сохранены в специальной строке подобно классу, которая имеет некоторые дополнительные полезные свойства. А именно: данные столбца автоматически преобразуются во все базисные типы данных, также как некоторые дополнительные типы, которые разработаны, чтобы обработать типы mysql, которые включают типы для обработки дат, времен, наборов и величин со значением null. Если имеется проблема в преобразовании, будет установлена метка предупреждения или возвращена исключительная ситуация в зависимости от того, как пакет настроен. Относительно исключительных ситуаций: MySQL++ поддерживает два различных метода рассмотрения исключительных ситуаций. Первый работает по фиксированному типу, второй (новый) представляет собой стандартный тип C++, использующий метод what(). Выбор методов должен быть выполнен при формировании библиотеки. Если скрипт выбора конфигурации выполнен с опцией -enable-exception, то новый метод будет использоваться. Если никакая опция не обеспечивается, или используется -disable-exception, всегда используется старый метод исключений MySQL++.

Динамические наборы результатов могут даже использоваться, чтобы помочь формировать запросы с помощью некоторого дополнительного метода. Имеются методы для возвратов: 1) Разделенный запятыми список данных (например: 1.5, 10, "Dog", "Brown"), 2) Разделенный запятыми список имен полей (например: age, weight, what, color), 3) Список присваиваний (например: age = 1.5 AND weight = 10 AND what = "Dog" AND color = "Brown").

Изменчивые наборы результатов могут быть созданы так, чтобы Вы могли воспользоваться преимуществом этих методов во вставке данных в базу данных без необходимости писать дополнительные запросы.

Статические наборы результатов

Результаты запроса могут также быть сохранены статически в специализированной структуре SQL. Эти структуры затем будут сохранены в некотором STL-контейнере, например, векторе или списке. В отличие от динамических наборов результатов принимается, что программист знает то, что набор результатов собирается вернуть. Из-за этого вся информация относительно столбцов, включая имена, будет потеряна.

Специализированные структуры являются термином C++ structs. Каждый элемент члена сохранен с уникальным именем внутри структуры. Вы никоим образом не можете использовать STL-алгоритмы или что-нибудь еще из STL, чтобы работать с индивидуальными элементами структур. Однако, поскольку эти структуры все равно затем будут сохранены в STL-контейнерах, Вы можете использовать STL-алгоритмы на контейнерах этих структур. Контейнеры представляют строки, а индивидуальные элементы структуры представляют столбцы. Например, Вы можете обращаться к элементу, именованному "price" в третьей строке как к result[3].price. В динамическом наборе результатов то же самое достигается записью result[3]["price"].

Если имеется проблема в преобразовании из набора результатов, возвращенного сервером, к специализированным структурам, возникает исключительная ситуация, которую нужно обработать.

Чтобы помочь в создании запросов, использующих эти специализированные структуры, тот же самый запрос, доступен для применения в динамических наборах результатов. Это включает методы для возврата списков данных.

Динамические полностью изменчивые наборы

Этот набор результатов будет выполнен, когда курсоры на стороне сервера будут поддерживаться в MySQL. Но, основываясь на приобретенном знании и опыте при проектирования MySQL++ и MySQLGUI, была сделана предварительная версия. Этот набор результатов полностью динамический в том смысле, что весь набор результатов сохранен в динамическом контейнере C++. Этот контейнер будет только кэшировать набор результатов, и он будет иметь заданный по умолчанию размер. Этот динамический контейнер будет окном в M строк из всего набора результатов в N строк, где N ограничено сервером MySQL. Этот набор результатов будет также полностью динамическим в том смысле, что имена столбцов и тип информации столбцов не должны быть определены во время компиляции. Но все существующие функциональные возможности статических и динамических наборов будут также доступны и в этом наборе. Этот набор будет также иметь методы для модифицирования, удаления и вставки строк, а также ряд специализированных макрокоманд для конструирования классов.

Дополнение

В дополнение к материалу, упомянутому выше, хочу заметить, что есть много универсальных классов, которые могут использоваться с другими программами. Примеры этого включают специальный класс const string, адаптер произвольного доступа, который будет делать контейнер произвольного доступа из класса только с методом size() и определенным оператором subscript ([]), а также универсальный класс запроса SQL, который может использоваться любым SQL C или C++ API.

Начиная с версии 1.7, имеется новое дополнение к библиотекам. Добавилось несколько очень полезных функций для строк STL, которые могут применяться в любом приложении на C++, неважно, скомпоновано оно с MySQL++ или нет. Эти функции содержатся в исходных файлах string_util.hh и string_util.cc.

3.3. Важные изменения

3.3.1 Текущие изменения

  • Синтаксис списка равенства для SSQLS сменился с equal_list (cchar *, Manip, cchar *) на equal_list (cchar *, cchar *, Manip).
  • Начиная с версии 1.3 mysql++, больше не может компилироваться транслятором GNU версии ниже, чем 2.95. Начиная с версии 1.3, mysql++ был изменен, чтобы учесть и обработать изменения в различных аспектах C++ в версии 2.95. Собственно из-за этого-то пакет и перестал компилироваться версиями GNU 2.7.xx, 2.8.xx и более ранними. Также не поддерживается egcs 1.x.x. Хотя с некоторыми изменениями в коде mysql++ может быть откомпилирован и этими трансляторами выполнение таких программ кончится провалом.
  • Из-за проблем совместимости нельзя использовать g++ 2.95.3 и g++ 2.96.
  • Имеются отдельные версии для компиляторов Borland C++, VC++ и Compaq на Tru64.
  • Было также отмечено, что на некоторых инсталляциях SPARC Solaris исключительные ситуации C++ не работают с gcc 2.95.2. Этот случай был проверен и установлено, что mysql++ формируется безукоризненно на Solaris с помощью gcc version 2.95 19990728 (release).
  • Конструкторы ``connection'' для Connection и Connection::connect (формально известны как Mysql) переделаны так, чтобы имя базы данных было первым параметром. То же самое имеет силу для метода connect.
  • Все новые свойства клиентов, реализованные в 3.22.xx как различные параметры на connect, поддерживаются новым конструктором и методом real_connect.
  • Также поддерживаются новые параметры конфигурации в 3.23.xx.
  • Mysql++ теперь может компилироваться на Win32 с использованием Cygwin транслятора от Cygnus Inc.
  • Autoconf и Automake полностью выполнены.
  • Specialized SQL Structures (формально известны как Custom Mysql Structures) изменены с mysql_ на sql_.
  • Изменены все функции, которые возвращают ноль (false) при успехе и отличное от ноля значение (true) в противном случае, на bool. Это означает, что они теперь возвращают true при успехе и false в противном случае. Это означает, что Вы теперь должны отрицать Ваши выражения, которые проверяют вывод этих функций.
  • Почти все методы, которые возвращали MysqlString, теперь возвращают нормальные строки. Поскольку объекты MysqlString преобразуются в строки, нет проблем с MysqlString s = mysql.host_info.
  • Тип данных MysqlRow теперь возвращает MysqlString или MysqlColData. Он теперь подклассифицируется из специального строкового класса, который написан, чтобы обработать строковые константы намного более эффективным путем (то есть, это не копирует их). К сожалению, этот тип данных также более ограничен.
  • Добавлены все необходимые методы, имеющие отношение к административным функциям.
  • Mysql++ теперь цитирует и экранирует объекты автоматически, если данные столбца используются с оператором <<.
  • Mysql++ теперь имеет намного более безопасное выполнение INSERT, UPDATE и DELETE с новым методом exec().
  • Mysql++ теперь имеет лучшую конфигурацию.
  • Имеется новый метод выборки строк.
  • Mysql++ может работать и с двоичными данными.
  • Сделана стандартная обработка исключений для C++ с методом what().
  • Вся обработка преобразований 64 int в строки теперь переместились в libmysqlclient.
  • Программы, написанные с применением MySQL++, теперь будут автоматически читать все релевантные файлы конфигурации MySQL.

3.3.2 Что планируется сделать

  • Полностью изменчивые наборы результатов
  • Поведение MysqlString, когда используется с двоичными операторами, изменится в следующей версии. Вместо того, чтобы преобразовать в тип с другой стороны оператора, MysqlString будет преобразовывать данные в тот тип, какой указан сервером Mysql первоначально. Это будет намного безопаснее.

3.4. Руководство по примерам

3.4.1 Введение

Это описание, как предполагается, дает Вам начало использования Mysql++ API. Пакет этот сложный, с большим количеством свойств, так что начните с чего-то простого.

3.4.2 Предположения

Этот учебник предполагает, что Вы знаете C++ довольно хорошо. Считается, что Вы знакомы с исключениями и Standard Template Library (STL).

3.4.3 Запуск примеров

Все коды примеров формируют полные программы. Однако, чтобы использовать их, Вы должны сначала откомпилировать их, для чего перейдите в каталог с примерами и наберите там make. Затем Вы должны установить базу данных запуском reset-db. Параметры здесь такие:

reset-db [host [user [password]]]
Если Вы не указываете host, по умолчанию принимается localhost. Если Вы не указываете имя пользователя, по умолчанию принимается Ваше актуальное имя пользователя. Если Вы не указываете пароль, по умолчанию принимается, что Вы не нуждаетесь в нем.

Когда Вы выполняете программу, Вы должны иметь права доступа с разрешением создавать базы данных. Как только база данных создана, Вы можете использовать другие права доступа для полного доступа к базе данных mysql_cpp_data.

Вы должны также выполнить программу reset-db между примерами, которые изменяют данные, чтобы все работало как надо.

3.4.4 Основы

3.4.4.1 Простой пример

Следующий пример показывает, как открыть подключение, выполнить простой запрос и отобразить результаты. Код может быть найден в файле simple1.cc, который размещен в каталоге примеров пакета.

#include <iostream>
#include <iomanip>
#include <sqlplus.hh>

int main()
{
  Connection con("mysql_cpp_data");
  // The full format for the Connection constructor is
  // Connection(cchar *db, cchar *host="", cchar *user="", cchar *passwd="")
  // You may need to specify some of them if the database is not on
  // the local machine or you database username is not the same as your
  // login name, etc..

  Query query = con.query();
  // This creates a query object that is bound to con.

  query << "select * from stock";
  // You can write to the query object like you would any other ostrem

  Result res = query.store();
  // Query::store() executes the query and returns the results

  cout << "Query: " <<query.preview() << endl;
  // Query::preview() simply returns a string with the current query
  // string in it.
  cout << "Records Found: "<< res.size() <<
       endl <<endl;
  Row row;
  cout.setf(ios::left);
  cout << setw(17) << "Item" << setw(4)
       <<"Num" << setw(7) <<"Weight"
       << setw(7) <<"Price" << "Date"
       <<endl << endl;
  Result::iterator i;
  // The Result class has a read-only Random Access Iterator
  for (i = res.begin(); i != res.end(); i++)
  {
    row = *i;
    cout << setw(17) << row[0] << setw(4)
         << row[1] << setw(7) << row["weight"]
         << setw(7) <<row[3]
         << row[4] <<endl;
  }
  return 0;
}

3.4.4.2 Немного более сложный пример

Этот пример почти подобен предыдущему, однако он использует исключительные ситуации и автоматическое свойство преобразования ColData. Файл с ним назван complic1.cc.

#include <iostream>
#include <iomanip>
#include <sqlplus.hh>

int main()
{
  try
  { // its in one big try block
    Connection con(use_exceptions);
    con.connect("mysql_cpp_data");
    // Here  we broke making the connection into two calls.
    // The first one creates the Connection object with the
    // use exceptions option turned on and the second one
    // makes the connection

    Query query = con.query();
    query << "select * from stock";
    Result res = query.store();
    cout << "Query: " <<query.preview() << endl;
    cout << "Records Found: "<< res.size() <<
         endl <<endl;
    Row row;
    cout.setf(ios::left);
    cout << setw(17) << "Item" << setw(4)
         <<"Num" << setw(7) <<"Weight"
         << setw(7) <<"Price" << "Date"
         <<endl << endl;
    Result::iterator i;
    cout.precision(3);
    for (i = res.begin(); i != res.end(); i++)
    {
      row = *i;
      cout << setw(17) <<row["item"] <<
           setw(4) <<row[1] << setw(7) <<
           (double)row[2] << setw(7) <<(double)row[3];
      Date date = row["sdate"];
      // The ColData is implicitly converted to a date here.
      cout.setf(ios::right);
      cout.fill('0');
      cout << setw(2) <<date.month << "-" <<
           setw(2) << date.day << endl;
      cout.fill(' ');
      cout.unsetf(ios::right);
    }
    return 0;
  } catch (BadQuery er)
  { // handle any connection or
    // query errors that may come up
    cerr << "Error: " <<er.error << endl;
    return -1;
  } catch (BadConversion er)
  { // handle bad conversions
    cerr << "Error: Tried to convert \"" << er.data
         << "\" to a \"" << er.type_name
         <<"\"." <<endl;
    return -1;
  }
}

Все должно быть довольно очевидно. Приведу лишь несколько примечаний относительно исключительных ситуаций:

    Когда флажок use_exceptions установлен для родительского объекта, он также установлен для всех потомков, созданных после того, как флажок был установлен. Например, когда флажок use_exceptions установлен для объекта con, он также установлено и для объекта query. Пожалуйста, обратите внимание, что флажок use_exceptions не компонуется, а копируется. Это означает, что, когда Вы изменяете флажок use_exceptions, это воздействует только на новые объекты, но не на старые.
  1. ColData будет всегда создавать исключительную ситуацию, когда сталкивается с плохим преобразованием. Плохое преобразование определено как преобразование в котором: a) Не все символы из строки читаются, и b) Символы после числа не точки (.), нули (0) или пробелы. Таким образом, когда ``1.25'' преобразован в int, исключительная ситуация будет создана, а вот при обработке ``1.00'' в int все будет в порядке, поскольку символы нуль и точка.

3.4.4.3 Получение информации о полях

Следующий пример показывает, как получить некоторую базисную информацию относительно полей, включая имя поля и тип SQL. Файл назван fieldinfo1.cc.

#include <iostream>
#include <iomanip>
#include <sqlplus.hh>

int main()
{
  try
  { // its in one big try block
    Connection con(use_exceptions);
    con.connect("mysql_cpp_data");
    Query query = con.query();
    query << "select * from stock";
    Result res = query.store();
    cout << "Query: " <<query.preview() << endl;
    cout << "Records Found: "<< res.size() <<
         endl <<endl;
    cout << "Query Info:\n";
    cout.setf(ios::left);
    for (unsigned int i = 0; i < res.size(); i++)
    {
      cout << setw(2) << i << setw(15) <<
           res.names(i).c_str() << setw(15) <<
           res.types(i).sql_name() << setw(20) <<
           res.types(i).name() << endl;
    }
    cout << endl;
    if (res.types(0) == typeid(string))
       cout << "Field 'item' is of an sql type which most closely resembles a\n"
            << "the c++ string type\n";
    if (res.types(1) == typeid(short int))
       cout << "Field 'num' is of an sql type which most closely resembles a\n"
            << "the c++ short int type\n";
    else if (res.types(1).base_type() == typeid(short int))
      cout << "Field 'num' base type is of an sql type which most closely \n"
           << "resembles a the c++ short int type\n";
    return 0;
  } catch (BadQuery er)
  {
    cerr << "Error: " << er.error << endl;
    return -1;
  } catch (BadConversion er)
  {
    cerr << "Error: Tried to convert \"" << er.data
         << "\" to a \"" << er.type_name
         << "\"." << endl;
    return -1;
  }
}

3.4.5 Специализированные структуры SQL

3.4.5.1 Получение данных

Следующий пример показывает довольно интересное понятие, известное как Specialized SQL Structures (SSQLS). Имя файла для этого кода: custom1.cc.

#include <iostream>
#include <iomanip>
#include <vector>
#include <sqlplus.hh>
#include <custom.hh>

sql_create_5 (stock, 1, 5, string, item, int, num, double, weight,
              double, price, Date, sdate)

// this is calling a very complex macro which will create a custom
// struct "stock" which has the variables:
//   string item
//    int num
//    ...
//    Date sdate
// defined as well methods to help populate the class from a mysql row
// among other things that I'll get too in a latter example
int main ()
{
  try
  {
    Connection con (use_exceptions);
    con.connect ("mysql_cpp_data");
    Query query = con.query ();
    query << "select * from stock";
    vector < stock > res;
    query.storein (res);
    // this is storing the results into a vector of the custom struct
    // "stock" which was created my the macro above.
    cout.setf (ios::left);
    cout << setw (17) << "Item" << setw (4)
         << "Num" << setw (7) << "Weight"
         << setw (7) << "Price" << "Date"
         << endl << endl;
    cout.precision(3);
    vector <stock>::iterator i;
    for (i = res.begin (); i != res.end (); i++)
    {
      cout << setw (17) << i->item.c_str ()
           << setw (4) << i->num << setw (7)
           << i->weight << setw (7) <<
           i->price << i->sdate << endl;
    }
    return 0;
  } catch (BadQuery er)
  { // handle any connection
    // or query errors that may come up
    cerr << "Error: " << er.error << endl;
    return -1;
  } catch (BadConversion er)
  {
    // we still need to cache bad conversions incase something goes
    // wrong when the data is converted into stock
    cerr << "Error: Tried to convert \"" << er.data
         << "\" to a \"" << er.type_name
         << "\"." << endl;
    return -1;
  }
}

Как Вы можете видеть, SSQLS очень мощная штука.

3.4.5.2 Добавление данных

SSQLS может также использоваться, чтобы добавить данные в таблицу. Имя файла для этого кода: custom2.cc.

#include <iostream>
#include <vector>
#include <sqlplus.hh>
#include <custom.hh>
#include "util.hh"

sql_create_5(stock, 1, 5, string, item, int, num,
             double, weight, double, price, Date, sdate)

int main()
{
  try
  { // its in one big try block
    Connection con(use_exceptions);
    con.connect("mysql_cpp_data");
    Query query = con.query();
    stock row;
    /* row.item = "Hot Dogs";
    row.num = 100;
    row.weight = 1.5;
    row.price = 1.75;
    row.sdate = "1998-09-25"; */
    row.set("Hot Dogs", 100, 1.5, 1.75, "1998-09-25");
    // populate stock
    query.insert(row);
    // form the query to insert the row
    // the table name is the name of the struct by default
    cout << "Query : " << query.preview() << endl;
    // show the query about to be executed
    query.execute();
    // execute a query that does not return a result set
    print_stock_table(query);
    // now print the new table;
  } catch (BadQuery er)
  {
    cerr << "Error: " <<er.error << endl;
    return -1;
  } catch (BadConversion er)
  {
    cerr << "Error: Tried to convert \"" << er.data
         << "\" to a \"" << er.type_name
         << "\"." <<endl;
    return -1;
  }
}

Так как этот пример изменяет данные, Вы должны выполнить программу reset-db после работы примера.

3.4.5.3 Изменение данных

Очень просто изменять данные с помощью SSQLS. Имя файла: custom3.cc.

#include <iostream>
#include <vector>
#include <sqlplus.hh>
#include <custom.hh>
#include "util.hh"
// util.hh/cc contains the print_stock_table function

sql_create_5(stock, 1, 5, string, item, int, num,
             double, weight, double, price, Date, sdate)

int main()
{
  try { // its in one big try block
    Connection con(use_exceptions);
    con.connect("mysql_cpp_data");
    Query query = con.query();
    query << "select * from stock where item = \"Hotdogs' Buns\" ";
    Result res = query.store();
    if (res.empty())
       throw BadQuery("Hotdogs' Buns not found in table, run reset-db");
    stock row = res[0];
    stock row2 = row;
    row.item = "Hotdog Buns";   // now change item
    query.update(row2, row);
    // form the query to replace the row
    // the table name is the name of the struct by default
    cout << "Query : " << query.preview() << endl;
    // show the query about to be executed
    query.execute();
    // execute a query that does not return a result set
    print_stock_table(query);
    // now print the new table;
  } catch (BadQuery er) {
    cerr << "Error: " << er.error << endl;
    return -1;
  } catch (BadConversion er)
  {
    cerr << "Error: Tried to convert \"" << er.data
         << "\" to a \"" << er.type_name
         << "\"." << endl;
    return -1;
  }
}

Когда Вы выполняете пример, обратите внимание, что в предложении where проверено только поле item. Не забудьте выполнить reset-db после работы этого примера.

3.4.5.4 Less-Than-Comparable

SSQLS могут также быть сделаны less-than-comparable. Это означает, что структуры могут сортироваться и сохраняться в наборах результатов как показывается в следующем примере. Имя файла: custom4.cc.

#include <iostream>
#include <iomanip>
#include <vector>
#include <sqlplus.hh>
#include <custom.hh>

sql_create_5(stock, 1, 5, string,item, int,num, double,weight,
             double,price, Date,sdate)

int main()
{
  try
  { // its in one big try block
    Connection con(use_exceptions);
    con.connect("mysql_cpp_data");
    Query query = con.query();
    query << "select * from stock";
    set <stock> res;
    query.storein(res);
    // here we are storing the elements in a set not a vector.
    cout.setf (ios::left);
    cout << setw (17) << "Item" << setw (4)
         << "Num" << setw (7) << "Weight"
         << setw (7) << "Price" << "Date"
         << endl << endl;
    // Now we we iterate through the set.
    // Since it is a set the list will
    // naturally be in order.
    set <stock>::iterator i;
    cout.precision(3);
    for (i = res.begin (); i != res.end (); i++)
    {
      cout << setw (17) << i->item.c_str ()
           << setw (4) << i->num
           << setw (7) << i->weight << setw (7)
           << i->price << i->sdate << endl;
    }
    i = res.find(stock("Hamburger Buns"));
    if (i != res.end())
       cout << "Hamburger Buns found. Currently " << i->num
            << " in stock.\n";
    else cout << "Sorry no Hamburger Buns found in stock\n";
    // Now we are using the set's find method to find out how many
    // Hamburger Buns are in stock.
    return 0;
  } catch (BadQuery er)
  {
    cerr << "Error: " << er.error << endl;
    return -1;
  } catch (BadConversion er)
  {
    cerr << "Error: Tried to convert \"" << er.data
         << "\" to a \"" << er.type_name
         << "\"." << endl;
    return -1;
  }
}

3.4.6 Сделаем еще лучше

При начале разработки MySQl++ 1.6 авторы представили три новых примера, чья цель состоит в том, чтобы показать некоторых из самых сильных свойств MySQL++, а также обеспечить решение некоторых из наиболее частых проблем. Эти примеры иллюстрируют превосходство C++ над другими существующими языками.

Поскольку эти примеры предполагаются к активному использованию (и применяются многими пользователями), константы, которые могут отличаться в разных ситуациях, были сгруппированы, чтобы упростить редактирование. Также, все эти примеры содержат полную ошибку, проверяющую код. Это один из тех редких случаев, в которых обработка исключительной ситуации, принятая в С++, полностью применена в MySQL++.

3.4.6.1 Загрузка двоичного файла в столбец типа BLOB

Эта функция появилась в MySQL version 3.23, но многие пользователи все еще используют старые версии. Пример показывает несколько свойств MySQL++. Эта программа требует одного параметра, который является полным путевым именем для двоичного файла.

#include <sys/stat.h>
#include <fstream>
#include <mysql++>

extern int errno;
const char MY_DATABASE[]="telcent";
const char MY_TABLE[]="fax";
const char MY_HOST[]="localhost";
const char MY_USER[]="root";
const char MY_PASSWORD[]="";
const char MY_FIELD[]="fax";   // BLOB field

int main(int argc, char *argv[])
{
  if (argc < 2)
  {
     cerr << "Usage: load_file full_file_path" <<
          endl<< endl;
     return -1;
  }
  Connection con(use_exceptions);
  try
  {
    con.real_connect(MY_DATABASE,MY_HOST,MY_USER,MY_PASSWORD,3306,
                     (int)0,60,NULL);
    Query query = con.query();
    ostrstream strbuf;
    ifstream In (argv[1],ios::in| ios::binary);
    struct stat for_len;
    if ((In.rdbuf())->is_open())
    {
       if (stat (argv[1],& for_len) == -1) return -1;
       unsigned int blen = for_len.st_size;
       if (!blen) return -1;
       char *read_buffer= new char[blen];
       In.read(read_buffer,blen);
       string fill(read_buffer,blen);
       strbuf << "INSERT INTO " << MY_TABLE
              <<" (" << MY_FIELD <<
              ") VALUES(\"" << escape <<
              fill << "\")";
       query.exec(strbuf.str());
       delete[] read_buffer;
    }
    else cerr << "Your binary file " << argv[1]
              << "could not be open, errno = " << errno;
    return 0;
  } catch (BadQuery er)
  {
    cerr << "Error: " <<er.error << " "
         <<con.errnum() << endl;
    return -1;
  }
}

Одно из свойств, которое отображается в этом примере, манипулятор escape. Хотя автоматическое цитирование и экранирование появилось в версии 1.6, это применимо только к классам ColData, так как они содержат информацию о типе данных. Авторы пакета могли бы также делать цитирование и экранировку на общей строке типа данных, но требуется просмотреть всю строку, чтобы выявить все места, где нужна экранировка служебных символов. Поскольку это свойство замедлит код, оно не реализовано.

3.4.6.1 Отображение картинок в HTML из столбцов типа BLOB

Этот пример также очень короткий. Рассмотрим функцию, которую он выполняет. Хотя с версии 3.23.3 имеется команда для сброса данных из столбцов BLOB в двоичный файл, эта программа может использоваться не только клиентами, все еще использующими старые версии, но и теми, кто не хочет сбрасывать картинку на диск.

#include <sqlplus.hh>
#define MY_DATABASE "telcent"
#define MY_TABLE "fax"
#define MY_HOST "localhost"
#define MY_USER "root"
#define MY_PASSWORD ""
#define MY_FIELD "fax" // BLOB field
#define MY_KEY "datet" // PRIMARY KEY

int main (int argc, char *argv[])
{
  if (argc < 2)
  {
     cerr << "Usage: cgi_image primary_key_value" <<
          endl<< endl;
     return -1;
  }
  cout << "Content-type: image/jpeg" << endl;
  Connection con(use_exceptions);
  try
  {
    con.real_connect(MY_DATABASE,MY_HOST,MY_USER,MY_PASSWORD,3306,
                     (int)0,60,NULL);
    Query query = con.query();
    query << "SELECT" << MY_FIELD << "FROM "
          << MY_TABLE << " WHERE " << MY_KEY
          <<" = " << argv[1];
    ResUse res = query.use();
    Row row=res.fetch_row();
    long unsigned int *jj = res.fetch_lengths();
    cout << "Content-length:" << *jj <<
         endl<< endl;
    fwrite(row.raw_data(0),1,*jj,stdout);
    return 0;
  } catch (BadQuery er)
  {
    cerr << "Error: " << er.error << " "
         << con.errnum() << endl;
    return -1;
  }
}

Этот пример показывает обработку двоичных данных в MySQL++, которая появилась в версии 1.6. Гибкое использование потоков допускает легкое использование этого кода во многих прикладных программах.

3.4.6.2 Удаление или модификация из Select

Об этом свойстве просят многие пользователи, но пока оно не сделано на уровне ядра СУБД, эта программа может использоваться вместо него. Это маленькая программка, которая также показывает некоторые свойства MySQL++.

#include <sqlplus.hh>
#define MY_DATABASE "telcent"
#define MY_TABLE "nazivi"
#define MY_HOST "localhost"
#define MY_USER "root"
#define MY_PASSWORD ""
#define MY_FIELD "naziv"
#define MY_QUERY "SELECT URL from my_table as t1, my_table as t2 \\
                 where t1.field = t2.field"

int main (void)
{
  Connection con(use_exceptions);
  try
  {
    ostrstream strbuf;
    unsigned int i=0;

    con.real_connect(MY_DATABASE,MY_HOST,MY_USER,MY_PASSWORD,3306,
                     (int)0,60,NULL);
    Query query = con.query();
    query << MY_QUERY;
    ResUse res = query.use();
    Row row;
    strbuf << "delete from " << MY_TABLE <<
           " where " << MY_FIELD << " in (";
    // for UPDATE just replace the above DELETE FROM with UPDATE statement
    for (;row=res.fetch_row();i++) strbuf << row[0] << ",";
    if (!i) return 0;
    string output(strbuf.str());
    output.erase(output.size()-1,1);
    output += ")";
    query.exec((const string&)output);
    // cout << output << endl;
    return 0;
  } catch (BadQuery er)
  {
    cerr << "Error: " << er.error << " "
         << con.errnum() << endl;
    return -1;
  }
}

Пожалуйста, сообщите в поле команды конструкции запроса MY_FIELD список значений для вставки. Значения поля будут цитироваться или нет в зависимости от их типа. Пользователи должны не должны ставить кавычки (или экранировать их символом escape), поскольку это приведет к ошибке. Этот метод требует несколько больше усилий от программиста. Программист может отключать это свойство, устанавливая соответствующую глобальную переменную переменную в false. Этот пример написан для выполнения DELETE. UPDATE требует изменений.

Все пользователи этих примеров должны быть осторожны: еще одна проверка требуется, чтобы выполнить этот запрос безопасно. А именно, в некоторых критических случаях размер запроса может превысить значение max_allowed. Эта проверка должна быть добавлна.

3.4.6.2 Двинемся дальше

Это только общий обзор того, что SSQLS может делать. Для получения большего количества информации обратитесь к главе 3.7.

3.4.7 Шаблоны запросов

Другое мощное свойство Mysql++: можно устанавливать шаблоны запросов. Следующий пример показывает, как использовать их. Этот код представляет собой фактический код используемый, чтобы устанавливать и/или сбрасывать типовую базу данных. Этот код может быть найден в файле reset-db.cc.

#include <iostream>
#include <sqlplus.hh>
int main (int argc, char *argv[])
{
  Connection connection(use_exceptions);
  try
  { // the entire main block is one big try block;
    if (argc == 1) connection.connect("");
    else if (argc == 2) connection.connect("",argv[1]);
    else if (argc == 3) connection.connect("",argv[1],argv[2]);
    else if (argc <= 4) connection.connect("",argv[1],argv[2],argv[3]);
    // create a new object and connect based on any (if any) arguments
    // passed to main();
    try
    {
      connection.select_db("mysql_cpp_data");
    } catch (BadQuery er)
    {
      // if it couldn't connect to the database assume that it doesn't exist
      // and try created it. If that does not work exit with an error.
      connection.create_db("mysql_cpp_data");
      connection.select_db("mysql_cpp_data");
    }
    Query query = connection.query();  // create a new query object
    try
    { // ignore any errors here we hope to make this simpler soon
      query.execute("drop table stock");
    } catch (BadQuery er) {}
    query << "create table stock (item char(20) not null,
          num smallint," << "weight double,
          price double, sdate date)";
    query.execute(RESET_QUERY);
    // send the query to create the table and execute it.  The
    // RESET_QUERY tells the query object to reset it self after
    // execution
    query << "insert into %5:table values (%q0, %q1, %2, %3, %q4)";
    query.parse();
    // set up the template query  we will use to insert the data. The
    // parse method call is important as it is what lets the query
    // know that this is a template and not a literal string
    query.def["table"] = "stock";
    // This is setting the parameter named table to stock.
    query.execute("Hamburger Buns", 56, 1.25, 1.1, "1998-04-26");
    query.execute("Hotdogs' Buns",65, 1.1, 1.1, "1998-04-23");
    query.execute("Dinner Roles", 75, 0.95, 0.97, "1998-05-25");
    query.execute("White Bread", 87, 1.5, 1.75, "1998-09-04");
    // The last parameter "table" is not specified here. Thus
    // the default value for "table" is used which is "stock".
  } catch (BadQuery er)
  { // handle any errors that may come up
    cerr << "Error: " <<er.error << endl;
    return -1;
  }
}

3.3.5. Обзор классов

Этот раздел документирует все классы для внешнего использования. Если некий класс не зарегистрирован здесь, не используйте кго, поскольку он представляет собой метод или класс для внутреннего пользования.

3.3.5.1 struct BadConversion

Используется для создания исключительной ситуации, когда происходит плохое преобразование.

Тип

instantiable

Включаемый файл

coldata1.hh

Описание

Методы public

  • BadConversion (const char* tn, const char* d, size_t r, size_t a)
  • size_t actual_size
  • const string data
  • size_t retrieved
  • const char* type_name

3.5.2 class BadNullConversion

Используется, когда значение Null пытаются преобразовать в тип, к которому оно не может быть преобразовано.

Тип

instantiable

Включаемый файл

null1.hh

3.5.3 class Connection

Основной обработчик базы данных.

Тип

instantiable

Включаемый файл

connection1.hh

Описание

Методы public

  • Connection ()
  • Connection (bool te)
  • Connection (const char *db, const char *host = "", const char *user = "", const char *passwd = "", bool te = true)
  • Connection (const char *db, const char *host, const char *user, const char *passwd, uint port, my_bool compress = 1, unsigned int connect_timeout = 5, bool te=true, cchar *socket_name = "")
  • int affected_rows ()
  • operator bool ()
    возвращает success()
  • string clinet_info ()
  • void close ()
  • bool connect (cchar *db = "", cchar *host = "", cchar *user = "", cchar *passwd = "")
  • bool connected () const
    возвращает true, если соединение успешно установлено
  • bool create_db (string db)
  • bool drop_db (string db)
  • int errnum ()
  • string error ()
    послкднее сообщение об ошибке
  • bool exec (const string &str)
  • ResNSel execute (const string &str)
  • ResNSel execute (const string &str, bool te)
  • st_mysql_options get_options (void) const
  • string host_info ()
  • string info ()
  • string infoo (void)
  • int insert_id ()
  • int kill (unsigned long pid)
  • bool lock ()
  • int ping (void)
  • int proto_info ()
  • void purge (void)
  • inline Query query ()
  • int read_options (enum mysql_option option, const char *arg)
  • bool real_connect (cchar *db = "", cchar *host = "", cchar *user = "", cchar *passwd = "", uint port = 0, my_bool compress = 0, unsigned int connect_timeout = 60, cchar *socket_name= "")
  • int refresh (unsigned int refresh_options)
  • bool reload ()
  • bool select_db (const char *db)
  • bool select_db (string db)
  • string server_info ()
  • bool shutdown ()
  • string stat ()
  • Result store (const string &str)
  • Result store (const string &str, bool te)
  • template class T void storein (deque T &con, const string &s)
  • template class T void storein (list T &con, const string &s)
  • template class T void storein (multiset T &con, const string &s)
  • template class T void storein (set T &con, const string &s)
  • template class T void storein (slist T &con, const string &s)
  • template class T void storein (vector T &con, const string &s)
  • template class Sequence void storein_sequence (Sequence &, const string &)
  • template class Set void storein_set (Set &, const string &)
    Сохраняет результаты в TYPE. TYPE может быть любым типом контейнера STL.
  • bool success ()
    возвращает true, если последний запрос был удачным
  • void unlock ()
  • ResUse use (const string &str)
  • ResUse use (const string &str, bool te)
  • ~ Connection ()

Методы Friend

  • friend Query
  • friend ResNSel
  • friend ResUse

3.5.4 struct Date

Специальный тип для хранения дат в формате mysql.

Тип

instantiable

Суперклассы

public mysql_date, public MysqlDTbase Date

Включаемый файл

datetime1.hh

Детальное описание

Date представляет собой структуру данных для хранения типов дат mysql. Используется в приеме потоков и операциях вставки.

Методы public

  • Date ()
  • Date (cchar* str)
  • Date (const string &str)
  • Date (const string &str)
  • short int compare (const Date& other) const

3.5.5 struct DateTime

Комбинация из Date и Time для хранения mysql-типа DateTime.

Тип

instantiable

Суперклассы

public mysql_date, public mysql_time, public MysqlDTbase DateTime

Включаемый файл

datetime1.hh

Описание

Методы public

  • DateTime ()
  • DateTime (cchar* str)
  • DateTime (const string &str)
  • DateTime (const string &str)
  • short int compare (const DateTime& other) const
  • cchar* convert (cchar*)
  • ostream& out_stream (ostream&) const

3.5.6 class FieldNames

Вектор имен полей.

Тип

instantiable

Суперклассы

public vector string

Включаемый файл

field_names1.hh

Описание

Методы public

  • FieldNames ()
  • FieldNames (const ResUse *res)
  • FieldNames (int i)
  • FieldNames& operator = (const ResUse *res)
    Создает новый список из данных в res.
  • FieldNames& operator = (int i)
    Создает новый список с i именами полей.
  • string& operator (int i)
    Возвращает имя поля для указанного индекса в списке.
  • const string& operator (int i) const
    Возвращает имя поля для указанного индекса в списке.
  • uint operator (string i) const
    Возвращает индекс поля с указанным именем.

3.5.7 class FieldTypes

Вектор типов полей.

Тип

instantiable

Суперклассы

public vector mysql_type_info

Включаемый файл

field_types1.hh

Описание

Методы public

  • FieldTypes ()
  • FieldTypes (const ResUse *res)
  • FieldTypes (int i)
  • FieldTypes& operator = (const ResUse *res)
    Создает новый список, основанный на информации в res
  • FieldTypes& operator = (int i)
    Создает новый список с i полями.
  • mysql_type_info& operator (int i)
    Возвращает тип поля для поля со смещением i.
  • const mysql_type_info& operator (int i) const
    Возвращает тип поля для поля со смещением i.

3.5.8 class Fields

Вектор, подобный контейнеру с чистыми данными mysql о поле.

Тип

instantiable

Суперклассы

public const_subscript_container Fields, Field

Включаемый файл

fields1.hh

Описание

Методы public

  • Fields ()
  • Fields (ResUse *r)
  • const Field& operator (int i) const
  • const Field& operator (size_type i) const
  • size_type size () const
    Число полей. Возвращает поле со смещением i.

3.5.9 template class MysqlCmp class BinaryPred, class CmpТип

Тип

instantiable

Суперклассы

public unary_function const MysqlRow&, bool

Включаемый файл

compare1.hh

Описание

Методы public

  • MysqlCmp (uint i, const BinaryPred &f, const CmpType &c)
  • bool operator () (const MysqlRow& cmp1) const

Методы Protected

  • CmpType cmp2
  • BinaryPred func
  • unsigned int index

3.5.10 template class MysqlCmpCStr class BinaryPred

Тип

instantiable

Суперклассы

public MysqlCmp BinaryPred, const char *

Включаемый файл

compare1.hh

Описание

Методы public

  • MysqlCmpCStr (uint i, const BinaryPred &f, const char* c)
  • bool operator () (const MysqlRow& cmp1) const

3.5.11 template struct MysqlDTbase class T

Тип

abstract

Включаемый файл

datetime1.hh

Методы public

  • virtual short int compare (const T &other) const
  • bool operator != (const T &other) const
  • bool operator (const T &other) const
  • bool operator = (const T &other) const
  • bool operator == (const T &other) const
  • bool operator (const T &other) const
  • bool operator = (const T &other) const

3.5.12 template class MysqlListInsert class T, class value_type = typename T::value_type

Тип

instantiable

Включаемый файл

set1.hh

Методы public

  • MysqlListInsert (T *o)
  • void operator () (const value_type &data)

3.5.13 template class MysqlSetInsert class T, class key_type = typename T::key_Тип

Тип

instantiable

Включаемый файл

set1.hh

Методы public

  • MysqlSetInsert (T *o)
  • void operator () (const key_type &data)

3.5.14 template class Null class Type, class Behavior = NullisNull

Контейнерный класс для хранения типов с поддержкой null.

Тип

instantiable

Включаемый файл

null1.hh

Методы public

  • Null ()
  • Null (Type x)
  • Null (const null_type &n)
    Дает Null значение null.
  • Type data
  • bool is_null
  • Null& operator = (const null_type &n)
  • Null& operator = (const null_type &n)
  • typedef Type value_type

3.5.15 struct NullisBlank

Тип нужный, чтобы использовать для параметра поведения для Null.

Тип

instantiable

Включаемый файл

null1.hh

Описание

Методы public

  • static const char * null_is ()
  • static ostream& null_ostr (ostream &o)

3.5.16 struct NullisNull

Тип нужный, чтобы использовать для параметра поведения для Null.

Тип

instantiable

Включаемый файл

null1.hh

Описание

Методы public

  • static null_type null_is ()
  • static ostream& null_ostr (ostream& o)

3.5.17 struct NullisZero

Тип нужный, чтобы использовать для параметра поведения для Null.

Тип

instantiable

Включаемый файл

null1.hh

Описание

Методы public

  • static int null_is ()
  • static ostream& null_ostr (ostream &o)

3.5.18 class Query

Класс для выполнения запросов.

Тип

instantiable

Суперклассы

public SQLQuery

Включаемый файл

query1.hh

Детальное описание

Этот класс подклассифицируется из SQLQuery. Этот класс в отличие от SQLQuery свободно присоединен к объекту Mysql так, чтобы он мог выполнять запросы.

Описание

Методы public

  • Query (Connection *m, bool te = false)
    Создает новый объект запроса, связанный с подключением.
  • Query (const Query &q)
  • string error ()
    Сообщение об ошибке, если запрос не был успешным.
  • bool exec (const string &str)
    Выполняет запрос в буфере строк и возвращает структуру, которая содержит информацию о том, насколько успешным был запрос. Используйте это для запросов, которые не возвращают набор результатов, например, INSERT или UPDATE. Параметром может что-либо в имеющем силу SQLQuery.
  • template class T Query& insert (const T &v)
  • Query& operator = (const Query &q)
  • string preview ()
  • string preview (parms &p)
  • template class T Query& replace (const T &v)
  • bool success ()
    Отображает строку, которая в настоящее время лежит в буфере. Аналогично string().

3.5.19 struct ResNSel

Эта структура хранит информацию относительно успеха запросов, которые не возвращают наборы результатов.

Тип

instantiable

Включаемый файл

result1.hh

Описание

Методы public

  • ResNSel ()
  • ResNSel (Connection *q)
  • operator bool ()
    Если запрос был успешным.
  • string info
    Дополнительная информация о запросе.
  • int insert_id
  • int rows
    Число обработанных строк.
  • bool success

3.5.20 class ResUse

Тип

instantiable

Включаемый файл

result1.hh

Описание

Методы public

  • ResUse ()
  • ResUse (MYSQL_RES *result, Connection *m = NULL, bool te = false)
  • ResUse (const ResUse &other)
  • operator bool () const
  • unsigned int columns () const
  • bool eof () const
    Функция c api.
  • Field& fetch_field () const
    Функция c api field.
  • long unsigned int * fetch_lengths () const
    Функция c api.
  • Row fetch_row ()
    Функция c api.
  • inline string& field_name (int)
    Возвращает поле со смещением i.
  • inline const string& field_name (int) const
    Возвращает поле-константу со смещением i.
  • inline FieldNames& field_names ()
    Возвращает ссылку на основнорй класс FieldNames.
  • inline const FieldNames& field_names () const
    Возвращает ссылку на основнорй класс FieldNames.
  • inline int field_num (const string&) const
    Возвращает смещение регистрируемого поля, которое равняется str.
  • void field_seek (int field)
    Функция c api field.
  • inline mysql_type_info& field_type (int i)
    Возвращает ссылку на тип поля mysql для поля со смещением i.
  • inline const mysql_type_info& field_type (int) const
    Возвращает ссылку-константу на тип поля mysql для поля со смещением i.
  • inline FieldTypes& field_types ()
    Возвращает ссылку на основной FieldTypes.
  • inline const FieldTypes& field_types () const
    Возвращает ссылку-константу на основной FieldTypes.
  • const Fields& fields () const
    Возвращает ссылку на структуру Fields.
  • const Field& fields (unsigned int i) const
    Возвращает ссылку на информацию mysql о поле для поля со смещением i.
  • MYSQL_RES * mysql_result (void)
  • inline FieldNames& names ()
    Возвращает ссылку на основной класс FieldNames.
  • inline const FieldNames& names () const
    Возвращает ссылку-константу на основной класс FieldNames.
  • inline int names (const string& s) const
    Возвращает смещение для объекта, который равняется str.
  • inline string& names (int i)
    Возвращает поле со смещением i.
  • inline const string& names (int i) const
    Возвращает поле со смещением i.
  • int num_fields () const
    Функция c api field.
  • bool operator != (const ResUse &other) const
  • inline ResUse& operator = (const ResUse &other)
  • bool operator == (const ResUse &other) const
  • void parent_leaving ()
  • void purge (void)
  • inline void reset_field_names ()
    Сбрасывает имена полей к первоначальным значениям.
  • inline void reset_field_types ()
    Сбрасывает field_types к первоначальным значениям.
  • inline void reset_names ()
    Сбрасывает имена полей к первоначальным значениям.
  • inline void reset_types ()
    Сбрасывает имена полей к первоначальным значениям.
  • string& table ()
    Имя таблицы.
  • const string& table () const
    Имя таблицы.
  • inline FieldTypes& types ()
    Возвращает ссылку на основной FieldTypes.
  • inline const FieldTypes& types () const
    Возвращает ссылку-константу на основной FieldTypes.
  • inline mysql_type_info& types (int i)
    Возвращает ссылку на тип поля mysql для поля со смещением i.
  • inline const mysql_type_info& types (int i) const
    Возвращает ссылку-константу на тип поля mysql для поля со смещением i.
  • ~ ResUse ()

Методы protected

  • Fields _fields
  • mutable FieldNames * _names
  • string _table
  • mutable FieldTypes * _types
  • void copy (const ResUse& other)
  • Connection * mysql
  • mutable MYSQL_RES * mysql_res
  • bool throw_exceptions, initialized

Методы friend

  • friend Connection

3.5.21 class Result

Этот класс обрабатывает набор результатов.

Тип

instantiable

Суперклассы

public ResUse, public const_subscript_container Result,Row,const Row

Включаемый файл

result1.hh

Подробное описание

Это также Random Access Container, который не LessThanComparable и не Assignable. Будучи контейнером произвольного доступа (Random Access Container), это может возвращать Random Access Iterator или обратный Random Access Iterator.

Методы public

  • Result ()
  • Result (MYSQL_RES *result, bool te = false)
  • Result (const Result &other)
  • void data_seek (uint offset) const
    Функция c api
  • const Row fetch_row () const
    Функция c api
  • int num_rows () const
    Функция c api
  • const Row operator (size_type i) const
    Возвращает строку со смещением i.
  • size_type rows () const
    Возвращает число строк.
  • size_type size () const
    Возвращает число строк.
  • virtual ~ Result ()

Методы Friend

  • friend Connection

3.5.22 class Row

Этот класс обрабатывает фактические строки интеллектуальным способом.

Тип

instantiable

Суперклассы

public const_subscript_container Row,ColData,const ColData, public RowTemplate Row, ResUse

Включаемый файл

row1.hh

Методы public

  • Row ()
  • Row (MYSQL_ROW d, const ResUse *r, unsigned int *jj, bool te = false)
  • operator bool () const
    Возвращает true, если имеются какие-либо данные в строке.
  • inline const ColData operator (const string &i) const
    Возвращает значение поля с именем поля i. Этот метод не столь эффективен как использование индексного кода.
  • inline const ColData operator (const string &i) const
    Возвращает значение поля с именем поля i. Этот метод не столь эффективен как использование индексного кода.
  • const ColData operator (int i) const
  • inline const ColData operator (size_type i) const
    Возвращает значение поля с индексом поля i.
  • const ResUse& parent () const
  • const char * raw_data (int i) const
  • Row& self ()
  • const Row& self () const
  • inline size_type size () const
    Возвращает число столбцов.
  • ~ Row ()

3.5.23 template class RowTemplate class ThisType, class Res

Тип

abstract

Включаемый файл

row1.hh

Методы public

  • equal_list_ba FieldNames,ThisType,quote_type0 equal_list (const char *d = ",", const char *e = " = ") const
  • template class Manip equal_list_ba FieldNames,ThisType,Manip equal_list (const char *d, const char *e, Manip m) const
  • value_list_b FieldNames,quote_type0 field_list (bool t0, bool t1=false, bool t2=false, bool t3=false, bool t4=false, bool t5=false, bool t6=false, bool t7=false, bool t8=false, bool t9=false, bool ta=false, bool tb=false, bool tc=false) const
  • value_list_b FieldNames,quote_type0 field_list (const vector bool &vb) const
  • value_list_b FieldNames,quote_type0 field_list (const vector bool &vb) const
  • template class Manip value_list_ba FieldNames,Manip field_list (const char *d, Manip m) const
  • template class Manip value_list_b FieldNames,Manip field_list (const char *d, Manip m, bool t0, bool t1=false, bool t2=false, bool t3=false, bool t4=false, bool t5=false, bool t6=false, bool t7=false, bool t8=false, bool t9=false, bool ta=false, bool tb=false, bool tc=false) const
  • template class Manip value_list_b FieldNames,Manip field_list (const char *d, Manip m, const vector bool &vb) const
  • template class Manip value_list_b FieldNames,Manip field_list (const char *d, Manip m, string s0, string s1="", string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="", string s9="", string sa="", string sb="", string sc="") const
  • value_list_b FieldNames,quote_type0 field_list (const char *d, bool t0, bool t1=false, bool t2=false, bool t3=false, bool t4=false, bool t5=false, bool t6=false, bool t7=false, bool t8=false, bool t9=false, bool ta=false, bool tb=false, bool tc
  • value_list_b FieldNames,quote_type0 field_list (const char *d, const vector bool &vb) const
  • value_list_b FieldNames,quote_type0 field_list (const char *d, string s0, string s1="", string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="", string s9="", string sa="", string sb="", string sc="") const
  • value_list_b FieldNames,quote_type0 field_list (string s0, string s1="", string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="", string s9="", string sa="", string sb="", string sc="") const
  • virtual const Res & parent () const
  • value_list_b ThisType,quote_type0 value_list (bool t0, bool t1=false, bool t2=false, bool t3=false, bool t4=false, bool t5=false, bool t6=false, bool t7=false, bool t8=false, bool t9=false, bool ta=false, bool tb=false, bool tc=false) const
  • value_list_b ThisType,quote_type0 value_list (const vector bool &vb) const
  • value_list_b ThisType,quote_type0 value_list (const vector bool &vb) const
  • template class Manip value_list_ba ThisType,Manip value_list (const char *d, Manip m) const
  • template class Manip value_list_b ThisType,Manip value_list (const char *d, Manip m, bool t0, bool t1=false, bool t2=false, bool t3=false, bool t4=false, bool t5=false, bool t6=false, bool t7=false, bool t8=false, bool t9=false, bool ta=false, bool tb=false, bool tc=false) const
  • template class Manip value_list_b ThisType,Manip value_list (const char *d, Manip m, const vector bool &vb) const
  • template class Manip value_list_b ThisType,Manip value_list (const char *d, Manip m, string s0, string s1="", string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="", string s9="", string sa="", string sb="", string sc="") const
  • value_list_b ThisType,quote_type0 value_list (const char *d, bool t0, bool t1=false, bool t2=false, bool t3=false, bool t4=false, bool t5=false, bool t6=false, bool t7=false, bool t8=false, bool t9=false, bool ta=false, bool tb=false, bool tc=false) const
  • value_list_b ThisType,quote_type0 value_list (const char *d, const vector bool &vb) const
  • value_list_b ThisType,quote_type0 value_list (const char *d, string s0, string s1="", string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="", string s9="", string sa="", string sb="", string sc="") const
  • value_list_b ThisType,quote_type0 value_list (string s0, string s1="", string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="", string s9="", string sa="", string sb="", string sc="") const
  • virtual ~ RowTemplate ()

Методы protected

  • protected pure virtual ThisType& self ()
  • protected pure virtual const ThisType& self () const

3.5.24 struct SQLParseElement

Тип

instantiable

Включаемый файл

sql_query1.hh

Описание

Методы public

  • SQLParseElement (string b, char o, char n)
  • string before
  • char num
  • char option

3.5.25 class SQLQuery

Чистый класс запроса.

Тип

instantiable

Суперклассы

public strstream

Включаемый файл

sql_query1.hh

Подробное описание

Это чистый класс запроса. Он используется для того, чтобы формировать запросы, которые планируется послать объекту Connection. Класс Query может использоваться, если Вы желаете также выполнить запросы без того, чтобы посылать их объекту Connection.

Этот класс подклассифицируется из strstream. Это означает, что Вы можете писать в него подобно потоку, чтобы избежать необходимости создавать свой strstream или применять sprintf. Хотя Вы можете читать из запроса (потому, что это поток), это не рекомендуется. Я не могу гарантировать предсказуемость класса. Однако, можно использовать любой из методов потока, чтобы писать в него. Только удостоверьтесь, что буферные точки Вашего запроса записаны прежде, чем Вы попробуете использовать любой из специфических методов SQLQuery, кроме error() и success().

Методы public

  • SQLQuery ()
  • SQLQuery (const SQLQuery &q)
  • operator bool ()
  • SQLQueryParms def
    Заданный по умолчанию шаблон набора параметров.
  • string error () const
  • template class T SQLQuery& insert (const T &v)
  • mysql_query_define_const1 (string,str)
  • bool operator ! ()
    Возвращает полную строку запроса, заменяя ее заданными по умолчанию параметрами шаблона в случае необходимости. Подобно str(query_reset), но устанавливает параметры запроса от 0 до 11. Здесь query_reset может быть DONT_RESET или RESET_QUERY. Если это установлено в RESET_QUERY, то reset() будет вызван после того, как запрос возвращен. Если не имеется достаточно параметров, то это возвратит пустую строку, а success() будет равно false. Если любой из требуемых параметров равен null, этот метод произведет ошибку и возвратит пустую строку.
  • SQLQuery& operator = (const SQLQuery &q)
  • void parse ()
  • template class T SQLQuery& replace (const T &v)
  • bool success () const

Методы Protected

  • bool Success
  • char* errmsg
  • typedef SQLQueryParms parms
  • vector SQLParseElement parsed
  • vector string parsed_names
  • map string,int parsed_nums
  • void proc (parms &p)
  • typedef const SQLString& ss

Методы Friend

  • friend SQLQueryParms

3.5.26 struct SQLQueryNEParms

Исключительная ситуация, когда не задано достаточно параметров.

Тип

instantiable

Включаемый файл

sql_query1.hh

Подробное описание

Возникает, когда не задано достаточно параметров для шаблона запроса.

Методы public

  • SQLQueryNEParms (const char *c)
  • const char* error

3.5.27 class SQLQueryParms

Этот класс хранит значения параметров для заполнения шаблонов запроса.

Тип

instantiable

Суперклассы

public vector SQLString

Включаемый файл

sql_query1.hh

Подробное описание

Это подкласс вектора SQLStrings.

Методы public

  • SQLQueryParms ()
  • SQLQueryParms (SQLQuery *p)
  • bool bound ()
  • void clear ()
    Очищает весь список.
  • SQLQueryParms operator + (const SQLQueryParms &other) const
    Устанавливает элементы списка: 0 в a, 1 в b и т.д. Может определять до дюжины элементов.
  • SQLQueryParms & operator += (const SQLString &str)
    Добавляет элемент в список.
  • SQLQueryParms & operator (const SQLString &str)
    Добавляет элемент в список.
  • SQLString & operator (const char *str)
    Обращается к значению элемента с ключом str.
  • const SQLString & operator (const char *str) const
    Обращается к значению элемента с ключом str.
  • SQLString & operator (size_type n)
    Обращается к элементу с кодом n.
  • const SQLString & operator (size_type n) const
    Обращается к элементу с кодом n.
  • void set (ss a)
  • void set (ss a, ss b)
  • void set (ss a, ss b, ss c)
  • void set (ss a, ss b, ss c, ss d)
  • void set (ss a, ss b, ss c, ss d, ss e)
  • void set (ss a, ss b, ss c, ss d, ss e, ss f)
  • void set (ss a, ss b, ss c, ss d, ss e, ss f, ss g)
  • void set (ss a, ss b, ss c, ss d, ss e, ss f, ss g, ss h)
  • void set (ss a, ss b, ss c, ss d, ss e, ss f, ss g, ss h, ss i)
  • void set (ss a,ss b,ss c,ss d,ss e,ss f,ss g,ss h,ss i,ss j)
  • void set (ss a,ss b,ss c,ss d,ss e,ss f,ss g,ss h,ss i,ss j,ss k)
  • void set (ss a,ss b,ss c,ss d,ss e,ss f,ss g,ss h,ss i,ss j,ss k, ss l)

Методы friend

  • friend Query

3.5.28 class SQLString

Специальная строка, которая преобразуется из чего-либо.

Тип

instantiable

Суперклассы

public string

Включаемый файл

sql_string1.hh

Подробное описание

Класс, подклассифицируемый из строки, который имеет дополнительную способность преобразоваться из любого имеющего силу типа mysql.

Методы public

  • SQLString ()
  • SQLString (char i)
  • SQLString (const char *str)
  • SQLString (const char *str)
  • SQLString (double i)
  • SQLString (float i)
  • SQLString (int i)
  • SQLString (short int i)
  • SQLString (unsigned int i)
  • SQLString (unsigned int i)
  • SQLString (unsigned int i)
  • bool dont_escape
  • bool is_string
  • SQLString& operator = (const string& str)
  • SQLString& operator = (const string& str)
  • bool processed

3.5.29 template class Set class Container = set string

Специальный набор для хранения множеств в формате mysql.

Тип

instantiable

Суперклассы

public Container

Включаемый файл

set1.hh

Методы public

  • Set (const ColData &str)
  • Set (const ColData &str)
  • Set (const ColData &str)
  • ostream& out_stream (ostream &s) const
  • operator string ()

3.5.30 struct Time

Специальный тип для хранения времени в формате mysql.

Тип

instantiable

Суперклассы

public mysql_time, public MysqlDTbase Time

Включаемый файл

datetime1.hh

Подробное описание

Структура предназначена для хранения данных из типа Time. Она также используется при извлечении потока и в операторе insert.

Методы public

  • Time ()
  • Time (cchar* str)
  • Time (const string &str)
  • Time (const string &str)
  • short int compare (const Time& other) const

3.5.31 class const_string

Специальная строка, которая создана из существующей const char *.

Тип

instantiable

Включаемый файл

const_string1.hh

Подробное описание

Содержит маленькое подмножество стандартного класса string. Когда объект создан, будет создана только связь с const char *. Данные не будут скопированы. Таким образом, const char * должна существовать все время использования данного класса.

Методы public

  • const_iterator begin () const
  • const char* c_str () const
  • typedef const char* const_iterator
  • typedef const char* const_pointer
  • typedef const char& const_reference
  • const_string ()
  • const_string (const char *str)
  • const char* data () const
  • typedef int difference_type
  • const_iterator end () const
  • typedef const_iterator iterator
    Также как const_iterator потому, что данные не могут быть изменены.
  • size_type length () const
  • size_type max_size () const
  • const_reference operator (size_type pos) const
  • typedef const_pointer pointer
  • typedef const_reference reference
  • typedef unsigned int size_type
  • typedef const char value_type

3.5.32 template class const_subscript_container class OnType, class ValueType, class ReturnType = const ValueType&, class SizeType = unsigned int, class DiffType = int

Адаптер контейнера, чтобы сделать контейнер контейнером произвольного доступа (Random Access Container).

Тип

abstract

Включаемый файл

resiter1.hh

Подробное описание

Требования: контейнер имеет определенные функции-члены *operator[] (SizeType)* и *size()*.

Методы public

  • iterator begin () const
  • typedef iterator const_iterator
  • typedef value_type* const_pointer
  • typedef value_type& const_reference
  • typedef const ::reverse_iterator const_iterator const_reverse_iterator
  • typedef DiffType difference_type
  • bool empty () const
  • iterator end () const
  • typedef subscript_iterator const this_type, ReturnType, SizeType, DiffType iterator
  • size_type max_size () const
  • virtual ReturnType operator (SizeType i) const
  • typedef value_type* pointer
  • reverse_iterator rbegin () const
  • typedef value_type& reference
  • reverse_iterator rend () const
  • typedef const ::reverse_iterator iterator reverse_iterator
  • virtual size_type size () const
  • typedef SizeType size_type
  • typedef const_subscript_container OnType,ValueType,ReturnType,SizeType, DiffType this_type
  • typedef ValueType value_type

3.5.33 struct cstr_equal_to

Тип

instantiable

Суперклассы

bin_char_pred

Включаемый файл

compare1.hh

Методы public

  • bool operator () (const char *x, const char *y) const

3.5.34 struct cstr_greater

Тип

instantiable

Суперклассы

bin_char_pred

Включаемый файл

compare1.hh

Методы public

  • bool operator () (const char *x, const char *y) const

3.5.35 struct cstr_greater_equal

Тип

instantiable

Суперклассы

bin_char_pred

Включаемый файл

compare1.hh

Методы public

  • bool operator () (const char *x, const char *y) const

3.5.36 struct cstr_less

Тип

instantiable

Суперклассы

bin_char_pred

Включаемый файл

compare1.hh

Методы public

  • bool operator () (const char *x, const char *y) const

3.5.37 struct cstr_less_equal

Тип

instantiable

Суперклассы

bin_char_pred

Включаемый файл

compare1.hh

Методы public

  • bool operator () (const char *x, const char *y) const

3.5.38 struct cstr_not_equal_to

Тип

instantiable

Суперклассы

bin_char_pred

Включаемый файл

compare1.hh

Описание

Методы public

  • bool operator () (const char *x, const char *y) const

3.5.39 struct do_nothing_type1

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • do_nothing_type1 (ostream *o)
  • ostream * ostr

3.5.40 struct do_nothing_type2

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • do_nothing_type2 (SQLQueryParms *p)
  • SQLQueryParms * qparms

3.5.41 template struct equal_list_b class Seq1, class Seq2, class Manip

Тип

instantiable

Включаемый файл

vallist1.hh

Методы public

  • const char * delem
  • equal_list_b (const Seq1 &s1, const Seq2 &s2, const vector bool &f, const char *d, const char *e, Manip m)
  • const char * equl
  • const vector bool fields
  • const Seq1 * list1
  • const Seq2 * list2
  • Manip manip

3.5.42 template struct equal_list_ba class Seq1, class Seq2, class Manip

Тип

instantiable

Включаемый файл

vallist1.hh

Методы public

  • const char * delem
  • equal_list_ba (const Seq1 &s1, const Seq2 &s2, const char *d, const char *e, Manip m)
  • const char * equl
  • const Seq1 * list1
  • const Seq2 * list2
  • Manip manip

3.5.43 struct escape_type1

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • escape_type1 (ostream *o)
  • ostream * ostr

3.5.44 struct escape_type2

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • escape_type2 (SQLQueryParms *p)
  • SQLQueryParms * qparms

3.5.45 struct ignore_type2

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • ignore_type2 (SQLQueryParms *p)
  • SQLQueryParms * qparms

3.5.46 template class mysql_ColData class Str

Основной класс для автопреобразований данных столбца. Не используйте непосредственно.

Тип

instantiable

Суперклассы

public Str

Включаемый файл

coldata1.hh

Подробное описание

Интеллектуальная строка. Это автоматически преобразуется в любой из базисных типов C. Когда используется с двоичными операторами, она автоматически преобразуется в тип, используемый с другой стороны оператора, если это базисный тип. Однако, будьте внимательным при использовании этого с двоичными операторами, так как MysqlStr("12.86")+2 вернет 14, поскольку 2 является целым числом. Если это мешает, определите макрос NO_BINARY_OPERS для отмены такого поведения. Этот класс также имеет некоторую базисную информацию относительно типа данных, сохраненных в нем. Не используйте этот класс непосредственно. Используйте вместо этого typedef ColData или MutableColData.

Методы public

  • template class T, class B operator Null T, B () const
  • operator cchar* () const
  • operator unsigned char () const
  • operator unsigned char () const
  • template class Type Type conv (Type dummy) const
    Преобразует данные столбца в TYPE. Если все символы не читаются в течение преобразования в TYPE, породит исключение BadConversion. TYPE определен для всего, созданного в типах. Обратите внимание: это не фактический шаблон.
  • operator double () const
  • bool escape_q () const
    Возвращает true или false в зависимости от того, экранированы ли данные.
  • inline const string& get_string (void) const
  • operator unsigned long int () const
  • operator unsigned long int () const
  • operator unsigned long int () const
  • operator unsigned long int () const
  • operator unsigned long int () const
  • operator unsigned long int () const
  • inline const bool is_null (void) const
  • void it_is_null (void)
  • mysql_ColData ()
  • bool quote_q () const
    Возвращает true или false в зависимости от того, цитированы ли данные.
  • mysql_type_info type ()
    Возвращает текущий тип mysql для актуального элемента.
  • operator ulonglong () const

3.5.47 class mysql_convert

Тип

instantiable

Включаемый файл

convert1.hh

3.5.48 struct mysql_date

Тип

instantiable

Суперклассы

virtual public mysql_dt_base

Включаемый файл

datetime1.hh

Методы public

  • cchar* convert (cchar*)
  • tiny_int day
  • tiny_int month
  • ostream& out_stream (ostream&) const
  • short int year

Методы protected

  • short int compare (const mysql_date *other) const

3.5.49 struct mysql_dt_base

Тип

abstract

Включаемый файл

datetime1.hh

Методы public

  • virtual ostream& out_stream (ostream&) const
  • operator string ()

3.5.50 class mysql_ti_sql_type_info

Тип

instantiable

Включаемый файл

type_info1.hh

Методы friend

  • friend mysql_ti_sql_type_info_lookup
  • friend mysql_type_info

3.5.51 class mysql_ti_sql_type_info_lookup

Тип

instantiable

Включаемый файл

type_info1.hh

Методы friend

  • friend mysql_type_info

3.5.52 struct mysql_time

Тип

instantiable

Суперклассы

virtual public mysql_dt_base

Включаемый файл

datetime1.hh

Методы public

  • cchar* convert (cchar*)
  • tiny_int hour
  • tiny_int minute
  • ostream& out_stream (ostream&) const
  • tiny_int second

Методы protected

  • short int compare (const mysql_time *other) const

3.5.53 class mysql_type_info

Класс, который хранит базисную информацию типа для ColData.

Тип

instantiable

Включаемый файл

type_info1.hh

Описание

Методы public

  • unsigned int _length
  • unsigned int _max_length
  • inline const mysql_type_info base_type () const
    Возвращает type_info для внутреннего типа C++ внутри типа Null. Если тип не Null, работает аналогично c_type().
  • bool before (mysql_type_info &b)
    Обеспечивает упорядочение данных. Вы можете также использовать id() для той же самой цели.
  • inline const type_info& c_type () const
  • bool escape_q () const
    Возвращает true, если тип sql представляет собой тип, который должен быть экранирован.
  • int id () const
    Возвращает id для sql_type. Обратите внимание: не используйте этот идентификатор непосредственно, поскольку он может изменяться между версиями.
  • inline const unsigned int length () const
  • inline const unsigned int max_length () const
    Возвращает type_info для типа C++, связанного с типом sql.
  • mysql_type_info ()
  • mysql_type_info (const type_info &t)
  • mysql_type_info (const type_info &t)
  • inline mysql_type_info (const MYSQL_FIELD &f)
  • inline mysql_type_info (enum_field_types t, bool _unsigned, bool _null)
  • mysql_type_info (unsigned char n)
  • inline const char* name () const
    Возвращает значение, определяющее имя типа c++. Возвращает имя, которое было бы возвращено typeid().name() для типа C++, связанного с типом sql.
  • mysql_type_info& operator = (const type_info &t)
  • mysql_type_info& operator = (const type_info &t)
  • mysql_type_info& operator = (unsigned char n)
  • bool quote_q () const
    Вернет true, если этот тип sql должен быть цитирован.
  • inline const char* sql_name () const
    Возвращает имя для типа sql.
  • static const unsigned char string_type

3.5.54 class null_type

Тип

instantiable

Включаемый файл

null1.hh

Методы public

  • template class Type operator Type ()

3.5.55 struct quote_double_only_type1

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • ostream * ostr
  • quote_double_only_type1 (ostream *o)

3.5.56 struct quote_double_only_type2

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • SQLQueryParms * qparms
  • quote_double_only_type2 (SQLQueryParms *p)

3.5.57 struct quote_only_type1

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • ostream * ostr
  • quote_only_type1 (ostream *o)

3.5.58 struct quote_only_type2

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • SQLQueryParms * qparms
  • quote_only_type2 (SQLQueryParms *p)

3.5.59 struct quote_type1

Тип

instantiable

Включаемый файл

manip1.hh

Описание

Методы public

  • ostream * ostr
  • quote_type1 (ostream *o)

3.5.60 struct quote_type2

Тип

instantiable

Включаемый файл

manip1.hh

Методы public

  • SQLQueryParms * qparms
  • quote_type2 (SQLQueryParms *p)

3.5.61 template class simp_list_b class Iter

Тип

instantiable

Включаемый файл

vallist1.hh

Методы public

  • Iter _begin
  • Iter _end
  • Iter begin () const
  • typedef Iter const_iterator
  • Iter end () const
  • simp_list_b (Iter b, Iter e)

3.5.62 template class subscript_iterator class OnType, class ReturnType, class SizeType, class DiffТип

Тип

instantiable

Суперклассы

public random_access_iterator ReturnType, SizeType

Включаемый файл

resiter1.hh

Методы public

  • bool operator != (const subscript_iterator &j) const
  • ReturnType operator * () const
  • subscript_iterator operator + (SizeType n) const
  • subscript_iterator& operator ++ ()
  • subscript_iterator operator ++ (int)
  • subscript_iterator& operator += (SizeType n)
  • subscript_iterator operator - (SizeType n) const
  • DiffType operator - (const subscript_iterator &j) const
  • subscript_iterator& operator - ()
  • subscript_iterator operator - (int)
  • subscript_iterator& operator -= (SizeType n)
  • ReturnType operator - () const
  • bool operator (const subscript_iterator &j) const
  • bool operator = (const subscript_iterator &j) const
  • bool operator == (const subscript_iterator &j) const
  • bool operator (const subscript_iterator &j) const
  • bool operator = (const subscript_iterator &j) const
  • ReturnType operator (SizeType n) const
  • subscript_iterator ()
  • subscript_iterator (OnType *what, SizeType pos)

3.5.63 struct type_info_cmp

Тип

instantiable

Включаемый файл

type_info1.hh

Методы public

  • bool operator() (const type_info *lhs, const type_info *rhs) const

3.5.64 template struct value_list_b class Seq, class Manip

Тип

instantiable

Включаемый файл

vallist1.hh

Методы public

  • const char * delem
  • const vector bool fields
  • const Seq * list
  • Manip manip
  • value_list_b (const Seq &s, const vector bool &f, const char *d, Manip m)

3.5.65 template struct value_list_ba class Seq, class Manip

Тип

instantiable

Включаемый файл

vallist1.hh

Методы public

  • const char * delem
  • const Seq * list
  • Manip manip
  • value_list_ba (const Seq &s, const char* d, Manip m)

3.5.66 Манипуляторы

Следующие манипуляторы изменяют только следующий элемент направо от них в цепочке <<. Они могут использоваться с любым ostream (который включает SQLQuery и Query, поскольку они также ostream) или с SQLQueryParms. Когда используются с SQLQueryParms, они отменят любой набор параметров настройки шаблона запросов для этого элемента.

quote
Цитирует и экранирует следующий элемент. Может использоваться с ostream или с SQLQueryParms.
quote_only
Цитирует, но не экранирует следующий элемент. Может использоваться с ostream или с SQLQueryParms.
quote_only_double
Цитирует, но не экранирует следующий элемент. Использует `` вместо '.
escape
Экранирует следующий элемент.
do_nothing
Не делает ничего. Используется как фиктивный манипулятор, когда надо применить некоторый манипулятор. Когда используется с SQLQueryParms, всегда удостоверится, что это не перекрывает параметры шаблона запросов.
ignore
Используется только с SQLQueryParms. Подобен do_nothing, но не будет отменять набор форматирований шаблона запросов.
Начиная с версии 1.6, автоматическое цитирование и экранирование были добавлены в манипуляторы. Этот механизм применяется только к mysql_ColData. Автоматическое цитирование или экранирование используется только с оператором <<, и во всех классах, полученных потоками, объектах, включая strstream, а также в объектах запросов. Исключение составляют потоки cout, cerr и clog. Это было разработано именно так преднамеренно, поскольку внешние (для этих потоков) переменные не требует цитирования или экранирования. Но это свойство удобно при создании объекта запроса или объекта класса strstream.

Это свойство можно выключить, установив в Вашем коде переменную dont_quote_auto в значение true.

3.6. Шаблоны запросов

Идея шаблонов сводится к тому, чтобы оснастить запрос такими параметрами для вызова, которые могут быть изменены между обращениями без необходимости преобразовывать сам запрос.

3.6.1 Установка

Чтобы установить шаблон запроса, просто создайте обычным порядком нормальный запрос, например:

query << "select (%2:field1, %3:field2)
      from stock where %1: wheref = %q0:what"
А затем выполните метод Query::parse(). Например:
query.parse()

3.6.2 Формат шаблонов

Шаблон выглядит примерно так:

select (%2:field1, %3:field2) from stock where %1:wheref = %q0:what

Числа представляют номер элемента в структуре SQLQueryParms (рассмотрена чуть ниже).

Формат параметров подстановки:

%(modifier)##(:name)(:)

Здесь Modifier может быть любым из следующего перечня:

%
Вывести знак "%".
""
"" Не делает ничего.
q
Это цитирует и экранирует строку, применяя для этого mysql_escape_string, если это строка, char *, или другие специфические для Mysql типы, которые должны всегда цитироваться.
Q
Цитирует, но не экранирует строку, исходя из тех же правил. Это может сэкономить немного времени, если Вы знаете, что строки никогда не будут нуждаться в экранировке спецсимволов.
r
Обязательно цитирует и экранирует, даже если это число.
R
Обязательно цитирует, но не экранирует, даже если это число.
## Представляет число длиной в две цифры.

``:name'' представляет собой факультативное имя, которое помогает в заполнении SQLQueryParms. Имя может содержать любые алфавитно-цифровые символы или символ подчеркивания. Если Вы используете имя, и должны ввести двоеточие, введите их два последовательно. Первый символ закончит имя, так что второй не будет обработан.

3.6.3 Задание параметров

Параметры могут заданы когда запрос выполнен, или раньше срока, используя заданные по умолчанию параметры.

3.6.3.1 При выполнении запроса

Чтобы определять параметры, когда Вы хотите выполнять запрос, просто используйте Query::store(const SQLString &parm0, [..., const SQLString &parm11]) (или выражение Query::use или Query::execute). Здесь определение parm0 соответствует параметру 0 и так далее. Отсчет идет с нуля, так что первый параметр на самом деле нулевой. Вы можете определять от 1 до 12 различных параметров. Например:

Result res = query.store("Dinner Roles", "item",
                         "item", "price")
Для описанного в разделе 3.6.2 шаблона запроса это выведет:
select (item, price) from stock where item = " Dinner Roles"
Причина того, почему я не сделал шаблон более логическим:
select (%0:field1, %1:field2) from stock where %2: wheref = %q3:what
Станет очевидным быстрее.

3.6.3.2 Использование значений по умолчанию

Вы можете также устанавливать параметры по одному посредством общего члена данных def. Чтобы сменить значения def, просто используйте подстановочные оператора. Вы можете обратиться к параметрам по номерам или по их именем. Например:

query.def[0] = "Dinner Roles";
query.def[1] = "item";
query.def[2] = "item";
query.def[3] = "price";
Как и другой вариант:
query.def["what"] = "Dinner Roles";
query.def["wheref"] = "item";
query.def["field1"] = "item";
query.def["field2"] = "price";
Имеют тот же самый эффект.

Как только все параметры установлены, просто выполните запрос так, как выполнили бы запрос без всяких шаблонов. Например так:

Result res = query.store()

3.6.3.3 Комбинирование

Вы можете также объединять использование установки параметров во время выполнения и использование объекта def, просто применяя расширенную форму Query::store (можно также use или execute) без необходимых определенных параметров. Например:

query.def["field1"] = "item";
query.def["field2"] = "price";
Result res1 = query.store("Hamburger Buns", "item");
Result res2 = query.store(1.25, "price");
Сохранит такой запрос:
select (item, price) from stock where item = "Hamburger Buns"
для res1 и
select (item, price) from stock where price = 1.25
для res2.

Поскольку расширенная форма Query::store может работать только с начала списка (по номерам, но не по расположению параметров), более логично было бы сделать так:

select (%0:field1, %1:field2) from stock where %2: wheref = %q3:what
Но такой подход в этом случае не сработает. Более сложный вариант
select (%2:field1, %3:field2) from stock where %1: wheref = %q0:what
все же был необходим, чтобы Вы могли определять wheref и what.

Следует, однако, помнить, что Query::store(const char* q) также определена для выполнения запроса q. По этой причине, когда Вы используете Query::store (use или execute), только с одним элементом, и этот элемент const char*, Вы должны явно преобразовать это в SQLString. Например:

Result res = query.store(SQLString("Hamburger Buns")).

3.6.3.4 Обработка ошибок

Если по некоторым причинам Вы не определяли все параметры при выполнении запроса, и неопределенные параметры не имеют значений по умолчанию, заданных через объект def, объект запроса породит объект исключения SQLQueryNEParms. Вы можете выяснить, что же случилось, проверяя значение SQLQueryNEParms::string. Например:

query.def["field1"] = "item";
query.def["field2"] = "price";
Result res = query.store(1.25);
породит исключение SQLQueryNEParms по причине того, что wheref не был опеределен нигде.

В теории эта исключительная ситуация никогда не должна быть вызвана. Если она все же возникла, это, вероятно, логическая ошибка на Вашей стороне (например, как в вышеупомянутом примере).

3.7. Специализированные структуры SQL

Специализированные структуры SQL (Specialized SQL Structures, SSQLS) позволяют Вам создавать свои структуры для хранения данных для запросов mysql с дополнительными функциональными возможностями. Эти структуры никоим образом не связаны с контейнерами и типами из Standard Template Library (STL). Это именно структуры (structs). Каждый элемент члена сохранен под уникальным именем внутри структуры. Вы никоим образом не можете использовать STL-алгоритмы или что-то еще из STL, чтобы работать с индивидуальными структурами. Однако Вы можете использовать эти структуры как value_type для контейнеров STL.

3.7.1 sql_create_basic

Следующая команда создаст базисный запрос mysql для использования с типовой базой данных.

sql_create_basic_5(stock, 0, 0, string, item, int, num, double, weight,
                   double, price, MysqlDate, date)
Это установит следующую структуру:
struct stock
{
  stock () {}
  stock (const MysqlRow &row);
  set (const MysqlRow &row);
  string item;
  int num;
  double weight;
  double price;
  MysqlDate date;
};
Как Вы можете видеть, ничего фантастического в этих структурах нет. Основное преимущество этой простой структуры: конструктор stock (MysqlRow &row), который позволяет Вам легко заполнять вектор stock таким образом:
vector<stock> result;
query.storein(result);
Требования заключаются в том, что запрос возвращает элементы в том же самом порядке, в каком Вы определили их в заказной структуре.

Общий формат структур:

sql_create_basic_#(NAME, 0, 0, TYPE1, ITEM1, ... TYPE#, ITEM#)
Здесь # является числом переменных в векторе, NAME задает имя структуры, которую Вы желаете создать, TYPE1 определяет имя типа для первого элемента, а ITEM1 представляет собой имя переменной для первого элемента и т.д.

3.7.2 sql_create_basic со сравнением

Вы можете также сделать структуру сравнимой, заменяя первый 0 в предыдущем примере на ненулевое значение. Это число сообщает, что если первые n чисел одинаковые, то и две структуры совпадают:

sql_create_basic_5(stock, 1, 0, string, item, int, num, double, weight,
                   double, price, MysqlDate, date)
Создаст структуру, где только первый элемент будет проверен, чтобы увидеть являются ли две различных структуры действительно различными. Это также позволяет Вам сравнивать одну структуру с другой основываясь на значении элемента. Если n больше одного, это сравнит структуры в лексикографическом порядке. Например, если n=2, это сначала сравнило бы элемент item, и если он был тот же самый, затем будет сравниваться num. Если num был тот же самый, это объявит две структуры идентичными.
struct stock
(
  ...
  stock (const string &p1);
  set (const string &p1);
  bool operator == (const stock &other) const;
  bool operator != (const stock &other) const;
  bool operator > (const stock &other) const;
  bool operator < (const stock &other) const;
  bool operator >= (const stock &other) const;
  bool operator <= (const stock &other) const;
  int cmp (const stock &other) const;
  int compare (const stock &other) const;
}
int compare (const stock &x, const stock &y);
int compare (const stock &x, const stock &y) сравнивает x с y и возвращает значение <0, если x < y, 0 если x=y и значение >0, если x > y. stock::cmp и stock::compare действуют аналогично compare(*this, other).

stock::stock представляет собой конструктор, который установит элемент в p1 и оставит все другие переменные неопределенными. Это полезно для создания временных объектов, чтобы использовать для сравнений подобных такому:

x <= stock("Hotdog")

Поскольку stock объявлена как less-then-comparable, Вы можете сохранять результаты запроса в наборе:

set<stock> result;
query.storein(result);
Вы можете теперь использовать это подобно любому другому набору, например:
cout << result.lower_bound(stock("Hamburger"))->item
     << endl;
вернет первый элемент набора, который начинается с Hamburger.

Вы можете также теперь использовать любой STL-алгоритм который требует, чтобы все значения были less-then-comparable.

Общий формат таков:

sql_create_base_#(NAME, CMP, 0, TYPE1, ITEM1, ... TYPE#, ITEM#)
Здесь CMP сообщает, что если первые cmp переменных являются теми же самыми, то две структуры одинаковы.

3.7.3 sql_create_basic с расширенным конструктором

Последний ноль в последнем примере предназначен для создания другого конструктора. Замените этот ноль на m, и это создаст конструктор, который заполнит первые n переменных. Например:

sql_create_basic_5(stock, 1, 5, string, item, int, num, double,
                   weight, double, price, MysqlDate, date)
Также определит следующее:
struct stock
{
  ...
  stock(const string&, const int&, const double&,
        const double&, const MysqlDate&);
  set(const string&, const int&, const double&,
      const double&, const MysqlDate&);
}

3.7.4 Основной формат sql_create_basic

Основной формат для sql_create_basic следующий:

sql_create_basic_#(NAME, CMP, CNST, TYPE1, ITEM1, ..., TYPE#, ITEM#)

  • # задает числом переменных в векторе.
  • NAME определяет имя структуры, которую Вы желаете создать
  • CMP указывает, что если он не равен 0, и первые cmp переменных совпадут, то структуры одинаковы.
  • CNST указывает, что если он не равен 0, создается конструктор, который заполнит первые n переменных.
  • TYPE1 определяет имя типа для первого элемента, ITEM1 указывает переменную для первого элемента и т.д.

3.7.5 sql_create_basic_c_order

Вы можете также определять альтернативный порядок, когда mysql заполняет структуру. Например:

sql_create_basic_c_order_5(stock, 2, 5, MysqlDate, date, 5,
                           double, price, 4, string, item, 1,
                           int, num, 2, double, weight, 3)
Это создаст структуру, схожую созданной в предыдущем примере за исключением того, что порядок элементов данных будет иным. С++ использует первые два элемента, чтобы сравнить с группой (date, price). Однако, так как определен заказной порядок, Вы можете использовать тот же самый запрос, чтобы заполнить набор. Это заполнит date 5-ым элементом набора результатов запроса, price соответственно 4-м и так далее.

3.7.6 Основной формат sql_create_basic_c_order

Таким образом, общий формат для sql_create_basic такой:

sql_create_basic_c_order_#(NAME, CMP, CNST, TYPE1, ITEM1,
                           ORDER1, ... TYPE#, ITEM#, ORDER#)
    # задает числом переменных в векторе.
  • NAME определяет имя структуры, которую Вы желаете создать
  • CMP указывает, что если он не равен 0, и первые cmp переменных совпадут, то структуры одинаковы.
  • CNST указывает, что если он не равен 0, создается конструктор, который заполнит первые n переменных.
  • TYPE1 задает имя типа для первого элемента, ITEM1 имя переменной для него, ORDER1 указывает порядок для первого элемента и т.д.

3.7.7 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);
Произведет тот же самый запрос, что и в вышеупомянутом примере.

3.7.8 sql_create_c_names

Вы можете также определять альтернативные имена поля так:

sql_create_c_names_5(stock, 1, 5, string, item, "item",
                     int, num, "quantity", double, weight,
                     "weight", double, price, "price"
                     MysqlDate, date, "shipment")
Когда field_list или equal_list применены, это использует данные имена поля вместо имен переменных. Например:
stock s("Dinner Roles",75,0.95,0.97,"1998-05-25");
cout << "Field List: " << s.field_list() << endl;
cout << "Equal List: " << s.equal_list() << endl;
вернет нечто вроде:
Field List: item,quantity,weight,price,shipment
Equal List: item = 'Dinner Roles',quantity = 75,weight = 0.95,
            price = 0.97,shipment = '1998-05-25'

3.7.9 Основной формат sql_create_c_names

Основной формат таков:

sql_create_c_names_#(NAME, CMP, CNST, TYPE1, ITEM1, NAME1, ...
                     TYPE#, ITEM#, NAME#) 
Здесь NAME1 представляет собой имя первого поля. Все остальное так же, как и в формате sql_create_basic_c_order.

3.7.10 sql_create_c_order

Как в sql_create_basic_c_order Вы можете определять заказной порядок. Основная форма такая:

sql_create_c_order_#(NAME, CMP, CNST, TYPE1, ITEM1, ORDER1, ...
                     TYPE#, ITEM#, ORDER#)
Здесь все так же, как и в основном формате sql_create_basic_c_order.

3.7.11 sql_create_complete

Вы можете также определять заказной порядок и заказные имена поля вместе. Основная форма такая:

sql_create_complete_#(NAME, CMP, CNST, TYPE1, ITEM1, NAME1, ORDER1, ...
                      TYPE#, ITEM#, NAME#, ORDER#)
Здесь все так же, как и в основном формате sql_create_c_order и sql_create_c_names.

3.7.12 Изменение имени таблицы

Вы не можете определять различные имена таблицы в фактическом макрообращении. Имя таблицы используется в SQLQuery::insert, replace и update. Однако Вы можете изменять заданное по умолчанию имя таблицы, которое является тем же самым, что и имя структуры, заменяя ссылку NAME::table() на другую const char *:

stock::table() = "in_stock"
Это заменит имя таблицы на "in_stock" в примерах, используемых во всем этом руководстве.

3.7.13 Наблюдение фактического кода

Увидеть фактический код, который используют макро вставки sql++pretty, довольно просто. Например так:

sql++pretty < test.cc | less

3.7.14 Добавление функциональных возможностей

Самый лучший способ добавлять функциональные возможности: через наследование. Даже при том, что Вы могли бы вставлять выводимый код из pretty.pl и изменять его, это не рекомендуется делать потому, что это не будет отражать будущие расширения.

3.7.15 Дополнительные замечания

Макрокоманды определены для структур длиной до 25 элементов. Если Вы должны использовать больше, надо изменить основной скрипт perl (custom.pl). Этот скрипт на perl используется, чтобы генерировать файл заголовка. Он никоим образом не пробует анализировать код на C++.

Файл заголовка, который строит скрипт custom.pl занимает около мегабайта. Однако, пожалуйста обратите внимание, что заголовочный файл (custom-macros.hh) включает ТОЛЬКО макрокоманды. Так что компилятор должен делать очень малый объем работ при чтении файла.

Также, все включенное макрообращением выполнено таким способом, что Вы можете безопасно включать макрокоманду в файл заголовка и не должны волноваться относительно двойных обращений к функции или чего-то подобного.

3.8. Длинные имена

По умолчанию Mysql++ API использует как короткие имена без префиксов Mysql или mysql_, так и их длинные версии уже с префиксами Mysql или mysql_. Если это вызывает проблемы, определите макрос MYSQL_NO_SHORT_NAMES перед включением mysql++. После этого в принудительном порядке будут использоваться исключительно длинные имена. Их соответствие коротким такое:
Короткое имя Длинное имя
BadQueryMysqlBadQuery
ConnectionMysqlConnection
ResNSelResNSel
ResUseResUse MysqlResUse
ResultMysqlRes
FieldMysqlField
FieldsMysqlFields
ResIterMysqlResIter
ResultIterMysqlResIter
RowMysqlRow
MutableRowMysqlMutableRow
FieldNamesMysqlFieldNames
QueryMysqlQuery
BadConversionMysqlBadConversion
ColDataMysqlColData
MutableColData MysqlMutableColData
quotemysql_quote
quote_onlymysql_quote_only
quote_double_only mysql_quote_double_only
escapemysql_escape
do_nothingmysql_do_nothing
ignoremysql_ignore
DateMysqDate
TimeMysqlTime
DateTimeMysqlDateTime
SetMysqlSet
NullMysqlNull
null_typemysql_null_type
nullmysql_null
NullisNullMysqlNullisNull
NullisZeroMysqlNullisZero
NullisBlankMysqlNullisBlank

Поиск

 

Найди своих коллег!