add db_type and db_parameters for specifying different backend databases

This commit is contained in:
Ron Pedde 2006-01-06 00:05:02 +00:00
parent 56502cee62
commit e0ce8f273f
5 changed files with 33 additions and 40 deletions

View File

@ -116,11 +116,9 @@ CONFIGELEMENT config_elements[] = {
{ 1,1,0,CONFIG_TYPE_INT,"port",(void*)&config.port,config_emit_int },
{ 1,1,0,CONFIG_TYPE_STRING,"admin_pw",(void*)&config.adminpassword,config_emit_string },
{ 1,1,0,CONFIG_TYPE_STRING,"mp3_dir",(void*)&config.mp3dir,config_emit_string },
#ifdef WITH_GDBM
{ 1,1,0,CONFIG_TYPE_STRING,"db_dir",(void*)&config.dbdir,config_emit_string },
#else
{ 1,0,0,CONFIG_TYPE_STRING,"db_dir",(void*)&config.dbdir,config_emit_string },
#endif
{ 1,0,0,CONFIG_TYPE_STRING,"db_type",(void*)&config.dbtype,config_emit_string },
{ 1,0,0,CONFIG_TYPE_STRING,"db_parms",(void*)&config.dbparms,config_emit_string },
{ 1,0,0,CONFIG_TYPE_INT,"debuglevel",(void*)&err_debuglevel,config_emit_int },
{ 1,1,0,CONFIG_TYPE_STRING,"servername",(void*)&config.servername,config_emit_string },
{ 1,0,0,CONFIG_TYPE_INT,"rescan_interval",(void*)&config.rescan_interval,config_emit_int },

View File

@ -39,7 +39,7 @@
typedef struct tag_stats {
time_t start_time; /**< When the server was started */
int songs_served; /**< How many songs have been served */
unsigned int gb_served; /**< How many gigs of data have been served (unused) */
unsigned int bytes_served; /**< How many bytes of data served (unused) */
} STATS;
@ -73,9 +73,11 @@ typedef struct tag_config {
char *artfilename; /**< What filename to merge coverart with */
char *logfile; /**< What file to use as a logfile */
char *compdirs; /**< Compilations directories */
char *dbtype; /**< db backend type */
char *dbparms; /**< parameters for the db backend */
char **complist; /**< list of compilation directories */
STATS stats; /**< Stats structure (see above) */
WSHANDLE server; /**< webserver handle */
WSHANDLE server; /**< webserver handle */
} CONFIG;
extern CONFIG config;

View File

@ -276,7 +276,8 @@ char *db_error_list[] = {
"No rows returned",
"Invalid playlist id: %d",
"Invalid song id: %d",
"Parse error"
"Parse error",
"No backend database support for type: %s"
};
/* Globals */
@ -406,34 +407,6 @@ void db_init_once(void) {
pthread_rwlock_init(&db_rwlock,NULL);
}
/**
* Set the database backend. This should show a friendly error about
* what databse types are supported.
*
* \param type what database backend to use (by friendly name)
*/
extern int db_set_backend(char *type) {
DPRINTF(E_DBG,L_DB,"Setting backend database to %s\n",type);
if(!db_functions[0].name) {
DPRINTF(E_FATAL,L_DB,"No database backends are available. Install sqlite!\n");
}
db_current=&db_functions[0];
while((db_current->name) && (strcasecmp(db_current->name,type))) {
db_current++;
}
if(!db_current->name) {
DPRINTF(E_WARN,L_DB,"Could not find db backend %s. Aborting.\n",type);
return -1;
}
DPRINTF(E_DBG,L_DB,"Backend database set\n");
return 0;
}
/**
* Open the database. This is done before we drop privs, that
* way if the database only has root perms, then it can still
@ -441,7 +414,7 @@ extern int db_set_backend(char *type) {
*
* \param parameters This is backend-specific (mysql, sqlite, etc)
*/
int db_open(char **pe, char *parameters) {
int db_open(char **pe, char *type, char *parameters) {
int result;
DPRINTF(E_DBG,L_DB,"Opening database\n");
@ -449,8 +422,22 @@ int db_open(char **pe, char *parameters) {
if(pthread_once(&db_initlock,db_init_once))
return -1;
db_current = &db_functions[0];
if(type) {
while((db_current->name) && (strcasecmp(db_current->name,type))) {
db_current++;
}
if(!db_current->name) {
/* end of list -- no match */
db_get_error(pe,DB_E_BADPROVIDER,type);
return DB_E_BADPROVIDER;
}
}
result=db_current->dbs_open(pe, parameters);
DPRINTF(E_DBG,L_DB,"Results: %d\n",result);
return result;
}

View File

@ -135,9 +135,7 @@ typedef struct tag_daap_items {
extern DAAP_ITEMS taglist[];
extern int db_set_backend(char *type);
extern int db_open(char **pe, char *parameters);
extern int db_open(char **pe, char *type, char *parameters);
extern int db_init(int reload);
extern int db_deinit(void);
@ -200,6 +198,7 @@ extern void db_dispose_playlist(M3UFILE *pm3u);
#define DB_E_INVALID_PLAYLIST 0x06 /**< bad playlist id */
#define DB_E_INVALID_SONGID 0x07 /**< bad song id */
#define DB_E_PARSE 0x08 /**< could not parse result */
#define DB_E_BADPROVIDER 0x09 /**< requested db backend not there */
/* describes the individual database handlers */
typedef struct tag_dbinfo {

View File

@ -360,6 +360,7 @@ int main(int argc, char *argv[]) {
int pid_fd;
FILE *pid_fp=NULL;
int err;
char *perr;
config.use_mdns=1;
@ -483,7 +484,13 @@ int main(int argc, char *argv[]) {
}
/* this will require that the db be readable by the runas user */
if(db_open(&perr,config.dbdir))
if(config.dbtype) {
err=db_open(&perr,config.dbtype,config.dbparms);
} else {
err=db_open(&perr,NULL,config.dbdir);
}
if(err)
DPRINTF(E_FATAL,L_MAIN|L_DB,"Error in db_open: %s\n",perr);
/* Initialize the database before starting */