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: %sn", 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: %sn",
mysql_errno(&my_connection), mysql_error(&my_connection));
return 0;
}
res = mysql_query(&my_connection, "SELECT LAST_INSERT_ID()");
if (res) {
printf("SELECT error: %sn", 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", &artist_id);
}
mysql_free_result(res_ptr);
}
}
return artist_id;
} /* get_artist_id */
Переходите к вставке информации о дорожках для вашего компакт-диска. И снова защититесь от специальных символов в названиях дорожек:
int add_tracks(struct current_tracks_st *tracks) {
int res;
char is[250];
char es[250];
int i;
if (!dbconnected) return 0;
i = 0;
while (tracks->track[i][0]) {
mysql_escape_string(es, tracks->track[i], strlen(tracks->track[i]));
sprintf(is,
"INSERT INTO track(cd_id, track_id, title) VALUES(%d, %d, '%s')",
tracks->cd_id, i + 1, es);
res = mysql_query(&my_connection, is);
if (res) {
fprintf(stderr, "Insert error %d: %sn",
mysql_errno(&my_connection), mysql_error(&my_connection));
return 0;
}
i++;
}
return 1;
} /* add tracks */
Теперь переходите к извлечению информации о компакт-диске с заданным значением его ID. Будет применена операция объединения базы данных для извлечения ID исполнителя во время получения данных об ID диска. Это обычно хороший подход: системы управления базами данных отлично знают, как эффективно выполнять сложные запросы, поэтому никогда не пишите прикладной программный код для того, что вы можете просто попросить сделать СУРБД, передав ей запрос на языке SQL. Есть шанс сберечь собственные силы, не тратя их на написание дополнительного программного кода, и получить приложение, работающее более эффективно, разрешив СУРБД выполнить максимально возможный объем работы.