Литмир - Электронная Библиотека
Содержание  
A
A

Следующая часть тоже понятна: она сообщает серверу имена таблиц, которые вы используете:

FROM artist, cd, track

Часть

WHERE
слегка мудреная:

WHERE artist.id = cd.artist_id AND track.cd_id = cd.id AND track.track_id < 3

Первый фрагмент сообщает серверу о том, что

id
в таблице
artist
такой же, как номер в столбце
artist_id
таблицы
cd
. Напоминаем, что вы сохраняете имя исполнителя один раз и используете
id
для ссылки на этого исполнителя в таблице
cd
. Следующий фрагмент,
track.cd_id = cd.id
, проделывает то же самое для таблиц
track
и
cd
, извещая сервер о том, что столбец
cd_id
таблицы
track
такой же, как столбец
id
таблицы
cd
. Третий фрагмент,
track.track_id < 3
, ограничивает объем возвращаемых данных так, что вы получаете только дорожки 1 и 2 из каждого компакт-диска. Последнее, но не по значимости, объединение этих трех условий с помощью операции
AND
, т.к. вы хотите, чтобы все три условия были истинными.

Доступ к данным приложения из программы на С

В этой главе вы не готовы писать законченное приложение, применяющее интерфейс GUI. Прежде надо сконцентрироваться на написании файла интерфейса, позволяющего сравнительно просто получить доступ, к вашим данным из программы на языке С. Общая проблема при написании подобного программного кода — неизвестные объем данных, которые могут быть возвращены, и способ передачи их между программой-клиентом и программой, обращающейся к базе данных. В данном приложении, для того чтобы сохранить его простоту и сосредоточиться на интерфейсе базы данных, очень важной части программного кода, будут применяться структуры фиксированного размера. В реальном приложении этот вариант может оказаться неприемлемым. Универсальное решение, также облегчающее сетевой трафик, — всегда извлекать данные построчно с помощью функций

mysql_use_result
и
mysql_fetch_row
, как было показано ранее в этой главе.

Определение интерфейса

Начните с заголовочного файла app_mysql.h, в котором определяются структуры и функции.

Сначала несколько структур:

/* Упрощенная структура для представления компакт-диска

   за исключением информации о дорожке */

struct current_cd_st {

 int artist_id;

 int cd_id;

 char artist_name[100];

 char title[100];

 char catalogue[100];

};

/* Упрощенная структура сведений о дорожке */

struct current_tracks_st {

 int cd_id;

 char track[20][100];

};

#define MAX_CD_RESULT 10

struct cd_search_st {

 int cd_id[MAX_CD_RESULT];

};

Далее пара функций для подключения к серверу и отключения от него:

/* Серверные функции базы данных */

int database_start(char *name, char *password);

void database_end();

Теперь перейдем к функциям манипулирования данными. Обратите внимание на отсутствие функций создания и удаления исполнителей. Вы реализуете их за кадром, создавая необходимые записи об исполнителях и затем удаляя их, когда их упоминания не остается ни в одном альбоме.

/* Функции для добавления компакт-диска */

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");

158
{"b":"285844","o":1}