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

на главную

Жанры

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

 }

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

return 0;

 } else {

res_ptr = mysql_use_result(&my_connection);

if (res_ptr) {

if ((mysqlrow = mysql_fetch_row(res_ptr))) {

sscanf(mysqlrow[0], "%d", &new_cd_id);

}

mysql_free_result(res_ptr);

}

He

стоит беспокоиться о других программах-клиентах, вставляющих компакт-диски в это же время, и о возможной путанице поступающих номеров ID; СУРБД MySQL запоминает присвоенный ID для каждого подключения, поэтому, даже если другое приложение вставило компакт-диск прежде, чем вы извлекли ID, вы все равно получите номер, соответствующий вашей строке, а не строке, добавленной другим приложением.

И последнее, но не по степени важности, установите ID вновь добавленной строки и верните код успешного или аварийного завершения:

*cd_id = new_cd_id;

if (new_cd_id != -1) return 1;

return 0;

 }

} /* add_cd */

Теперь посмотрите реализацию функции

get_artist_id
; процесс очень похож на вставку записи о компакт-диске:

/* Поиск или создание artist_id для заданной строки */

static int get_artist_id(char *artist) {

 MYSQL_RES *res_ptr;

 MYSQL_ROW mysqlrow;

 int res;

 char qs[250];

 char is[250];

 char es[250];

 int artist_id = -1;

 /* Он уже существует? */

 mysql_escape string(es, artist, strlen(artist));

 sprintf(qs, "SELECT id FROM artist WHERE name = '%s'", es);

 res = mysql_query(&my_connection, qs);

 if (res) {

fprintf(stderr, "SELECT error: %s\n", mysql_error(&my_connection));

 } else {

res_ptr = mysql_store_result(&my_connection);

if (res_ptr) {

if (mysqr_num_rows(res_ptr) > 0) {

if (mysqlrow = mysql_fetch_row(res_ptr)) {

sscanf(mysqlrow[0], "%d", &artist_id);

}

}

mysql_free_result(res_ptr);

}

 }

 if (artist_id != -1) return artist_id;

 sprintf(is, "INSERT INTO artist(name) VALUES ('%s')", es);

 res = mysql_query(&my_connection, is);

 if (res) {

fprintf(stderr, "Insert error %d: %s\n",

mysql_errno(&my_connection), mysql_error(&my_connection));

Поделиться:
Популярные книги

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII

Старый, но крепкий 2

Крынов Макс
2. Культивация без насилия
Фантастика:
рпг
уся
эпическая фантастика
5.00
рейтинг книги
Старый, но крепкий 2

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Дракон

Бубела Олег Николаевич
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Дракон

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Брат мужа

Зайцева Мария
Любовные романы:
5.00
рейтинг книги
Брат мужа

Язычник

Мазин Александр Владимирович
5. Варяг
Приключения:
исторические приключения
8.91
рейтинг книги
Язычник

Кодекс Охотника. Книга XXV

Винокуров Юрий
25. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга XXV

Клод Моне

де Декер Мишель
1034. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Клод Моне