Основы программирования в Linux - Мэтью Нейл
strcpy(ct.track[1], "Kraftig bewegt"); strcpy(ct.track[2], "Feierlich und gemessen"); strcpy(ct.track[3], "Stürmisch bewegt"); add_tracks(set);Теперь поищите компакт-диск и извлеките информацию из первого найденного CD:
res = find_cds("Symphony", &cd_res); printf("Found %d cds, first has ID %dn", res, cd_res.cd_id[0]); res = get_cd(cd_res.cd_id[0], &cd); printf("get_cd returned %dn", res); memset(&ct, 0, sizeof(ct)); res = get_cd_tracks(cd_res.cd_id[0], set); printf("get_cd_tracks returned %dn", res); printf("Title: %sn", cd.title); i = 0; while (i < res) { printf("ttrack %d is %sn", i, ct.track[i]); i++; }В заключение удалите компакт-диск:
res = delete_cd(cd_res.cd_id[0]); printf("Delete_cd returned %dn", res);Затем отключитесь и завершите работу программы:
database_end(); return EXIT_SUCCESS;}Теперь более трудная часть — реализация интерфейса, описанного вами. Вся она хранится в файле app_mysql.с.
Начните с основных файлов
includedbconnectedget_artist_id#include <stdlib.h>#include <stdio.h>#include <string.h>#include "mysql.h"#include "app_mysql.h"static MYSQL my_connection;static int dbconnected = 0;static int get_artist_id(char *artist);Как вы видели ранее в этой главе, подключиться к базе данных очень просто, а отключиться от нее и того проще:
int database_start(char *name, char *pwd) { if (dbconnected) return 1; mysql_init(&my_connection); if (!mysql_real_connect(&my_connection, "localhost", name, pwd, "blpcd", 0, NULL, 0)) { fprintf(stderr, "Database connection failure: %d, %sn", mysql_errno(&my_connection), mysql_error(&my_connection)); return 0; } dbconnected = 1; return 1;} /* database_start */void database_end() { if (dbconnected) mysql_close(&my_connection); dbconnected = 0;} /* database_end */Начинается реальная работа благодаря функции
add_cdНапоминаем о том, что программа будет отслеживать имена исполнителей автоматически:
int add_cd(char *artist, char *title, char* catalogue, int *cd_id) { MYSQL_RES *res_ptr; MYSQL_ROW mysqlrow; int res; char is[250]; char es[250]; int artist_id = -1; int new_cd_id = -1; if (!dbconnected) return 0;Далее нужно проверить, существует ли уже исполнитель, если нет, то создать его. Обо всем этом заботится функция
get_artist_id artist_id = get_artist_id(artist);Теперь, имея
artist_idmysql_escape_string mysql_escape_string(es, title, strlen(title)); sprintf(is, "INSERT INTO cd(title, artist_id, catalogue) VALUES('%s', %d, '%s')", es, artist_id, catalogue); res = mysql_query(&my_connection, is); if (res) { fprintf(stderr, "Insert error %d: %sn", mysql_errno(&my_connection), mysql_error(&my_connection)); return 0; }Когда вы дойдете до вставки дорожек для данного компакт-диска, вам потребуется знать ID, который использовался при вставке записи о компакт-диске. Вы сделали поле автоматически наращиваемым, поэтому база данных автоматически присвоила ID, но вам нужно явно извлечь это значение. Как было показано ранее в этой главе, сделать это можно с помощью функции
LAST_INSERT_ID res = mysql_query(&my_connection, "SELECT LAST_INSERT_ID()"); if (res) { printf("SELECT error: %sn", mysql_error(&my_connection));