Чтение онлайн

ЖАНРЫ

Основы программирования в Linux
Шрифт:

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",

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;

Поделиться с друзьями: