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

на главную - закладки

Жанры

Основы программирования в 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;

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

Технарь

Муравьёв Константин Николаевич
1. Технарь
Фантастика:
космическая фантастика
попаданцы
7.13
рейтинг книги
Технарь

Товарищ "Чума"

lanpirot
1. Товарищ "Чума"
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Товарищ Чума

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

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

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

Чужак из ниоткуда 2

Евтушенко Алексей Анатольевич
2. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 2

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7

Девять драконов

Скотт Джастин
Детективы:
триллеры
5.00
рейтинг книги
Девять драконов

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

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

Родословная. Том 1

Ткачев Андрей Юрьевич
1. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 1

Воин

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

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

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

Газлайтер. Том 3

Володин Григорий
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая