You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
342 lines
11 KiB
342 lines
11 KiB
/*****************************************************************************
|
|
* sql_media_library.h : Media Library Interface
|
|
*****************************************************************************
|
|
* Copyright (C) 2008-2010 the VideoLAN team and AUTHORS
|
|
* $Id$
|
|
*
|
|
* Authors: Antoine Lejeune <phytos@videolan.org>
|
|
* Jean-Philippe André <jpeg@videolan.org>
|
|
* Rémi Duraffort <ivoire@videolan.org>
|
|
* Adrien Maglo <magsoft@videolan.org>
|
|
* Srikanth Raju <srikiraju at gmail dot com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
*****************************************************************************/
|
|
|
|
#ifndef SQL_MEDIA_LIBRARY_H
|
|
#define SQL_MEDIA_LIBRARY_H
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#include <vlc_common.h>
|
|
#include <vlc/vlc.h>
|
|
|
|
#include <vlc_sql.h>
|
|
#include <vlc_media_library.h>
|
|
|
|
#include <vlc_playlist.h>
|
|
#include <vlc_input.h>
|
|
#include <vlc_arrays.h>
|
|
#include <vlc_charset.h>
|
|
#include <vlc_plugin.h>
|
|
#include <vlc_interface.h>
|
|
#include <vlc_modules.h>
|
|
|
|
#include <stdarg.h>
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
|
|
#include "item_list.h"
|
|
|
|
#ifdef HAVE_SYS_STAT_H
|
|
# include <sys/stat.h>
|
|
#endif
|
|
|
|
|
|
/*****************************************************************************
|
|
* Static parameters
|
|
*****************************************************************************/
|
|
#define THREAD_SLEEP_DELAY 2 /* Time between two calls to item_list_loop */
|
|
#define MONITORING_DELAY 30 /* Media library updates interval */
|
|
#define ITEM_LOOP_UPDATE 1 /* An item is updated after 1 loop */
|
|
#define ITEM_LOOP_MAX_AGE 10 /* An item is deleted after 10 loops */
|
|
#define ML_DBVERSION 1 /* The current version of the database */
|
|
#define ML_MEDIAPOOL_HASH_LENGTH 100 /* The length of the media pool hash */
|
|
|
|
/*****************************************************************************
|
|
* Structures and types definitions
|
|
*****************************************************************************/
|
|
typedef struct monitoring_thread_t monitoring_thread_t;
|
|
typedef struct ml_poolobject_t ml_poolobject_t;
|
|
|
|
struct ml_poolobject_t
|
|
{
|
|
ml_media_t* p_media;
|
|
ml_poolobject_t* p_next;
|
|
};
|
|
|
|
struct media_library_sys_t
|
|
{
|
|
/* Lock on the ML object */
|
|
vlc_mutex_t lock;
|
|
|
|
/* SQL object */
|
|
sql_t *p_sql;
|
|
|
|
/* Monitoring thread */
|
|
monitoring_thread_t *p_mon;
|
|
|
|
/* Watch thread */
|
|
watch_thread_t *p_watch;
|
|
|
|
/* Holds all medias */
|
|
DECL_ARRAY( ml_media_t* ) mediapool;
|
|
ml_poolobject_t* p_mediapool[ ML_MEDIAPOOL_HASH_LENGTH ];
|
|
vlc_mutex_t pool_mutex;
|
|
|
|
/* Info on update/collection rebuilding */
|
|
bool b_updating;
|
|
bool b_rebuilding;
|
|
};
|
|
|
|
/* Directory Monitoring thread */
|
|
struct monitoring_thread_t
|
|
{
|
|
VLC_COMMON_MEMBERS;
|
|
|
|
vlc_cond_t wait;
|
|
vlc_mutex_t lock;
|
|
vlc_thread_t thread;
|
|
media_library_t *p_ml;
|
|
};
|
|
|
|
/* Media status Watching thread */
|
|
struct watch_thread_t
|
|
{
|
|
VLC_COMMON_MEMBERS;
|
|
media_library_t *p_ml;
|
|
vlc_cond_t cond;
|
|
vlc_mutex_t lock;
|
|
|
|
/* Input items watched */
|
|
struct item_list_t* p_hlist[ ML_ITEMLIST_HASH_LENGTH ];
|
|
vlc_mutex_t list_mutex;
|
|
|
|
/* List of items to check */
|
|
input_item_t** item_append_queue;
|
|
vlc_mutex_t item_append_queue_lock;
|
|
int item_append_queue_count;
|
|
};
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
* Function headers
|
|
*****************************************************************************/
|
|
/* General functions */
|
|
int CreateEmptyDatabase( media_library_t *p_ml );
|
|
int InitDatabase( media_library_t *p_ml );
|
|
|
|
/* Module Control */
|
|
int Control( media_library_t *p_ml,
|
|
int i_query,
|
|
va_list args );
|
|
|
|
/* Add functions */
|
|
int AddMedia( media_library_t *p_ml,
|
|
ml_media_t *p_media );
|
|
int AddAlbum( media_library_t *p_ml, const char *psz_title,
|
|
const char *psz_cover, const int i_album_artist );
|
|
int AddPeople( media_library_t *p_ml,
|
|
const char *psz_name,
|
|
const char *psz_role );
|
|
int AddPlaylistItem( media_library_t *p_ml,
|
|
playlist_item_t *p_playlist_item );
|
|
int AddInputItem( media_library_t *p_ml,
|
|
input_item_t *p_input );
|
|
|
|
/* Create and Copy functions */
|
|
ml_media_t* GetMedia( media_library_t* p_ml, int id,
|
|
ml_select_e select, bool reload );
|
|
input_item_t* GetInputItemFromMedia( media_library_t *p_ml,
|
|
int i_media );
|
|
void CopyInputItemToMedia( ml_media_t *p_media,
|
|
input_item_t *p_item );
|
|
void CopyMediaToInputItem( input_item_t *p_item,
|
|
ml_media_t *p_media );
|
|
|
|
/* Get functions */
|
|
int GetDatabaseVersion( media_library_t *p_ml );
|
|
int GetMediaIdOfInputItem( media_library_t *p_ml,
|
|
input_item_t *p_item );
|
|
int GetMediaIdOfURI( media_library_t *p_ml,
|
|
const char *psz_uri );
|
|
|
|
/* Search in the database */
|
|
int BuildSelectVa( media_library_t *p_ml,
|
|
char **ppsz_query,
|
|
ml_result_type_e *p_result_type,
|
|
va_list criterias );
|
|
int BuildSelect( media_library_t *p_ml,
|
|
char **ppsz_query,
|
|
ml_result_type_e *p_result_type,
|
|
const char *psz_selected_type_lvalue,
|
|
ml_select_e selected_type,
|
|
ml_ftree_t *tree );
|
|
int Find( media_library_t *p_ml,
|
|
vlc_array_t *results,
|
|
... );
|
|
int FindVa( media_library_t *p_ml,
|
|
vlc_array_t *results,
|
|
va_list criterias );
|
|
int FindAdv( media_library_t *p_ml,
|
|
vlc_array_t *results,
|
|
ml_select_e selected_type,
|
|
const char* psz_lvalue,
|
|
ml_ftree_t *tree );
|
|
|
|
/* Update the database */
|
|
int Update( media_library_t *p_ml,
|
|
ml_select_e selected_type,
|
|
const char* psz_lvalue,
|
|
ml_ftree_t *where,
|
|
vlc_array_t *changes );
|
|
int BuildUpdate( media_library_t *p_ml,
|
|
char **ppsz_query,
|
|
char **ppsz_id_query,
|
|
const char *psz_lvalue,
|
|
ml_select_e selected_type,
|
|
ml_ftree_t* where,
|
|
vlc_array_t *changes );
|
|
int UpdateMedia( media_library_t *p_ml,
|
|
ml_media_t *p_media );
|
|
int SetArtCover( media_library_t *p_ml,
|
|
int i_album_id,
|
|
const char *psz_cover );
|
|
|
|
/* Delete medias in the database */
|
|
int Delete( media_library_t *p_ml, vlc_array_t *p_array );
|
|
|
|
/* Do some query on the database */
|
|
int QuerySimple( media_library_t *p_ml,
|
|
const char *psz_fmt, ... );
|
|
int Query( media_library_t *p_ml,
|
|
char ***ppp_res,
|
|
int *pi_rows,
|
|
int *pi_cols,
|
|
const char *psz_fmt,
|
|
... );
|
|
int QueryVa( media_library_t *p_ml,
|
|
char ***ppp_res,
|
|
int *pi_rows,
|
|
int *pi_cols,
|
|
const char *psz_fmt,
|
|
va_list args );
|
|
int QuerySimpleVa( media_library_t *p_ml,
|
|
const char *psz_fmt,
|
|
va_list argp );
|
|
|
|
/* Convert SQL results to ML results */
|
|
int StringToResult( ml_result_t *res,
|
|
const char *psz,
|
|
const char *psz_id,
|
|
ml_result_type_e result_type );
|
|
int SQLToMediaArray( media_library_t *p_ml,
|
|
vlc_array_t *p_result_array,
|
|
char **pp_results,
|
|
int i_rows,
|
|
int i_cols );
|
|
int SQLToResultArray( media_library_t *p_ml,
|
|
vlc_array_t *p_result_array,
|
|
char **pp_results,
|
|
int i_rows,
|
|
int i_cols,
|
|
ml_result_type_e result_type );
|
|
|
|
/* Database locking functions */
|
|
|
|
/**
|
|
* @brief Begin a transaction
|
|
* @param p_ml The Media Library object
|
|
* @return VLC_SUCCESS and VLC_EGENERIC
|
|
* @note This creates a SHARED lock in SQLITE. All queries made between
|
|
* a Begin and Commit/Rollback will be transactional.
|
|
*/
|
|
static inline int Begin( media_library_t* p_ml )
|
|
{
|
|
return sql_BeginTransaction( p_ml->p_sys->p_sql );
|
|
}
|
|
|
|
/**
|
|
* @brief Commits the transaction
|
|
* @param p_ml The Media Library object
|
|
*/
|
|
static inline void Commit( media_library_t* p_ml )
|
|
{
|
|
sql_CommitTransaction( p_ml->p_sys->p_sql );
|
|
}
|
|
|
|
/**
|
|
* @brief Rollback the transaction
|
|
* @param p_ml The Media Library Object
|
|
*/
|
|
static inline void Rollback( media_library_t* p_ml )
|
|
{
|
|
sql_RollbackTransaction( p_ml->p_sys->p_sql );
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Scanning/monitoring functions
|
|
*****************************************************************************/
|
|
void *RunMonitoringThread( void *p_mon );
|
|
int AddDirToMonitor( media_library_t *p_ml,
|
|
const char *psz_dir );
|
|
int ListMonitoredDirs( media_library_t *p_ml,
|
|
vlc_array_t *p_array );
|
|
int RemoveDirToMonitor( media_library_t *p_ml,
|
|
const char *psz_dir );
|
|
|
|
|
|
/*****************************************************************************
|
|
* Media pool functions
|
|
*****************************************************************************/
|
|
ml_media_t* pool_GetMedia( media_library_t* p_ml, int media_id );
|
|
int pool_InsertMedia( media_library_t* p_ml, ml_media_t* media, bool locked );
|
|
void pool_GC( media_library_t* p_ml );
|
|
|
|
/*****************************************************************************
|
|
* Items watching system
|
|
*****************************************************************************/
|
|
/* Watching thread */
|
|
#define watch_add_Item( a, b, c ) __watch_add_Item( a, b, c, false )
|
|
|
|
int watch_Init( media_library_t *p_ml );
|
|
void watch_Close( media_library_t *p_ml );
|
|
int __watch_add_Item( media_library_t *p_ml, input_item_t *p_item,
|
|
ml_media_t* p_media, bool locked );
|
|
|
|
#define watch_del_Item( a, b ) __watch_del_Item( a, b, false )
|
|
int __watch_del_Item( media_library_t *p_ml, input_item_t *p_item, bool locked );
|
|
int watch_del_MediaById( media_library_t* p_ml, int i_media_id );
|
|
input_item_t* watch_get_itemOfMediaId( media_library_t *p_ml, int i_media_id );
|
|
ml_media_t* watch_get_mediaOfMediaId( media_library_t* p_ml, int i_media_id );
|
|
int watch_get_mediaIdOfItem( media_library_t *p_ml, input_item_t *p_item );
|
|
void watch_Force_Update( media_library_t* p_ml );
|
|
|
|
/*****************************************************************************
|
|
* Free result of ml_Query
|
|
*****************************************************************************/
|
|
static inline void FreeSQLResult( media_library_t *p_ml, char **ppsz_result )
|
|
{
|
|
if( ppsz_result )
|
|
{
|
|
sql_Free( p_ml->p_sys->p_sql, ppsz_result );
|
|
}
|
|
}
|
|
|
|
#endif /* SQL_MEDIA_LIBRARY_H */
|
|
|