Index: config.c =================================================================== RCS file: /usr/cvsroot/asterisk/config.c,v retrieving revision 1.69 diff -u -r1.69 config.c --- config.c 21 Jun 2005 19:09:35 -0000 1.69 +++ config.c 23 Jun 2005 21:47:51 -0000 @@ -795,6 +795,37 @@ return 0; } +char *get_config_map_table(char* name) +{ + struct ast_config_map *map = NULL; + + map = config_maps; + while(map != NULL) + { + if(!strcmp(map->name, name)) + return map->table; + + map = map->next; + } + return NULL; +} + +char *get_config_map_database(char* name) +{ + struct ast_config_map *map = NULL; + + map = config_maps; + while(map != NULL) + { + if(!strcmp(map->name, name)) + return map->database; + + map = map->next; + } + return NULL; +} + + void read_config_maps(void) { struct ast_config *config, *configtmp; Index: apps/app_voicemail.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_voicemail.c,v retrieving revision 1.218 diff -u -r1.218 app_voicemail.c --- apps/app_voicemail.c 23 Jun 2005 17:44:20 -0000 1.218 +++ apps/app_voicemail.c 23 Jun 2005 21:47:51 -0000 @@ -210,6 +210,7 @@ #ifdef USE_ODBC_STORAGE static char odbc_database[80]; +static char voicemail_messages[80]; #define RETRIEVE(a,b) retrieve_file(a,b) #define DISPOSE(a,b) remove_file(a,b) #define STORE(a,b) store_file(a,b) @@ -712,7 +713,7 @@ ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); goto yuck; } - snprintf(sql, sizeof(sql), "SELECT * FROM voicemessages WHERE dir=? AND msgnum=?"); + snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE dir=? AND msgnum=?", voicemail_messages); res = SQLPrepare(stmt, sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); @@ -846,7 +847,7 @@ ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); goto yuck; } - snprintf(sql, sizeof(sql), "SELECT COUNT(*) FROM voicemessages WHERE dir=?"); + snprintf(sql, sizeof(sql), "SELECT COUNT(*) FROM %s WHERE dir=?", voicemail_messages); res = SQLPrepare(stmt, sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); @@ -906,7 +907,7 @@ ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); goto yuck; } - snprintf(sql, sizeof(sql), "SELECT COUNT(*) FROM voicemessages WHERE dir=? AND msgnum=?"); + snprintf(sql, sizeof(sql), "SELECT COUNT(*) FROM %s WHERE dir=? AND msgnum=?", voicemail_messages); res = SQLPrepare(stmt, sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); @@ -970,7 +971,7 @@ ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); goto yuck; } - snprintf(sql, sizeof(sql), "DELETE FROM voicemessages WHERE dir=? AND msgnum=?"); + snprintf(sql, sizeof(sql), "DELETE FROM %s WHERE dir=? AND msgnum=?", voicemail_messages); res = SQLPrepare(stmt, sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); @@ -1018,7 +1019,7 @@ ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); goto yuck; } - snprintf(sql, sizeof(sql), "INSERT INTO voicemessages (dir, msgnum, context, macrocontext, callerid, origtime, duration, recording) SELECT ?,?,context,macrocontext,callerid,origtime,duration,recording FROM voicemessages WHERE dir=? AND msgnum=?"); + snprintf(sql, sizeof(sql), "INSERT INTO %s (dir, msgnum, context, macrocontext, callerid, origtime, duration, recording) SELECT ?,?,context,macrocontext,callerid,origtime,duration,recording FROM %s WHERE dir=? AND msgnum=?", voicemail_messages, voicemail_messages); res = SQLPrepare(stmt, sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); @@ -1119,9 +1120,9 @@ goto yuck; } if (!ast_strlen_zero(category)) - snprintf(sql, sizeof(sql), "INSERT INTO voicemessages (dir,msgnum,recording,context,macrocontext,callerid,origtime,duration,category) VALUES (?,?,?,?,?,?,?,?,?)"); + snprintf(sql, sizeof(sql), "INSERT INTO %s (dir,msgnum,recording,context,macrocontext,callerid,origtime,duration,category) VALUES (?,?,?,?,?,?,?,?,?)", voicemail_messages); else - snprintf(sql, sizeof(sql), "INSERT INTO voicemessages (dir,msgnum,recording,context,macrocontext,callerid,origtime,duration) VALUES (?,?,?,?,?,?,?,?)"); + snprintf(sql, sizeof(sql), "INSERT INTO %s (dir,msgnum,recording,context,macrocontext,callerid,origtime,duration) VALUES (?,?,?,?,?,?,?,?)", voicemail_messages); res = SQLPrepare(stmt, sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); @@ -1184,7 +1185,7 @@ ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); goto yuck; } - snprintf(sql, sizeof(sql), "UPDATE voicemessages SET dir=?, msgnum=? WHERE dir=? AND msgnum=?"); + snprintf(sql, sizeof(sql), "UPDATE %s SET dir=?, msgnum=? WHERE dir=? AND msgnum=?", voicemail_messages); res = SQLPrepare(stmt, sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); @@ -1807,6 +1808,120 @@ } } +#ifdef USE_ODBC_STORAGE +static int messagecount(const char *mailbox, int *newmsgs, int *oldmsgs) +{ + int x = 0; + int res; + SQLLEN rowcount=0; + SQLHSTMT stmt; + char sql[256]; + char rowdata[20]; + + + odbc_obj *obj; + obj = fetch_odbc_obj(odbc_database, 0); + if (obj) { + res = SQLAllocHandle(SQL_HANDLE_STMT, obj->con, &stmt); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); + goto yuck; + } + snprintf(sql, sizeof(sql), "SELECT COUNT(*) FROM %s WHERE dir like \"%%%s/INBOX\"%c", voicemail_messages, mailbox, '\0'); + res = SQLPrepare(stmt, sql, SQL_NTS); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + res = odbc_smart_execute(obj, stmt); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Execute error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + res = SQLRowCount(stmt, &rowcount); + if (((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) || (rowcount < 1)) { + ast_log(LOG_WARNING, "SQL Row Count error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + res = SQLFetch(stmt); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Fetch error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + res = SQLGetData(stmt, 1, SQL_CHAR, rowdata, sizeof(rowdata), NULL); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + *newmsgs = atoi(rowdata); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + + res = SQLAllocHandle(SQL_HANDLE_STMT, obj->con, &stmt); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); + goto yuck; + } + + snprintf(sql, sizeof(sql), "SELECT COUNT(*) FROM %s WHERE dir like \"%%%s/Old\"", voicemail_messages, mailbox); + res = SQLPrepare(stmt, sql, SQL_NTS); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + res = odbc_smart_execute(obj, stmt); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Execute error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + res = SQLRowCount(stmt, &rowcount); + if (((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) || (rowcount < 1)) { + ast_log(LOG_WARNING, "SQL Row Count error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + res = SQLFetch(stmt); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Fetch error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + res = SQLGetData(stmt, 1, SQL_CHAR, rowdata, sizeof(rowdata), NULL); + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + goto yuck; + } + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + *oldmsgs = atoi(rowdata); + x = 1; + } else + ast_log(LOG_WARNING, "Failed to obtain database object for '%s'!\n", odbc_database); + +yuck: + return x; +} + +static int has_voicemail(const char *mailbox, const char *folder) +{ + int newmsgs = 0; + int oldmsgs = 0; + + messagecount(mailbox, &newmsgs, &oldmsgs); + if(newmsgs > 0) + return 1; + + return 0; +} + +#else + static int has_voicemail(const char *mailbox, const char *folder) { DIR *dir; @@ -1854,6 +1969,7 @@ return 0; } + static int messagecount(const char *mailbox, int *newmsgs, int *oldmsgs) { DIR *dir; @@ -1925,6 +2041,8 @@ return 0; } +#endif + static int notify_new_message(struct ast_channel *chan, struct ast_vm_user *vmu, int msgnum, long duration, char *fmt, char *cidnum, char *cidname); static void copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int imbox, int msgnum, long duration, struct ast_vm_user *recip, char *fmt) @@ -5332,7 +5450,19 @@ ast_set2_flag((&globalflags), ast_true(astattach), VM_ATTACH); #ifdef USE_ODBC_STORAGE - strncpy(odbc_database, "asterisk", sizeof(odbc_database) - 1); + voicemail_messages[0] = '\0'; + odbc_database[0] = '\0'; + if(get_config_map_database("voicemail_messages")) + { + strncpy(odbc_database, get_config_map_database("voicemail_messages"), sizeof(odbc_database) - 1); + strncpy(voicemail_messages, get_config_map_table("voicemail_messages"), sizeof(voicemail_messages) -1); + } + else + { + ast_log(LOG_WARNING, "voicemail_messages not defined in extconfig.conf! Using defaults\n"); + strcpy(voicemail_messages, "voicemessages"); + strcpy(odbc_database, "asterisk"); + } if ((thresholdstr = ast_variable_retrieve(cfg, "general", "odbcstorage"))) { strncpy(odbc_database, thresholdstr, sizeof(odbc_database) - 1); } Index: include/asterisk/config.h =================================================================== RCS file: /usr/cvsroot/asterisk/include/asterisk/config.h,v retrieving revision 1.20 diff -u -r1.20 config.h --- include/asterisk/config.h 21 Apr 2005 06:02:44 -0000 1.20 +++ include/asterisk/config.h 23 Jun 2005 21:47:51 -0000 @@ -203,6 +203,9 @@ int config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator); +char *get_config_map_database(char* name); +char *get_config_map_table(char* name); + struct ast_config *ast_config_internal_load(const char *configfile, struct ast_config *cfg); #if defined(__cplusplus) || defined(c_plusplus)