Практичне використання MySQL Частина 2

Серія контенту:
Цей контент є частиною # із серії # статей: Практичне використання MySQL++
Цей контент є частиною серії: Практичне використання MySQL
Слідкуйте за виходом нових статей цієї серії.
Перед тим, як перейти до безпосереднього практичного застосування бібліотеки MySQL++, ми розглянемо питання її конфігурування та налаштування, а також деякі проблеми, які можуть виникати в процесі підготовки бібліотеки до роботи.
1. Налаштування MySQL++
Конфігурація MySQL++, запропонована за умовчанням, виявляється цілком придатною вирішення більшості завдань. Проте, в деяких випадках потрібна зміна параметрів конфігурації, щоб виконати деякі специфічні умови.
1.1. Визначення розташування файлів бібліотек MySQL
Як було зазначено раніше, бібліотека MySQL++ побудована з урахуванням прикладного програмного інтерфейсу MySQL C API, тобто. всім операцій взаємодії з сервером баз даних використовуються функції бібліотек нижчого рівня. Отже, якщо заголовні файли та файли бібліотек C API-інтерфейсу розташовані в "нестандартних" місцях і не можуть бути виявлені в процесі збирання програми, в якій застосована бібліотека MySQL ++, завершити збирання не вдасться.
На платформах, що використовують Autoconf (практично всі unix-подібні системи, в яких є командна оболонка), скрипт configure може самостійно визначити місцезнаходження необхідних файлів C API-інтерфейсу методом простого послідовного перебору стандартних і явно вказаних каталогів установки доти, доки не знайде те що потрібно. Якщо у вашій системі сервер MySQLвстановлений в нестандартній локації, то потрібно внести зміни в скрипт configure, щоб вказати йому, де шукати необхідні файли. Це робиться за допомогою комбінації прапорів --with-mysql, --with-mysql-include та --with-mysql-lib.
1.2. Максимальна кількість стовпців таблиці, що обробляються.
У бібліотеці MySQL++ пропонуються два способи автоматичного компонування SQL-запитів під час виконання: шаблони запитів (Template Queries) та спеціалізовані структури SSQLS (Specialized SQL Structures). Але тут слід зазначити, що існує обмеження на кількість параметрів у шаблоні запиту та кількість полів у SSQLS-структурі. І в першому, і в другому випадку за замовчуванням встановлено максимальне значення 25. Автори бібліотеки пояснюють, що таке значення було встановлено експериментально, за допомогою тестування на різних платформах та із застосуванням різних компіляторів. Крім того, не в останню чергу в розрахунок було прийнято "вимогу правильного проектування таблиць баз даних".
Якщо все-таки трапилося так, що в таблиці міститься більше 25 стовпців або в шаблоні запиту потрібно вказати більше 25 параметрів, і при цьому ви впевнені в коректності структур таблиць бази даних, то є можливість збільшити відповідні граничні значення. Для цього потрібно перегенерувати заголовки lib/ssqls.h і lib/querydef.h за допомогою Perl-скриптів з іменами відповідно ssqls.pl і querydef.pl. Інструкції щодо проведення цих операцій наводяться в заголовній частині кожного скрипта. Зрозуміло, потрібна наявність у системі встановленого інтерпретатора Perl.
Після внесення всіх змін виконується команда make, що дозволяє перезабрати всю бібліотеку.
1.3. "Сховані" файли-заголовки MySQL C API-інтерфейсу
Зазвичай у unix-подібних системах файли-заголовки MySQL C API-інтерфейсу розміщуються у підкаталозі mysql, розташованому стандартному каталозі /usr/include, тобто. до певної міри "приховані" ("buried") на нижчому рівні щодо основного каталогу заголовків. Раніше вже зазначалося, що файли-заголовки MySQL залежать від файлів-заголовків MySQL C API-інтерфейсу, тому MySQL++-додатку необхідно повідомити про "факт приховування".
Коли додаток включає один із файлів-заголовків MySQL C API, це робиться звичайним способом:
Але якщо ви визначаєте макро MYSQLPP_MYSQL_HEADERS_BURIED, то директива включення буде виглядати так:
2. Вирішення проблем налаштування бібліотеки
У процесі використання MySQL++ можуть виникати й інші проблеми, пов'язані з параметрами налаштування та іншими характеристиками бібліотеки.
2.1. Якщо компілятор не відповідає C99,
MySQL++ використовує відповідний розширеному стандарту C99 заголовний файл stdint.h. Але деякі компілятори C ++ не забезпечують підтримку цього заголовка. У таких випадках спроби компіляції проекту призводитимуть до помилок. Для усунення помилок такого роду необхідно визначити макро MYSQLPP_NO_STDINT_H, що дозволить MySQL++ вибрати найбільш підходящі цілі численні типи (integer) замість тих, які повинні були визначатися в заголовному файлі stdint.h.
Крім того, MySQL++ використовується тип даних long long, що визначається стандартом C99, у всіх випадках, коли застосування цього типу є доречним і виправданим. Але на деяких платформах і деяких компіляторів цей тип даних недоступний. В результаті – знову помилка компіляції "невідомий тип даних". Ситуацію можна виправити визначенням макро MYSQLPP_NO_LONG_LONG, татоді MySQL++ повернеться до використання переносних типів даних.
2.2. Підтримка кодувань Unicode
У всіх Linux- і unix-системах, які підтримують Unicode-кодування UTF-8 як основне в системі, жодних проблем з консольним введенням/виводом не виникає. Якщо в системі UTF-8 не підтримується взагалі, то доведеться виконати перетворення Unicode-даних у локальне 8-бітове кодування. Тут вам допоможе функція стандартної бібліотеки iconv().
Ще одним інструментальним засобом, здатним вирішити цю проблему, є ICU IBM. ICU - це широко використовується набір бібліотек для C/C++, що забезпечує повну підтримку Unicode та відповідної локалізації (інтернаціоналізації) додатків. Однією з основних функцій ICU є Code Page Conversion, що забезпечує перетворення текстових даних між Unicode та практично будь-яким іншим кодуванням. Таблиці перетворень ICU засновані на наборах символів, з якими компанія IBM працювала протягом багатьох років, і тому є найповнішими зборами доступних кодувань. ICU є програмним продуктом Open Source і може вільно застосовуватися як у комерційних проектах, так і інших Open Source розробках.
3. Підготовка проекту серед Linux
Після узагальненого опису проблем налаштування та способів їх усунення настав час розібратися в тому, що потрібно зробити для того, щоб використовувати бібліотеку MySQL++ у своїх проектах.
По-перше, у всі модулі, які звертаються до бібліотеки MySQL++, необхідно вписати директиву
Крім того, якщо в модулі застосовуються спеціалізовані структури SSQLS, то потрібна ще одна директива:
У unix-системах компіляцію та складання програм можна виконувати різноманітними способами. Тут ми розглянемо"Класичну" методику з використанням make-файлу. Як приклад взятий гранично простий вихідний код; на даному етапі важливо зрозуміти принцип взаємодії з MySQL і процедуру складання програми, а не захоплюватися трюками і вишукуваннями.
Ось як буде виглядати всесвітньо відомий тест Hello, world при використанні бібліотеки MySQL++:
Припустимо, що наведений вище вихідний код зберігається у файлі з ім'ям hello.cpp. Тоді Make-файл для компіляції та створення виконуваної програми може бути таким:
До третього рядка необхідно надати невелике пояснення. Для компонування MySQL++-програм потрібно файл бібліотеки mysqlpp, і файл бібліотеки mysqlclient. Причину цього ми вже з'ясували на початку статті. У деяких системах важливий порядок присвоєння змінної LDFLAGS: у цьому випадку лінкер починає зчитування праворуч наліво, тому крайня справа бібліотека в рядку повинна бути найзагальнішою (найнезалежнішою). У нашому випадку бібліотека MySQL++ залежить від бібліотеки SQL C API, тому C-бібліотека записана останньою в рядку.
Можливо, у рядку присвоєння LDFLAGS потрібно буде додати інші бібліотеки. Це залежить від конкретної системи, що використовується.
Наведений приклад make-файлу може здатися надто лаконічним: не вказані явно джерела, залежності і правила створення файлу, що виконується. Справа в тому, що в подібних ситуаціях повинні коректно відпрацьовувати стандартні правила, визначені за умовчанням, особливо якщо ви використовуєте GNU make.
4. Висновок
Як ви самі могли переконатися, прочитавши цю статтю, встановлення, налаштування та практичне використання бібліотеки MySQL++ не пов'язані з серйозними труднощами. Описані в статті проблеми зустрічаються не так часто, та й усуваються достатньопросто. А після встановлення "штатного" пакета з репозиторію відповідного дистрибутива Linux бібліотека одразу готова до роботи. Принаймні це твердження перевірено на практиці для Fedora та Debian/Ubuntu.
У цій статті розглядалися налаштування та адаптація бібліотеки MySQL++ у різних проектах. У наступній статті буде докладно описано виконання SQL-запитів та їх результатів. Тема четвертої статті – обробка помилок та використання транзакцій. У п'ятій статті ми розглянемо різні типи даних та роботу з ними. Спеціалізованим формам запитів приділяється особлива увага у шостій статті. У заключній, сьомій статті циклу буде продемонстровано практичне застосування бібліотеки MySQL у багатопотокових додатках.