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));
return 0;
}
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", &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: %s\n",
mysql_errno(&my_connection), mysql_error(&my_connection));
return 0;
}
i++;
}
return 1;
} /* add tracks */