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 %d\n", res, cd_res.cd_id[0]);
res = get_cd(cd_res.cd_id[0], &cd);
printf("get_cd returned %d\n", res);
memset(&ct, 0, sizeof(ct));
res = get_cd_tracks(cd_res.cd_id[0], set);
printf("get_cd_tracks returned %d\n", res);
printf("Title: %s\n", cd.title);
i = 0;
while (i < res) {
printf("\ttrack %d is %s\n", i, ct.track[i]);
i++;
}
В заключение удалите компакт-диск:
res = delete_cd(cd_res.cd_id[0]);
printf("Delete_cd returned %d\n", res);
Затем отключитесь и завершите работу программы:
database_end();
return EXIT_SUCCESS;
}
Реализация интерфейса
Теперь более трудная часть — реализация интерфейса, описанного вами. Вся она хранится в файле app_mysql.с.
Начните с основных файлов
include
, глобальной структуры подключения, которая понадобится, и флага
dbconnected
, который будет применяться для того, чтобы приложения не пытались получить доступ к данным, если у них нет подключения. Вы также используете внутреннюю функцию
get_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, %s\n",
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_id
, вы можете вставлять главную запись компакт-диска. Обратите внимание на применение функции
mysql_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: %s\n",
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: %s\n", mysql_error(&my_connection));