В этом сценарии база данных MySQL служит хранилищем данных о личных расходах по различным, заранее предопределенным категориям. Пользователь имеет возможность вводить расходы по этим категориям, пользуясь простым интерфейсом. Этот вывод потом преобразуется в SQL-запросы и сохраняется в базе данных MySQL, откуда они и могут быть выбраны и проанализированы для вывода отчета.
При создании приложения подобного образа сначала необходимо спроектировать таблицы, в которых будет храниться вся необходимая информация.
Листинг 19.28.
CREATE TABLE categories
(cid int(8) NOT NULL default '0', cname varchar(255) NOT NULL default', PRIMARY KEY (cid)
)
CREATE TABLE data (
eid int(8) NOT NULL auto_increment, cid int(8) NOT NULL default '0', date date NOT NULL default '0000-00-00', amt float(11,2) NOT NULL default '0.00', PRIMARY KEY (eid)
)
Для создания этого приложения воспользуемся простой архитектурой. В таблице categories будем хранить список категорий, каждой из них будет присвоен соответствующий номер, а в таблице data будут храниться данные о расходах, введенные пользователем. Каждая запись о расходах в таблице data также идентифицируется уникальным идентификатором записи и имеет три атрибута: дату расхода, сумму расхода и категорию, к которой этот расход можно причислить (это внешний ключ на идентификатор категории, который задан в таблице categories).
Добавим еще несколько категорий в таблицы categories и "зальем" начальную ин­формацию в таблицу data.
Листинг 19.29.
INSERT INTO categories (cid, cname) VALUES (1, 'Развлечения');
INSERT INTO categories(cid, cname) VALUES (2, 'Путешествия');
INSERT INTO categories(cid, cname) VALUES (3, 'Подарки');
INSERT INTO categories (cid, cname) VALUES (4, 'Ремонты');
INSERT INTO data (cid, cid, date, amt) VALUES (1, 1, '2003-04-05',568.99);
INSERT INTO data (cid, cid, date, amt) VALUES (2, 4, '2003-11-19',100.00);
INSERT INTO data (cid, cid, date, amt) VALUES (3, 1, '2003-06-12',250.00);
INSERT INTO data (cid, cid, date, amt) VALUES (4, 2, '2003-08-16',50.00);
Итак, данные получены. Как видите, создание программы и использованием C API-интерфейса MySQL - довольно простая задача. Получившаяся программа выглядит следующим образом.
Листинг 19.30.
#include <stdio.h> #include <mysql.h> int main ()
{
/* объявить переменные */
Учет расходов
Учет расходов
Учет расходов
Учет расходов
В отличие от предыдущего клиента, этот клиент не принимает параметры соединения с базой данных из командной строки. Для этих целей он берет данные из конфигурационного файла expenses.conf, расположенного в том же каталоге и считывает из него аргументы для функции mysql_real_connect() . Этот конфигурационный файл предельно прост: он содержит одну строку в формате host:user:pass:db. Первые несколько строк исходного текста в предыдущей распечатке имеют отношение непосредственно к анализу этого файла.
После прочтения конфигурационного файла, делается попытка соединения с базой данных MySQL, и при успешном завершении отображается меню для выбора возможных действий. Если пользователь выбирает вариант № 1, запускается оператор SELECT с объединением таблиц categories и data по полю cid, где с помощью функции SUM() и предложения GROUP BY, будут получены суммы по каждой категории. При выборе действия № 2, программа запрашивает дату, количество и идентификатор категории и использует эти данные для создания и выполнения запроса INSERT с целью сохранения этой записи в базе данных MySQL. Ввод любого другого значения приводит к закрытию программой соединения с базой данных MySQL и к завершению работы.
Ниже представлено несколько примеров работы этого приложения. 
Листинг 19.31.
[user@host]$ ./expenses.bin [1] Просмотр суммарных расходов [2] Ввести расходы [3] Выход
Выбрать значение из списка: 1 Развлечения = 1518.99 Подарки = 250.00 Ремонт = 200.00 Путешествия = 150.00
[user@host]$ ./expenses.bin
[1] Просмотр суммарных расходов
[2] Ввести расходы
[3] Выход
Выбрать значение из списка: 2 Ввести дату (yyyy-mm-dd): 2003-12-15 Ввести значение: 2450.50
Вести номер категории (1=Развлечения 2=Путешествия 3=Подарки 4= Ремонт ): 2
[user@host]$ ./expenses.bin [1] Просмотр суммарных расходов [2] Ввести расходы [3] Выход
Выбрать значение из списка: 1 Развлечения = 1518.99 Подарки = 250.00 Ремонт = 200.00 Путешествия = 2600.50

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