Читать интересную книгу Основы программирования в Linux - Мэтью Нейл

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 157 158 159 160 161 162 163 164 165 ... 324

int get_cd(int cd_id, struct current_cd_st *dest) {

 MYSQL_RES *res_ptr;

 MYSQL_ROW mysqlrow;

 int res;

 char qs[250];

 if (!dbconnected) return 0;

 memset(dest, 0, sizeof(*dest));

 dest->artist_id = -1;

 sprintf(qs, "SELECT artist.id, cd.id, artist.name, cd.title, cd.catalogue

  FROM artist, cd WHERE artist.id = cd.artist_id and cd.id = %d", cd_id);

 res = mysql_query(&my_cormection, qs);

 if (res) {

  fprintf(stderr, "SELECT error: %sn", mysql_error(&my_connection));

 } else {

  res_ptr = mysql_store_result(&my_connection);

  if (res_ptr) {

   if (mysql_num_rows(res_ptr) > 0) {

    if (mysqlrow = mysql_fetch_row(res_ptr)) {

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

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

     strcpy(dest->artist_name, mysqlrow[2]);

     strcpy(dest->title, mysqlrow[3]);

     strcpy(dest->catalogue, mysqlrow[4]);

    }

   }

   mysql_free_result(res_ptr);

  }

 }

 if (dest->artist_id != -1) return 1;

 return 0;

} /* get_cd */

Далее вы реализуете извлечение информации о дорожках. В SQL-операторе вы задаете ключевые слова ORDER BY, для того чтобы возвращать дорожки в подходящей последовательности. И опять это позволит СУРБД выполнить нужную работу более эффективно, чем если бы вы извлекли дорожки в произвольном порядке, а затем написали собственный программный код для их сортировки.

int get_cd_tracks(int cd_id, struct current_tracks_st *dest) {

 MYSQL_RES *res_ptr;

 MYSQL_ROW mysqlrow;

 int res;

 char qs[250];

 int i = 0, num_tracks = 0;

 if (!dbconnected) return 0;

 memset(dest, 0, sizeof(*dest));

 dest->cd_id = -1;

 sprintf(qs, "SELECT track_id, title FROM track WHERE track.cd_id = %d

  ORDER BY track_id", cd_id);

 res = mysql_query(&my_connection, qs);

 if (res) {

  fprintf(stderr, "SELECT error: %sn", mysql_error(&my_connection));

 } else {

  res_ptr = mysql_store_result(&my_connection);

  if (res_ptr) {

   if ((num_tracks = mysql_num_rows(res_ptr)) > 0) {

    while (mysqlrow = mysql_fetch_row(res_ptr)) {

     strcpy(dest->track[i], mysqlrow[1]);

     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, &quot;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<i> '%%%s%%')&quot;,</i> ss, ss, ss);

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

 res = mysql_query(&amp;my_connection, qs);

 if (res) {

  fprintf(stderr, &quot;SELECT error: %sn&quot;, mysql_error(&amp;my_connection));

 } else {

  res_ptr = mysql_store_result(&amp;my_connection);

  if (res_ptr) {

   num_rows = mysql_num_rows(res_ptr);

   if (num_rows &gt; 0) {

    while ((mysqlrow = mysql_fetch_row(res_ptr)) &amp;&amp; i &lt; MAX_CD_RESULT) {

1 ... 157 158 159 160 161 162 163 164 165 ... 324
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Основы программирования в Linux - Мэтью Нейл.

Оставить комментарий