/** * @author Bastiaan Welmers * * */ // for mysql functionality #include #include #include // for printf() #include // str_replace #include // for strstr() #include // for symlink() #include // for basename #include // database access information for amarok #define USERNAME "amarok" #define PASSWORD "korama" #define DBNAME "amarok"; #define PORT 0 #define HOSTNAME NULL #define SOCKET "/var/lib/mysql2/mysql.sock" #define OPTIONFLAGS 0; // query #define QUERY "SELECT \ CONCAT(devices.lastmountpoint, '/', t.url) AS filename, \ artist.name AS artist, \ album.name AS album, \ t.title AS title, \ t.track AS track \ FROM tags t \ LEFT JOIN devices ON devices.id = t.deviceid \ LEFT JOIN album ON album.id = t.album \ LEFT JOIN artist ON artist.id = t.artist \ ORDER BY t.bitrate DESC \ " //$sql .= 'CONCAT(devices.lastmountpoint, \'/\', t.url) AS filename, '; //$sql .= 'LEFT JOIN devices ON devices.id = t.deviceid '; static MYSQL* conn; typedef struct { bool value; char* message; } MK_Exception; MK_Exception initMysql(const char*); void closeMysql(); void process_resultset(MYSQL*, MYSQL_RES*); int main(int argc, char** argv) { MK_Exception retValue; if (!(retValue = initMysql(*argv)).value) { fprintf(stderr, "Error while initializing MySQL: %s\n", retValue.message); return 1; } char* query = QUERY; //"SELECT * FROM devices"; MYSQL_RES* result; if (mysql_query(conn, query)) { fprintf(stderr, "mysql_query failed: %s", query); } else { result = mysql_store_result(conn); process_resultset(conn, result); } closeMysql(); return 0; } void closeMysql() { mysql_close(conn); mysql_library_end(); } MK_Exception initMysql(const char* programName) { MK_Exception returnValue = {TRUE, NULL}; static char* opt_host_name = HOSTNAME; static char* opt_user_name = USERNAME; static char* opt_password = PASSWORD; static unsigned int opt_port_num = PORT; static char* opt_socket_name = SOCKET; static char* opt_db_name = DBNAME; static unsigned int opt_flags = OPTIONFLAGS; MY_INIT(programName); if (mysql_library_init(0, NULL, NULL)) { returnValue.value = FALSE; returnValue.message = "mysql_library_init() failed"; return (returnValue); } conn = mysql_init(NULL); if (conn == NULL) { returnValue.value = FALSE; returnValue.message = "mysql_init() failed (out of memory?"; return (returnValue); } if (mysql_real_connect(conn, opt_host_name, opt_user_name, opt_password, opt_db_name, opt_port_num, opt_socket_name, opt_flags) == NULL) { returnValue.value = FALSE; returnValue.message = "mysql_real_connect() failed?"; return (returnValue); } //set proper encoding info if (mysql_query(conn, "SET NAMES 'utf8'")) { returnValue.value = FALSE; returnValue.message = "SET NAMES 'utf8' failed"; return (returnValue); } if (mysql_query(conn, "SET CHARACTER SET utf8")) { returnValue.value = FALSE; returnValue.message = "SET CHARACTER SET utf8 failed"; return (returnValue); } return returnValue; } void process_resultset(MYSQL* conn, MYSQL_RES* result) { if (result == NULL) { fprintf(stderr, "mysql_store_result failed"); } else { MYSQL_ROW row; unsigned int i; unsigned int num_fields = mysql_num_fields(result); //room for storing manupilated strings char filename_buffer[1024]; char artist_buffer[256]; char album_buffer[256]; char title_buffer[256]; char track_buffer[256]; char dst_buffer[2048]; char* filename = &filename_buffer[0]; char* artist = &artist_buffer[0]; char* album = &album_buffer[0]; char* title = &title_buffer[0]; char* track = &track_buffer[0]; char* dst = &dst_buffer[0]; printf("Filenames:\n"); printf("%i\n", num_fields); while ((row = mysql_fetch_row(result)) != NULL) { if (row[0] != NULL) { if (row[0]) str_replace_buf(filename, "/./", "/", row[0]); else strcpy(filename, ""); if (row[1]) ucwords(strtolower(str_replace_buf(artist, "/", "-", row[1]))); else strcpy(artist, ""); if (row[2]) ucwords(strtolower(str_replace_buf(album, "/", "-", row[2]))); else strcpy(album, ""); if (row[3]) ucwords(strtolower(str_replace_buf(title, "/", "-", row[3]))); else strcpy(title, ""); if (row[4]) strcpy(track, row[4]); else strcpy(track, ""); // transform "1" till "9" to "01" till "09" if (strlen(track) == 1 && *track <= '9') { char track_temp = *track; strcpy(track, "00"); track[1] = track_temp; } *dst = 0; // empty string if (strlen(artist) > 0) { strcat(dst, artist); strcat(dst, "/"); } if (strlen(artist) > 0) { strcat(dst, artist); strcat(dst, "/"); } if (strlen(album) > 0) { strcat(dst, album); strcat(dst, "/"); } if (strlen(track) > 0) { strcat(dst, track); strcat(dst, " - "); } if (strlen(title) == 0) { strcpy(title, filename); basename(title); ucwords(title); } strcat(dst, title); char* suffix = filename + strlen(filename) - 3; strcat(dst, "."); strcat(dst, suffix); printf("%s\n", dst); } } if (mysql_errno(conn) != 0) { fprintf(stderr, "mysql_fetch_row() failed\n"); } else { printf("Rows processed: %lu\n", (unsigned long) mysql_num_rows(result)); } } }