[Freeswitch-branches] [commit] r3829 - freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr
Author: mishehu Date: Tue Dec 26 00:24:03 2006 New Revision: 3829 Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/sqlitecdr.cpp freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/sqlitecdr.h Log: Working on SqliteCDR, adding the ability of the logger to add and alter the tables as necessary. As of yet untested, even in compilation. Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/sqlitecdr.cpp ============================================================================== --- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/sqlitecdr.cpp (original) +++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/sqlitecdr.cpp Tue Dec 26 00:24:03 2006 @@ -73,6 +73,9 @@ switch_core_db_t* SqliteCDR::db = 0; switch_core_db_stmt_t* SqliteCDR::stmt=0; switch_core_db_stmt_t* SqliteCDR::stmt_chanvars=0; +switch_core_db_stmt_t* SqliteCDR::stmt_begin=0; +switch_core_db_stmt_t* SqliteCDR::stmt_commit=0; +std::string SqliteCDR::display_name = "SqliteCDR - The sqlite3 cdr logging backend"; void SqliteCDR::connect(switch_xml_t& cfg, switch_xml_t& xml, switch_xml_t& settings, switch_xml_t& param) { @@ -183,7 +186,7 @@ std::map<std::string,bool> temp_chanvars_map; // Now to copy out all the chanvars from the list into - std::hash<std::string,bool> temp_sql_tables; + std::map<std::string,bool> temp_sql_tables; temp_sql_tables["freeswitchcdr"] = 0; temp_sql_tables["chanvars"] = 0; @@ -201,8 +204,144 @@ if(!temp_sql_tables["freeswitchcdr"]) { + switch_console_printf(SWITCH_CHANNEL_LOG,"Creating the freeswitchcdr table in the SQLite mod_cdr database file.\n"); // Must create the missing freeswitchcdr table. + char sql_query_create_freeswitchcdr[] = "CREATE TABLE freeswitchcdr (\n" + "callid INTEGER AUTOINCREMENT PRIMARY KEY,\n" + "callstartdate INTEGER NOT NULL,\n" + "callanswerdate INTEGER NOT NULL,\n" + "calltransferdate INTEGER NOT NULL,\n" + "callenddate INTEGER NOT NULL,\n" + "originated INTEGER default 0,\n" + "clid TEXT default \"Freeswitch - Unknown\",\n" + "src TEXT NOT NULL,\n" + "dst TEXT NOT NULL,\n" + "ani TEXT default \"\",\n" + "aniii TEXT default \"\",\n" + "dialplan TEXT default \"\",\n" + "myuuid TEXT NOT NULL,\n" + "destuuid TEXT NOT NULL,\n" + "srcchannel TEXT NOT NULL,\n" + "dstchannel TEXT NOT NULL,\n" + "lastapp TEXT default \"\",\n" + "lastdata TEXT default \"\",\n" + "billusec INTEGER default 0,\n" + "disposition INTEGER default 0,\n" /* 0 = Busy or Unanswered, 1 = Answered */ + "hangupcause INTEGER default 0\n", + "amaflags INTEGER default 0\n" + ");\n"; + + switch_core_db_exec(db, sql_query_create_freeswitchcdr, NULL, NULL, NULL); + } + + if(!temp_sql_tables["chanvars"]) + { + switch_console_printf(SWITCH_CHANNEL_LOG,"Creating the chanvars table in the SQLite mod_cdr database file.\n"); + // Must create the missing chanvars table. + sql_query_create_chanvars[] = "CREATE TABLE chanvars (\n" + "callid INTEGER default 0,\n"" + "varname TEXT NOT NULL,\n" + "varvalue TEXT default \"\"\n" + ");\n"; + + switch_core_db_exec(db, sql_query_create_chanvars, NULL, NULL, NULL); + } + + if(chanvars_fixed_list.size() > 0) + { + // Now to check if the freeswitchcdr schema matches + std::map<std::string,std::string> freeswitchcdr_columns; + char sql_query_get_schema_of_freeswitchcdr[] = "SELECT * FROM SQLITE_MASTER WHERE name=\"freeswitchcdr\""; + char **result2; + nrow = 0; + ncol = 0; + char *errormessage2; + sql_rc = switch_core_db_get_table(db,sql_query_get_schema_of_freeswitchcdr,&result,&nrow,&ncol,&errormessage); + + if(sql_rc == SQLITE_OK) + for(int i = 0; i < nrows; i++) + { + std::string resultstring = result2[i][4]; + std::string::size_type j = resultstring.find('(',i); + + std::string tempstring1,tempstring2; + + for(std::string::size_type i = j+1 ; j != std::string::npos; ) + { + j = resultstring.find(' ',i); + if(j > 0) + { + tempstring = resultstring.substr(i,(j-i)); + i = j+1; + j =resultstring.find(',',i); + if(j == std::string::npos) + tempstring2 = resultstring.substr(i,(resultstring.size() - i)); + else + tempstring2 = resultstring.substr(i,(j-i)); + + freeswitchcdr_columns[tempstring1] = tempstring2; + } + else + switch_console_printf(SWITCH_CHANNEL_LOG,"There has been a parsing problem with the freeswitchcdr schema.\n"); + } + } + // Now to actually compare what we have in the config against the db schema + std::map<std::string,std::string> freeswitchcdr_add_columns; + std::list<std::string>::iterator iItr, iEnd; + switch_size_t i = 0; + for(iItr = chanvars_fixed_list.begin(), iEnd = chanvars_fixed_list.end(); iItr != iEnd; iItr++, i++) + { + switch(chanvars_fixed_types[i]) + { + case CDR_INTEGER: + case CDR_TINY: + if(freeswitchcdr_columns.find(*iItr) != freeswitchcdr_columns.end()) + { + if(freeswitchcdr_columns[*iItr] != "INTEGER") + switch_console_printf(SWITCH_CHANNEL_LOG,"WARNING: SqliteCDR freeswitchcdr table column type mismatch: Column \"%s\" is not of an INTEGER type. This is not necessarily fatal, but may result in unexpected behavior.\n",iItr->c_str()); + } + else + freeswitchcdr_add_columns[*iItr] = "INTEGER"; + break; + case CDR_DOUBLE: + if(freeswitchcdr_columns.find(*iItr) != freeswitchcdr_columns.end()) + { + if(freeswitchcdr_columns[*iItr] != "REAL") + switch_console_printf(SWITCH_CHANNEL_LOG,"WARNING: SqliteCDR freeswitchcdr table column type mismatch: Column \"%s\" is not of a REAL type. This is not necessarily fatal, but may result in unexpected behavior.\n",iItr->c_str()); + } + else + freeswitchcdr_add_columns[*iItr] = "REAL"; + break; + case CDR_DECIMAL: + case CDR_STRING: + if(freeswitchcdr_columns.find(*iItr) != freeswitchcdr_columns.end()) + { + if(freeswitchcdr_columns[*iItr] != "TEXT") + switch_console_printf(SWITCH_CHANNEL_LOG,"WARNING: SqliteCDR freeswitchcdr table column type mismatch: Column \"%s\" is not of a TEXT type. This is not necessarily fatal, but may result in unexpected behavior.\n",iItr->c_str()); + } + else + freeswitchcdr_add_columns[*iItr] = "TEXT"; + break; + default: + switch_console_printf("Oh bother, I should not have fallen into this hole in the switch/case statement. Please notify the author.\n"); + } + } + + if(freeswitchcdr_add_columns.size()) + { + switch_console_printf(SWITCH_CHANNEL_LOG,"Updating the freeswitchcdr table schema.\n"); + std::string tempsql_freeswitchcdr_alter_table = "ALTER TABLE freeswithcdr ADD "; + std::map<std::string, std::string>::iterator iItr, iEnd; + for(iItr = freeswitchcdr_add_columns.begin(), iEnd = freeswitchcdr_add_columns.end(); iItr != iEnd; iItr++) + { + std::string sql_query_freeswitchcdr_alter_table = tempsql_freeswitchcdr_alter_table; + sql_query_freeswitchcdr_alter_table.append(iItr->first); + sql_query_freeswitchcdr_alter_table.append(" "); + sql_query_freeswitchcdr_alter_table.append(iItr->second); + switch_core_db_exec(db, sql_query_freeswitchcdr_alter_table.c_str(), NULL, NULL, NULL); + } + } } } } @@ -462,6 +601,8 @@ void SqliteCDR::disconnect() { + switch_core_db_finalize(stmt_chanvars); + switch_core_db_finalize(stmt); switch_core_db_close(db); activated = 0; logchanvars = 0; Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/sqlitecdr.h ============================================================================== --- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/sqlitecdr.h (original) +++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/sqlitecdr.h Tue Dec 26 00:24:03 2006 @@ -51,6 +51,7 @@ virtual bool is_activated(); virtual void tempdump_record(); virtual void reread_tempdumped_records(); + virtual std::string get_display_name(); private: static bool activated; @@ -61,12 +62,15 @@ static switch_core_db *db; static switch_core_db_stmt_t *stmt; static switch_core_db_stmt_t *stmt_chanvars; + static switch_core_db_stmt_t *stmt_begin; + static switch_core_db_stmt_t *stmt_commit; static bool connectionstate; static bool logchanvars; static std::list<std::string> chanvars_fixed_list; static std::vector<switch_mod_cdr_sql_types_t> chanvars_fixed_types; static std::list<std::string> chanvars_supp_list; // The supplemental list static bool repeat_fixed_in_supp; + static std::string display_name; }; #endif
participants (1)
-
Freeswitch SVN