После ознакомления с основами C API-интерфейса MySQL, воспользуемся полученными знаниями. В этом разделе продемонстрировано использование API-интерфейса MySQL для решения реальных задач, для этого создадим на ЯП C две программы: интерактивный SQL-клиент, аналогичный тому, который поставляется в дистрибутиве MySQL, и программу учета расходов, использующую MySQL в качестве среды хранения данных об индивидуальных расходах.
Интерактивный SQL-клиент
Вы уже наверняка знакомы с клиентом mysql, который работает с командной строкой и поставляется в дистрибутиве MySQL. (Он упоминался практически в каждой главе этой книги при демонстрации различных аспектов работы этой реляционной СУБД). В принципе это довольно простая программа. Она подключается к серверу MySQL, (при этом параметры соединения задаются аргументами командной строки), ожидает ввода команд от пользователя и отправляет введенные данные на сервер для их обработки. Если введенные данные не содержат ошибок, сервер обрабатывает их и возвращает клиенту результирующий набор (для запросов типа "SELECT") или значение, обозначающее успешное или неуспешное завершение операции (для запросов типа "не SELECT"). Потом клиент обрабатывает данные соответствующим образом: отображается диагностическое сообщение, обрабатывается и форматируется результирующий набор (если таковой имеется), или данные используются каким-либо другим образом.
Понятно, что решить эти задачи можно с помощью функций, имеющихся в составе API-интерфейса MySQL. Так как API-интерфейс выполняет большую часть этой работы, создать клиент командной строки, повторяющий ту же функциональность, что и стандартный клиент mysql , не представляет большого труда.
Ниже представлен исходный текст.
Практическое применение C API-интерфейса MySQL
Практическое применение C API-интерфейса MySQL
Если вы уже более-менее знакомы с программированием на C, эта задача не должна вызывать у вас никаких затруднений. Сначала программа просматривает информацию о том, к какому узлу и базе данных необходимо подключиться, а также какой пользователь и пароль должны быть для этого использованы. Эта информация передается пользователем через командную строку при вызове программы. Элементарная проверка ошибок подскажет пользователю правильный синтаксис в случае отсутствия аргумента.
Далее, функция mysql_real_connect() берет на себя "заботы" по подключению к базе данных. Предположим, что соединение выполнено. В цикле выводится подсказка, и программа ожидает ввода пользователя в виде команды SQL (это интерактивная часть программы). Ввод, произведенный пользователем, отправляется на SQL-сервер для обработки. Для этого используется функция mysql_query() (когда пользователь вводит слово "exit", программа выходит из цикла, закрывает соединение и завершает свою работу).
В зависимости от того, возвращает ли запрос результирующий набор, она выводит список полей и записей, созданный с использованием функций mysql_fetch_field() и mysql_fetch_row() , или распечатывает счетчик общего количества строк, задейст­вованных запросом, полученный с помощью функции mysql_affected_rows(). На каждом этапе гарантирована распечатка информации об ошибке на стандартное устройство вывода в случае ее возникновения.
Предлагаем вашему вниманию несколько примеров использования этого клиента.
Листинг 19.27.
[user@host]$ ./client.bin
Запуск: ./client.bin <узел> <пользователь> <пароль> [user@host]$ ./client.bin localhost root ""
Ошибка соединения: Access denied for user: 'root@localhost' [user@host]$ ./client.bin localhost root master запрос? SHOW DATABASES
[Database] db1
inventory
mysql
test
** Запрос обработан успешно, выбрано 4 строки ** запрос? SHOW TABLES FROM DB1
[Tables_in_db1] categories data
employees logs
** Запрос обработан успешно, выбрано 4 строки ** запрос ? USE db1 (Using password: YES)
** Запрос обработан успешно, обработано 0 строк ** запрос? SELECT * FROM employees [id], [name], [dept], [comp] 103, Miles D, Engineering, 67550.00 105, Susan J, Engineering, 73000.00
126, Joe T, Legal, 90000.00
127, John D, HR, 41000.00 134, Ingrid F, HR, 43600.00
** Запрос обработан успешно, обработано 5 строк ** запрос? SELECT id, name FROM employees WHERE camp > 70000
[id], [name] 105, Susan J 126, Joe T
** Запрос обработан успешно, обработано 2 строк **
запрос? UPDATE employees SET comp = comp + 5000 WHERE camp < 50000
** Запрос обработан успешно, обработано 2 строк ** запрос? SELECT nothing
Ошибка в запросе: Unknown column 'nothing' in 'field list' запрос ? exit [user@host]$