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

на главную

Жанры

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

i++;

}

dest->cd_id = cd_id;

}

mysql_free_result(res_ptr);

}

 }

 return num_tracks;

} /* get_cd_tracks */

До сих пор вы добавляли и извлекали информацию о компакт-дисках. Вы добились простоты интерфейса, ограничив число результатов, которые могут быть возвращены, но вам все же нужна собственная функция, сообщающая

о том, сколько строк в результирующем наборе, даже если их больше, чем вы можете извлечь.

int find_cds(char *search_str, struct cd_search_st *dest) {

 MYSQL_RES *res_ptr;

 MYSQL_ROW mysqlrow;

 int res;

 char qs[500];

 int i = 0;

 char ss[250];

 int num_rows = 0;

 if (!dbconnected) return 0;

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

 memset(dest, -1, sizeof(*dest));

 mysql_escape_string(ss, search_str, strlen(search_str));

Далее вы формируете строку запроса. Обратите внимание на необходимость применения большого количества символов

%
, т.к. знак
%
— это и символ, который необходимо включить в SQL-оператор для указания соответствия любой строке и специальный символ в функции
sprintf
:

 sprintf(qs, "SELECT DISTINCT artist.id, cd.id FROM artist, cd WHERE artist.id = cd.artist_id and (artist.name LIKE '%%%s%%' OR cd.title LIKE '%%%s%%' OR cd.catalogue LIKE '%%%s%%')", ss, ss, ss);

Сейчас можно выполнить запрос:

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

num_rows = mysql_num_rows(res_ptr);

if (num_rows > 0) {

while ((mysqlrow = mysql_fetch_row(res_ptr)) && i < MAX_CD_RESULT) {

sscanf(mysqlrow[1], "%d", &dest->cd_id[i]);

i++;

}

}

mysql_free_result(res_ptr);

}

 }

 return num_rows;

} /* find_cds */

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

должны удалять данные из каждой таблицы по очереди:

int delete_cd(int cd_id) {

 int res;

 char qs[250];

 int artist_id, num_rows;

 MYSQL_RES *res_ptr;

 MYSQL_ROW mysqlrow;

 if (!dbconnected) return 0;

 artist_id = -1;

 sprintf(qs, "SELECT artist_id FROM cd WHERE artist_id = \

(SELECT artist_id FROM cd WHERE id = '%d')", cd_id);

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

num_rows = mysql_num_rows(res_ptr);

if (num_rows == 1) {

/* Исполнитель не упоминается в других CD */

mysqlrow = mysql_fetch_row(res_ptr);

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

}

mysql_free_result(res_ptr);

}

 }

 sprintf(qs, "DELETE FROM track WHERE cd_id = '%d'", cd_id);

 res = mysql_query(&my_connection, qs);

 if (res) {

fprintf(stderr, "Delete error (track) %d: %s\n",

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

return 0;

 }

 sprintf(qs, "DELETE FROM cd WHERE id = '%d'", cd_id);

 res = mysql_query(&my_connection, qs);

 if (res) {

fprintf(stderr, "Delete error (cd) %d: %s\n",

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

return 0;

 }

 if (artist_id != -1) {

/* Теперь элемент artist не связан ни с одним CD, удалите его */

sprintf(qs, "DELETE FROM artist WHERE id = '%d'", artist_id);

res = mysqlquery(&my_connection, qs);

if (res) {

fprintf(stderr, "Delete error (artist) %d: %s\n",

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

}

 }

 return 1;

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

Законы Рода. Том 5

Flow Ascold
5. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 5

Батя

Черникова Саша
1. Медведевы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Батя

Лорд Системы 7

Токсик Саша
7. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 7

Идеальная невеста некроманта

Елисеева Валентина
1. Некромант
Любовные романы:
любовно-фантастические романы
5.38
рейтинг книги
Идеальная невеста некроманта

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Идеальный мир для Лекаря 18

Сапфир Олег
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 18

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

С Д. Том 16

Клеванский Кирилл Сергеевич
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
С Д. Том 16

Мое ускорение

Иванов Дмитрий
5. Девяностые
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Мое ускорение

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

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

Физрук 2: назад в СССР

Гуров Валерий Александрович
2. Физрук
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Физрук 2: назад в СССР

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Точка Бифуркации V

Смит Дейлор
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации V