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" }
};
/*****************************************************************************
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 */
}
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),
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 );