]> git.sesse.net Git - vlc/blobdiff - modules/media_library/sql_media_library.c
flac: reorder, remove some forward declarations
[vlc] / modules / media_library / sql_media_library.c
index 1b35260f0b4ac40d413a3c9606e1ec8d05b75c60..c56479bd6a966f984fc6762848aa157895dc0876 100644 (file)
@@ -60,42 +60,48 @@ static int CreateInputItemFromMedia( media_library_t *p_ml,
 struct ml_table_elt
 {
     int column_id;
-    char column_name[];
+    const char* column_name;
 };
 
+static int compare_ml_elts( const void *a, const void *b )
+{
+    return strcmp( ( (struct ml_table_elt* )a )->column_name,
+            ( ( struct ml_table_elt* )b )->column_name );
+}
+
 static const struct ml_table_elt ml_table_map[]=
 {
-    { ML_ALBUM_COVER,  "album_cover" },
-    { ML_ALBUM_ID,         "album_id" },
-    { ML_ALBUM,                "album_title" },
-    { ML_COMMENT,          "comment" },
-    { ML_COVER,                "cover" },
-    { ML_DIRECTORY,        "directory_id" },
-    { ML_DISC_NUMBER,  "disc" },
-    { ML_DURATION,         "duration" },
-    { ML_EXTRA,                "extra" },
-    { ML_FILESIZE,         "filesize" },
-    { ML_FIRST_PLAYED, "first_played" },
-    { ML_GENRE,                "genre" },
-    { ML_ID,           "id" },
-    { ML_IMPORT_TIME,  "import_time" },
-    { ML_LANGUAGE,         "language" },
-    { ML_LAST_PLAYED,  "last_played" },
-    { ML_LAST_SKIPPED, "last_skipped" },
-    { ML_ORIGINAL_TITLE,"original_title" },
-    { ML_PEOPLE_ID,        "people_id" },
-    { ML_PEOPLE,           "people_name" },
-    { ML_PEOPLE_ROLE,  "people_role" },
-    { ML_PLAYED_COUNT, "played_count" },
-    { ML_PREVIEW,          "preview" },
-    { ML_SCORE,                "score" },
-    { ML_SKIPPED_COUNT,        "skipped_count" },
-    { ML_TITLE,                "title" },
-    { ML_TRACK_NUMBER, "track" },
-    { ML_TYPE,         "type" },
-    { ML_URI,          "uri" },
-    { ML_VOTE,         "vote" },
-    { ML_YEAR,          "year" }
+    { ML_ALBUM_COVER,    "album_cover" },
+    { ML_ALBUM_ID,       "album_id" },
+    { ML_ALBUM,          "album_title" },
+    { ML_COMMENT,        "comment" },
+    { ML_COVER,          "cover" },
+    { ML_DIRECTORY,      "directory_id" },
+    { ML_DISC_NUMBER,    "disc" },
+    { ML_DURATION,       "duration" },
+    { ML_EXTRA,          "extra" },
+    { ML_FILESIZE,       "filesize" },
+    { ML_FIRST_PLAYED,   "first_played" },
+    { ML_GENRE,          "genre" },
+    { ML_ID,             "id" },
+    { ML_IMPORT_TIME,    "import_time" },
+    { ML_LANGUAGE,       "language" },
+    { ML_LAST_PLAYED,    "last_played" },
+    { ML_LAST_SKIPPED,   "last_skipped" },
+    { ML_ORIGINAL_TITLE, "original_title" },
+    { ML_PEOPLE_ID,      "people_id" },
+    { ML_PEOPLE,         "people_name" },
+    { ML_PEOPLE_ROLE,    "people_role" },
+    { ML_PLAYED_COUNT,   "played_count" },
+    { ML_PREVIEW,        "preview" },
+    { ML_SCORE,          "score" },
+    { ML_SKIPPED_COUNT,  "skipped_count" },
+    { ML_TITLE,          "title" },
+    { ML_TRACK_NUMBER,   "track" },
+    { ML_TYPE,           "type" },
+    { ML_URI,            "uri" },
+    { ML_VOTE,           "vote" },
+    { ML_YEAR,           "year" }
 };
 
 /*****************************************************************************
@@ -479,26 +485,15 @@ int SQLToMediaArray( media_library_t *p_ml, vlc_array_t *p_result_array,
     const int count = sizeof( ml_table_map )/ sizeof( struct ml_table_elt );
     for( int col = 0; col < i_cols; col++ )
     {
-        //binary search
-        int low = 0, high = count - 1;
-        int answer = -1;
-        while( low <= high ) {
-            int mid = (low + high ) / 2;
-            char* mid_val = ml_table_map[mid].column_name;
-            int cmp = strcmp( mid_val, res( 0, col ) );
-            if( cmp > 0 )
-                low = mid + 1;
-            else if ( cmp < 0 )
-                high = mid - 1;
-            else
-            {
-                answer = mid;  break;
-            }
-        }
-        if( answer == -1 )
+        struct ml_table_elt key, *result = NULL;
+        key.column_name = res( 0, col );
+        result = bsearch( &key, ml_table_map, count,
+                sizeof( struct ml_table_elt ), compare_ml_elts );
+
+        if( !result )
             msg_Warn( p_ml, "unknown column: %s", res( 0, col ) );
         else
-            indexes[col] = ml_table_map[answer].column_id;
+            indexes[col] = result->column_id;
     }
 
     /* Read rows 1 to i_rows */
@@ -631,6 +626,7 @@ int SQLToMediaArray( media_library_t *p_ml, vlc_array_t *p_result_array,
         }
         else /* This is a repeat row and the people need to be put together */
         {
+            free( p_result );
             ml_LockMedia( p_append->value.p_media );
             if( psz_append_pname && i_append_pid && psz_append_prole )
                 ml_CreateAppendPersonAdv( &(p_append->value.p_media->p_people),
@@ -1132,7 +1128,7 @@ ml_media_t* GetMedia( media_library_t* p_ml, int id,
         else
         {
             ml_LockMedia( p_media );
-            if( p_media->b_sparse == true && select == ML_MEDIA )
+            if( p_media->b_sparse && select == ML_MEDIA )
                 reload = true;
             /* Utilise ML_MEDIA_EXTRA load? TODO */
             ml_UnlockMedia( p_media );