Применение MySQL C API

За что я люблю OpenSource? За открытость, за прозрачность, которые определяются только моими собственными знаниями и квалификацией. Устранение разного рода недугов свободного открытого программного обеспечения в моих руках.
Нашел я одну программу, её назначение не принципиально – мечта заказчика!! Но вот одно лишь не подходит по ТЗ.. логи пишет в файл, а нужно в базу. Программу собирал из исходников, скачанных с официального сайта в виде тарбола. Проглядел исходники нашел функцию записи сообщения в файл – осталось переписать функцию на запись того же сообщения в базу и пересобрать программу. Наверное, для рядового Windows-пользователя ход моих мыслей напоминает проектирование Лунохода =))
Недолгий поиск наталкивает меня на MySQL C API, о существовании которого я даже не подозревал. Дальше просто выложу рабочий пример со строкой компиляции, многим новичкам сэкономит массу времени.

# uname -a
FreeBSD newaspu.ru 6.2-RELEASE FreeBSD 6.2-RELEASE #1: Tue Nov 27 17:28:53 VOLT 2007 root@aspu.ru:/usr/obj/usr/src/sys/MYKERNEL i386
# pkg_info | grep mysql
mysql-client-5.0.67_1 Multithreaded SQL database (client)
mysql-scripts-5.0.67_1 Multithreaded SQL database (scripts)
mysql-server-5.0.67_1 Multithreaded SQL database (server)
p5-DBD-mysql50-4.006 MySQL 5.0 driver for the Perl5 Database Interface (DBI)
php5-mysql-5.2.6_2 The mysql shared extension for php
php5-mysqli-5.2.6_2 The mysqli shared extension for php
php5-pdo_mysql-5.2.6_2 The pdo_mysql shared extension for php
# cat /home/dronga/C_practice/mysql/test_WORK_c.c
#include <stdio.h>
#include <stdlib.h>
#include "/usr/local/include/mysql/mysql.h"
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
void exiterr(int exitcode)
{
fprintf(stderr, "%s\n", mysql_error(&mysql));
exit(exitcode);
}

int main()
{
uint i = 0;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"client");
if (!mysql_real_connect(&mysql,"localhost","admin","P@$$0red","test",0,NULL,0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&mysql));
}

if (mysql_query(&mysql,"SELECT * FROM `testtable`"))
exiterr(3);
if (!(res = mysql_store_result(&mysql)))
exiterr(4);
while((row = mysql_fetch_row(res))) {
for (i=0 ; i < mysql_num_fields(res); i++)
printf("%s\n",row[i]);
}
if (!mysql_eof(res))
exiterr(5);
mysql_free_result(res);
mysql_close(&mysql);
}
#cc -I/usr/local/include/mysql -L/usr/local/lib/mysql test_WORK_c.c -o myapp -lm -lmysqlclient
#./myapp

Дальше это дело легко мигрировало в исходники нужной программулины и после компиляции сделало всех счастливыми =) Надеюсь и вам поможет!

Leave a comment

Your comment