Теперь перейдем к функциям манипулирования данными. Обратите внимание на отсутствие функций создания и удаления исполнителей. Вы реализуете их за кадром, создавая необходимые записи об исполнителях и затем удаляя их, когда их упоминания не остается ни в одном альбоме.
/* Функции для добавления компакт-диска */
int add_cd(char *artist, char *title, char *catalogue, int *cd_id);
int add_tracks(struct current_tracks_st *tracks);
/*
Функции поиска и извлечения компакт-диска */
int find_cds(char *search_str, struct cd_search_st *results);
int get_cd(int cd_id, struct current_cd_st *dest);
int get_cd_tracks(int cd_id, struct current_tracks_st *dest);
/* Функция для удаления элементов */
int delete_cd(int cd_id);
Функция поиска очень обобщенная: вы передаете строку, и она ищет эту строку в элементах "исполнитель", "название" или "каталог".
Тестирование интерфейса приложения
Перед реализацией вашего интерфейса следует написать программный код, использующий его. Это может показаться странным, но зачастую это хороший способ подробно проанализировать поведение интерфейса, прежде чем принимать решение о его реализации.
Далее приведена программа app_test.c. Сначала несколько файлов include и типов structs:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "app_mysql.h"
int main {
struct current_cd_st cd;
struct cd_search_st cd_res;
struct current_tracks_st ct;
int cd_id;
int res, i;
Первое, что всегда должно делать ваше приложение, — инициализация подключения к базе данных, предоставляющая корректные имя пользователя и пароль (убедитесь, что вы заменили их своими):
database_start("rick", "secret");
Далее тестируется добавление компакт-диска:
res = add_cd("Mahler", "Symphony No 1", "4596102", &cd_id);
printf("Result of adding a cd was %d, cd_id is %d\n", res, cd_id);
memset(&ct, 0, sizeof(ct));
ct.cd_id = cd_id;
strcpy(ct.track[0], "Langsam Schleppend");
strcpy(ct.track[1], "Kraftig bewegt");
strcpy(ct.track[2], "Feierlich und gemessen");
strcpy(ct.track[3], "St"urmisch 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",