dect
/
asterisk
Archived
13
0
Fork 0

Merge changes from team/russell/sqlite:

* Add new module, cdr_sqlite3_custom which allows logging custom CDRs into a
  SQLite3 database.  (issue #7149, alerios)
* Add new module, res_config_sqlite, which adds realtime database configuration
  support for SQLite version 2.  I decided that this was ok since we didn't have
  any realtime support for version 3.  If someone ports this to version 3, then
  version 2 support can be removed or marked deprecated.
  (issue #7790, rbarun_proformatique)
* Mark cdr_sqlite as deprecated in favor of cdr_sqlite3_custom.

Also, note that there were other modules on the bug tracker that did not make
the cut because they provided some duplicated functionality.  Those are:

* cdr_sqlite3 (issue #6754, moy)
* cdr_sqlite3 (issue #8694, bsd)


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@58866 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
russell 2007-03-13 21:22:33 +00:00
parent e6cf30c5ae
commit 607988f17b
14 changed files with 2245 additions and 6 deletions

View File

@ -66,6 +66,8 @@ Miscellaneous
* Added the parkedcallreparking option to features.conf
* SMDI is now enabled in voicemail using the smdienable option.
* Added zap show version CLI command to chan_zap.
* Added a new CDR module, cdr_sqlite3_custom.
* Added a new realtime configuration module, res_config_sqlite
AMI - The manager (TCP/TLS/HTTP)
--------------------------------

View File

@ -36,3 +36,9 @@ Applications:
performs mostly a 'ChanExists' sort of function.
* SetCallerPres() has been replaced with the CALLERPRES() dialplan function
and is now deprecated.
CDR:
* The cdr_sqlite module has been marked as deprecated in favor of
cdr_sqlite3_custom. It will potentially be removed from the tree
after Asterisk 1.6 is released.

View File

@ -23,6 +23,7 @@ QT=@PBX_QT@
RADIUS=@PBX_RADIUS@
SPEEX=@PBX_SPEEX@
SQLITE=@PBX_SQLITE@
SQLITE3=@PBX_SQLITE3@
SSL=@PBX_OPENSSL@
TONEZONE=@PBX_TONEZONE@
UNIXODBC=@PBX_UNIXODBC@

View File

@ -30,6 +30,8 @@
*
* Creates the database and table on-the-fly
* \ingroup cdr_drivers
*
* \note This module has been marked deprecated in favor for cdr_sqlite3_custom
*/
/*** MODULEINFO
@ -180,6 +182,9 @@ static int load_module(void)
char fn[PATH_MAX];
int res;
ast_log(LOG_WARNING, "This module has been marked deprecated in favor of "
"using cdr_sqlite3_custom. (May be removed after Asterisk 1.6)\n");
/* is the database there? */
snprintf(fn, sizeof(fn), "%s/cdr.db", ast_config_AST_LOG_DIR);
db = sqlite_open(fn, AST_FILE_MODE, &zErr);

264
cdr/cdr_sqlite3_custom.c Normal file
View File

@ -0,0 +1,264 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2007, Digium, Inc.
*
* Mark Spencer <markster@digium.com> and others.
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief Custom SQLite3 CDR records.
*
* \author Adapted by Alejandro Rios <alejandro.rios@avatar.com.co> and
* Russell Bryant <russell@digium.com> from
* cdr_mysql_custom by Edward Eastman <ed@dm3.co.uk>,
* and cdr_sqlite by Holger Schurig <hs4233@mail.mn-solutions.de>
*
*
* \arg See also \ref AstCDR
*
*
* \ingroup cdr_drivers
*/
/*** MODULEINFO
<depend>sqlite3</depend>
***/
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sqlite3.h>
#include "asterisk/channel.h"
#include "asterisk/cdr.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/pbx.h"
#include "asterisk/logger.h"
#include "asterisk/utils.h"
#include "asterisk/cli.h"
#include "asterisk/options.h"
AST_MUTEX_DEFINE_STATIC(lock);
static const char config_file[] = "cdr_sqlite3_custom.conf";
static char *desc = "Customizable SQLite3 CDR Backend";
static char *name = "cdr_sqlite3_custom";
static sqlite3 *db = NULL;
static char table[80];
static char columns[1024];
static char values[1024];
static int load_config(int reload)
{
struct ast_config *cfg;
struct ast_variable *mappingvar;
const char *tmp;
if (!(cfg = ast_config_load(config_file))) {
if (reload)
ast_log(LOG_WARNING, "%s: Failed to reload configuration file.\n", name);
else {
ast_log(LOG_WARNING,
"%s: Failed to load configuration file. Module not activated.\n",
name);
}
return -1;
}
if (!reload)
ast_mutex_lock(&lock);
if (!(mappingvar = ast_variable_browse(cfg, "master"))) {
/* nothing configured */
ast_config_destroy(cfg);
return 0;
}
/* Mapping must have a table name */
tmp = ast_variable_retrieve(cfg, "master", "table");
if (!ast_strlen_zero(tmp))
ast_copy_string(table, tmp, sizeof(table));
else {
ast_log(LOG_WARNING, "%s: Table name not specified. Assuming cdr.\n", name);
strcpy(table, "cdr");
}
tmp = ast_variable_retrieve(cfg, "master", "columns");
if (!ast_strlen_zero(tmp))
ast_copy_string(columns, tmp, sizeof(columns));
else {
ast_log(LOG_WARNING, "%s: Column names not specified. Module not loaded.\n",
name);
ast_config_destroy(cfg);
return -1;
}
tmp = ast_variable_retrieve(cfg, "master", "values");
if (!ast_strlen_zero(tmp))
ast_copy_string(values, tmp, sizeof(values));
else {
ast_log(LOG_WARNING, "%s: Values not specified. Module not loaded.\n", name);
ast_config_destroy(cfg);
return -1;
}
if (!reload)
ast_mutex_unlock(&lock);
ast_config_destroy(cfg);
return 0;
}
/* assumues 'to' buffer is at least strlen(from) * 2 + 1 bytes */
static int do_escape(char *to, const char *from)
{
char *out = to;
for (; *from; from++) {
if (*from == '\'' || *from == '\\')
*out++ = *from;
*out++ = *from;
}
*out = '\0';
return 0;
}
static int sqlite3_log(struct ast_cdr *cdr)
{
int res = 0;
char *zErr = 0;
char *sql_cmd;
struct ast_channel dummy = { 0, };
int count;
{ /* Make it obvious that only sql_cmd should be used outside of this block */
char *sql_tmp_cmd;
char sql_insert_cmd[2048] = "";
sql_tmp_cmd = sqlite3_mprintf("INSERT INTO %q (%q) VALUES (%q)", table, columns, values);
dummy.cdr = cdr;
pbx_substitute_variables_helper(&dummy, sql_tmp_cmd, sql_insert_cmd, sizeof(sql_insert_cmd) - 1);
sqlite3_free(sql_tmp_cmd);
sql_cmd = alloca(strlen(sql_insert_cmd) * 2 + 1);
do_escape(sql_cmd, sql_insert_cmd);
}
ast_mutex_lock(&lock);
for (count = 0; count < 5; count++) {
res = sqlite3_exec(db, sql_cmd, NULL, NULL, &zErr);
if (res != SQLITE_BUSY && res != SQLITE_LOCKED)
break;
usleep(200);
}
if (zErr) {
ast_log(LOG_ERROR, "%s: %s. sentence: %s.\n", name, zErr, sql_cmd);
sqlite3_free(zErr);
}
ast_mutex_unlock(&lock);
return res;
}
static int unload_module(void)
{
if (db)
sqlite3_close(db);
ast_cdr_unregister(name);
return 0;
}
static int load_module(void)
{
char *zErr;
char fn[PATH_MAX];
int res;
char *sql_cmd;
if (!load_config(0)) {
res = ast_cdr_register(name, desc, sqlite3_log);
if (res) {
ast_log(LOG_ERROR, "%s: Unable to register custom SQLite3 CDR handling\n", name);
return AST_MODULE_LOAD_DECLINE;
}
}
/* is the database there? */
snprintf(fn, sizeof(fn), "%s/master.db", ast_config_AST_LOG_DIR);
res = sqlite3_open(fn, &db);
if (!db) {
ast_log(LOG_ERROR, "%s: Could not open database %s.\n", name, fn);
sqlite3_free(zErr);
return AST_MODULE_LOAD_DECLINE;
}
/* is the table there? */
sql_cmd = sqlite3_mprintf("SELECT COUNT(AcctId) FROM %q;", table);
res = sqlite3_exec(db, sql_cmd, NULL, NULL, NULL);
sqlite3_free(sql_cmd);
if (res) {
sql_cmd = sqlite3_mprintf("CREATE TABLE %q (AcctId INTEGER PRIMARY KEY,%q)", table, columns);
res = sqlite3_exec(db, sql_cmd, NULL, NULL, &zErr);
sqlite3_free(sql_cmd);
if (zErr) {
ast_log(LOG_WARNING, "%s: %s.\n", name, zErr);
sqlite3_free(zErr);
return 0;
}
if (res) {
ast_log(LOG_ERROR, "%s: Unable to create table '%s': %s.\n", name, table, zErr);
sqlite3_free(zErr);
if (db)
sqlite3_close(db);
return AST_MODULE_LOAD_DECLINE;
}
}
return 0;
}
static int reload(void)
{
int res;
ast_mutex_lock(&lock);
res = load_config(1);
ast_mutex_unlock(&lock);
return res;
}
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "SQLite3 Custom CDR Module",
.load = load_module,
.unload = unload_module,
.reload = reload,
);

View File

@ -0,0 +1,7 @@
;
; Mappings for custom config file
;
[master] ; currently, only file "master.db" is supported, with only one table at a time.
table => cdr
columns => calldate, clid, dcontext, channel, dstchannel, lastapp, lastdata, duration, billsec, disposition, amaflags, accountcode, uniqueid, userfield, test
values => '${CDR(start)}','${CDR(clid)}','${CDR(dcontext)}','${CDR(channel)}','${CDR(dstchannel)}','${CDR(lastapp)}','${CDR(lastdata)}','${CDR(duration)}','${CDR(billsec)}','${CDR(disposition)}','${CDR(amaflags)}','${CDR(accountcode)}','${CDR(uniqueid)}','${CDR(userfield)}','${CDR(test)}'

View File

@ -18,6 +18,7 @@
;uncomment to load queues.conf via the odbc engine.
;
;queues.conf => odbc,asterisk,ast_config
;extensions.conf => sqlite,asterisk,ast_config
;
; The following files CANNOT be loaded from Realtime storage:
; asterisk.conf
@ -42,6 +43,12 @@
;example => odbc,asterisk,alttable
;example2 => ldap,"dc=oxymium,dc=net",example2
;
; "odbc" is shown in the examples below, but is not the only valid realtime
; engine. There is:
; odbc ... res_config_odbc
; sqlite ... res_config_sqlite
; pgsql ... res_config_pgsql
;
;iaxusers => odbc,asterisk
;iaxpeers => odbc,asterisk
;sipusers => odbc,asterisk

View File

@ -0,0 +1,15 @@
[general]
; The database file.
dbfile => /var/lib/asterisk/sqlite.db
; Both config_table and cdr_table are optional. If config_table is omitted,
; you must specify it in extconfig.conf. If it is both provided here and in
; extconfig.conf, the value given here is used. If cdr_table is omitted, CDR
; support is simply disabled.
config_table => ast_config
cdr_table => ast_cdr
; This parameter controls the registration of the SQLITE() Dialplan application.
app_enable => yes

504
configure vendored
View File

@ -1,5 +1,5 @@
#! /bin/sh
# From configure.ac Revision: 57557 .
# From configure.ac Revision: 58858 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.60.
#
@ -819,6 +819,10 @@ SQLITE_LIB
SQLITE_INCLUDE
SQLITE_DIR
PBX_SQLITE
SQLITE3_LIB
SQLITE3_INCLUDE
SQLITE3_DIR
PBX_SQLITE3
SUPPSERV_LIB
SUPPSERV_INCLUDE
SUPPSERV_DIR
@ -1520,6 +1524,7 @@ Optional Packages:
--with-radius=PATH use Radius Client files in PATH
--with-speex=PATH use Speex files in PATH
--with-sqlite=PATH use SQLite files in PATH
--with-sqlite3=PATH use SQLite files in PATH
--with-suppserv=PATH use mISDN Supplemental Services files in PATH
--with-ssl=PATH use OpenSSL files in PATH
--with-tds=PATH use FreeTDS files in PATH
@ -8820,6 +8825,34 @@ PBX_SQLITE=0
SQLITE3_DESCRIP="SQLite"
SQLITE3_OPTION="sqlite3"
# Check whether --with-sqlite3 was given.
if test "${with_sqlite3+set}" = set; then
withval=$with_sqlite3;
case ${withval} in
n|no)
USE_SQLITE3=no
;;
y|ye|yes)
ac_mandatory_list="${ac_mandatory_list} SQLITE3"
;;
*)
SQLITE3_DIR="${withval}"
ac_mandatory_list="${ac_mandatory_list} SQLITE3"
;;
esac
fi
PBX_SQLITE3=0
SUPPSERV_DESCRIP="mISDN Supplemental Services"
SUPPSERV_OPTION="suppserv"
@ -32007,6 +32040,461 @@ fi
if test "x${PBX_SQLITE3}" != "x1" -a "${USE_SQLITE3}" != "no"; then
pbxlibdir=""
if test "x${SQLITE3_DIR}" != "x"; then
if test -d ${SQLITE3_DIR}/lib; then
pbxlibdir="-L${SQLITE3_DIR}/lib"
else
pbxlibdir="-L${SQLITE3_DIR}"
fi
fi
pbxfuncname="sqlite3_open"
if test "x${pbxfuncname}" = "x" ; then # empty lib, assume only headers
AST_SQLITE3_FOUND=yes
else
as_ac_Lib=`echo "ac_cv_lib_sqlite3_${pbxfuncname}" | $as_tr_sh`
{ echo "$as_me:$LINENO: checking for ${pbxfuncname} in -lsqlite3" >&5
echo $ECHO_N "checking for ${pbxfuncname} in -lsqlite3... $ECHO_C" >&6; }
if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsqlite3 ${pbxlibdir} $LIBS"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char ${pbxfuncname} ();
int
main ()
{
return ${pbxfuncname} ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_try") 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_try") 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Lib=yes"
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
eval "$as_ac_Lib=no"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
ac_res=`eval echo '${'$as_ac_Lib'}'`
{ echo "$as_me:$LINENO: result: $ac_res" >&5
echo "${ECHO_T}$ac_res" >&6; }
if test `eval echo '${'$as_ac_Lib'}'` = yes; then
AST_SQLITE3_FOUND=yes
else
AST_SQLITE3_FOUND=no
fi
fi
if test "${AST_SQLITE3_FOUND}" = "yes"; then
SQLITE3_LIB="-lsqlite3 "
SQLITE3_HEADER_FOUND="1"
if test "x${SQLITE3_DIR}" != "x"; then
SQLITE3_LIB="${pbxlibdir} ${SQLITE3_LIB}"
SQLITE3_INCLUDE="-I${SQLITE3_DIR}/include"
saved_cppflags="${CPPFLAGS}"
CPPFLAGS="${CPPFLAGS} -I${SQLITE3_DIR}/include"
if test "xsqlite3.h" != "x" ; then
as_ac_Header=`echo "ac_cv_header_${SQLITE3_DIR}/include/sqlite3.h" | $as_tr_sh`
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
{ echo "$as_me:$LINENO: checking for ${SQLITE3_DIR}/include/sqlite3.h" >&5
echo $ECHO_N "checking for ${SQLITE3_DIR}/include/sqlite3.h... $ECHO_C" >&6; }
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
ac_res=`eval echo '${'$as_ac_Header'}'`
{ echo "$as_me:$LINENO: result: $ac_res" >&5
echo "${ECHO_T}$ac_res" >&6; }
else
# Is the header compilable?
{ echo "$as_me:$LINENO: checking ${SQLITE3_DIR}/include/sqlite3.h usability" >&5
echo $ECHO_N "checking ${SQLITE3_DIR}/include/sqlite3.h usability... $ECHO_C" >&6; }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <${SQLITE3_DIR}/include/sqlite3.h>
_ACEOF
rm -f conftest.$ac_objext
if { (ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_compile") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_try") 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_try") 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6; }
# Is the header present?
{ echo "$as_me:$LINENO: checking ${SQLITE3_DIR}/include/sqlite3.h presence" >&5
echo $ECHO_N "checking ${SQLITE3_DIR}/include/sqlite3.h presence... $ECHO_C" >&6; }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <${SQLITE3_DIR}/include/sqlite3.h>
_ACEOF
if { (ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6; }
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: present but cannot be compiled" >&5
echo "$as_me: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: see the Autoconf documentation" >&5
echo "$as_me: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: ${SQLITE3_DIR}/include/sqlite3.h: in the future, the compiler will take precedence" >&2;}
;;
esac
{ echo "$as_me:$LINENO: checking for ${SQLITE3_DIR}/include/sqlite3.h" >&5
echo $ECHO_N "checking for ${SQLITE3_DIR}/include/sqlite3.h... $ECHO_C" >&6; }
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
eval "$as_ac_Header=\$ac_header_preproc"
fi
ac_res=`eval echo '${'$as_ac_Header'}'`
{ echo "$as_me:$LINENO: result: $ac_res" >&5
echo "${ECHO_T}$ac_res" >&6; }
fi
if test `eval echo '${'$as_ac_Header'}'` = yes; then
SQLITE3_HEADER_FOUND=1
else
SQLITE3_HEADER_FOUND=0
fi
fi
CPPFLAGS="${saved_cppflags}"
else
if test "xsqlite3.h" != "x" ; then
if test "${ac_cv_header_sqlite3_h+set}" = set; then
{ echo "$as_me:$LINENO: checking for sqlite3.h" >&5
echo $ECHO_N "checking for sqlite3.h... $ECHO_C" >&6; }
if test "${ac_cv_header_sqlite3_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
{ echo "$as_me:$LINENO: result: $ac_cv_header_sqlite3_h" >&5
echo "${ECHO_T}$ac_cv_header_sqlite3_h" >&6; }
else
# Is the header compilable?
{ echo "$as_me:$LINENO: checking sqlite3.h usability" >&5
echo $ECHO_N "checking sqlite3.h usability... $ECHO_C" >&6; }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <sqlite3.h>
_ACEOF
rm -f conftest.$ac_objext
if { (ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_compile") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_try") 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_try") 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6; }
# Is the header present?
{ echo "$as_me:$LINENO: checking sqlite3.h presence" >&5
echo $ECHO_N "checking sqlite3.h presence... $ECHO_C" >&6; }
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <sqlite3.h>
_ACEOF
if { (ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6; }
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: sqlite3.h: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: sqlite3.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: sqlite3.h: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: sqlite3.h: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: sqlite3.h: present but cannot be compiled" >&5
echo "$as_me: WARNING: sqlite3.h: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: sqlite3.h: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: sqlite3.h: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: sqlite3.h: see the Autoconf documentation" >&5
echo "$as_me: WARNING: sqlite3.h: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: sqlite3.h: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: sqlite3.h: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: sqlite3.h: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: sqlite3.h: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: sqlite3.h: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: sqlite3.h: in the future, the compiler will take precedence" >&2;}
;;
esac
{ echo "$as_me:$LINENO: checking for sqlite3.h" >&5
echo $ECHO_N "checking for sqlite3.h... $ECHO_C" >&6; }
if test "${ac_cv_header_sqlite3_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_cv_header_sqlite3_h=$ac_header_preproc
fi
{ echo "$as_me:$LINENO: result: $ac_cv_header_sqlite3_h" >&5
echo "${ECHO_T}$ac_cv_header_sqlite3_h" >&6; }
fi
if test $ac_cv_header_sqlite3_h = yes; then
SQLITE3_HEADER_FOUND=1
else
SQLITE3_HEADER_FOUND=0
fi
fi
fi
if test "x${SQLITE3_HEADER_FOUND}" = "x0" ; then
SQLITE3_LIB=""
SQLITE3_INCLUDE=""
else
if test "x${pbxfuncname}" = "x" ; then # only checking headers -> no library
SQLITE3_LIB=""
fi
PBX_SQLITE3=1
# XXX don't know how to evaluate the description (third argument) in AC_DEFINE_UNQUOTED
cat >>confdefs.h <<_ACEOF
#define HAVE_SQLITE3 1
_ACEOF
cat >>confdefs.h <<_ACEOF
#define HAVE_SQLITE3_VERSION
_ACEOF
fi
fi
fi
if test "x${PBX_OPENSSL}" != "x1" -a "${USE_OPENSSL}" != "no"; then
pbxlibdir=""
if test "x${OPENSSL_DIR}" != "x"; then
@ -39371,6 +39859,10 @@ SQLITE_LIB!$SQLITE_LIB$ac_delim
SQLITE_INCLUDE!$SQLITE_INCLUDE$ac_delim
SQLITE_DIR!$SQLITE_DIR$ac_delim
PBX_SQLITE!$PBX_SQLITE$ac_delim
SQLITE3_LIB!$SQLITE3_LIB$ac_delim
SQLITE3_INCLUDE!$SQLITE3_INCLUDE$ac_delim
SQLITE3_DIR!$SQLITE3_DIR$ac_delim
PBX_SQLITE3!$PBX_SQLITE3$ac_delim
SUPPSERV_LIB!$SUPPSERV_LIB$ac_delim
SUPPSERV_INCLUDE!$SUPPSERV_INCLUDE$ac_delim
SUPPSERV_DIR!$SUPPSERV_DIR$ac_delim
@ -39441,10 +39933,6 @@ OPENH323_SUFFIX!$OPENH323_SUFFIX$ac_delim
OPENH323_BUILD!$OPENH323_BUILD$ac_delim
QTMOC!$QTMOC$ac_delim
EDITLINE_LIB!$EDITLINE_LIB$ac_delim
PBX_H323!$PBX_H323$ac_delim
PBX_IXJUSER!$PBX_IXJUSER$ac_delim
GTKCONFIG!$GTKCONFIG$ac_delim
PBX_GTK!$PBX_GTK$ac_delim
_ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@ -39486,13 +39974,17 @@ _ACEOF
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
cat >conf$$subs.sed <<_ACEOF
PBX_H323!$PBX_H323$ac_delim
PBX_IXJUSER!$PBX_IXJUSER$ac_delim
GTKCONFIG!$GTKCONFIG$ac_delim
PBX_GTK!$PBX_GTK$ac_delim
GTK_INCLUDE!$GTK_INCLUDE$ac_delim
GTK_LIB!$GTK_LIB$ac_delim
CURL_CONFIG!$CURL_CONFIG$ac_delim
LTLIBOBJS!$LTLIBOBJS$ac_delim
_ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 4; then
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 8; then
break
elif $ac_last_try; then
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5

View File

@ -210,6 +210,7 @@ AST_EXT_LIB_SETUP([QT], [Qt], [qt])
AST_EXT_LIB_SETUP([RADIUS], [Radius Client], [radius])
AST_EXT_LIB_SETUP([SPEEX], [Speex], [speex])
AST_EXT_LIB_SETUP([SQLITE], [SQLite], [sqlite])
AST_EXT_LIB_SETUP([SQLITE3], [SQLite], [sqlite3])
AST_EXT_LIB_SETUP([SUPPSERV], [mISDN Supplemental Services], [suppserv])
AST_EXT_LIB_SETUP([OPENSSL], [OpenSSL], [ssl])
AST_EXT_LIB_SETUP([FREETDS], [FreeTDS], [tds])
@ -832,6 +833,8 @@ AST_EXT_LIB_CHECK([SPEEX], [speex], [speex_encode], [speex/speex.h], [-lm])
AST_EXT_LIB_CHECK([SQLITE], [sqlite], [sqlite_exec], [sqlite.h])
AST_EXT_LIB_CHECK([SQLITE3], [sqlite3], [sqlite3_open], [sqlite3.h])
AST_EXT_LIB_CHECK([OPENSSL], [ssl], [ssl2_connect], [openssl/ssl.h], [-lcrypto])
AST_EXT_LIB_CHECK([FREETDS], [tds], [tds_version], [tds.h])

117
doc/res_config_sqlite.txt Normal file
View File

@ -0,0 +1,117 @@
/*
* res_sqlite - SQLite 2 support for Asterisk
*
* This module can be used as a static/RealTime configuration module, and a CDR
* handler. See the Doxygen documentation for a detailed description of the
* module, and the configs/ directory for the sample configuration file.
*/
/*
* Tables for res_config_sqlite.so.
*/
/*
* RealTime static table.
*/
CREATE TABLE ast_config
(
id INTEGER PRIMARY KEY,
commented INT(11) NOT NULL DEFAULT '0',
filename VARCHAR(128) NOT NULL,
category VARCHAR(128) NOT NULL,
var_name VARCHAR(128) NOT NULL,
var_val VARCHAR(128) NOT NULL
);
CREATE INDEX ast_config_filename_commented ON ast_config(filename, commented);
/*
* CDR table (this table is automatically created if non existent).
*
* CREATE TABLE ast_cdr
* (
* id INTEGER PRIMARY KEY,
* clid VARCHAR(80) NOT NULL DEFAULT '',
* src VARCHAR(80) NOT NULL DEFAULT '',
* dst VARCHAR(80) NOT NULL DEFAULT '',
* dcontext VARCHAR(80) NOT NULL DEFAULT '',
* channel VARCHAR(80) NOT NULL DEFAULT '',
* dstchannel VARCHAR(80) NOT NULL DEFAULT '',
* lastapp VARCHAR(80) NOT NULL DEFAULT '',
* lastdata VARCHAR(80) NOT NULL DEFAULT '',
* start CHAR(19) NOT NULL DEFAULT '0000-00-00 00:00:00',
* answer CHAR(19) NOT NULL DEFAULT '0000-00-00 00:00:00',
* end CHAR(19) NOT NULL DEFAULT '0000-00-00 00:00:00',
* duration INT(11) NOT NULL DEFAULT '0',
* billsec INT(11) NOT NULL DEFAULT '0',
* disposition INT(11) NOT NULL DEFAULT '0',
* amaflags INT(11) NOT NULL DEFAULT '0',
* accountcode VARCHAR(20) NOT NULL DEFAULT '',
* uniqueid VARCHAR(32) NOT NULL DEFAULT '',
* userfield VARCHAR(255) NOT NULL DEFAULT ''
* );
*/
/*
* SIP RealTime table.
*/
CREATE TABLE ast_sip
(
id INTEGER PRIMARY KEY,
commented INT(11) NOT NULL DEFAULT '0',
name VARCHAR(80) NOT NULL,
accountcode VARCHAR(20),
amaflags VARCHAR(13),
callgroup VARCHAR(10),
callerid VARCHAR(80),
canreinvite CHAR(3),
context VARCHAR(80),
defaultip VARCHAR(15),
dtmfmode VARCHAR(7),
fromuser VARCHAR(80),
fromdomain VARCHAR(80),
fullcontact VARCHAR(80),
host VARCHAR(31) NOT NULL,
insecure VARCHAR(4),
language CHAR(2),
mailbox VARCHAR(50),
md5secret VARCHAR(80),
nat VARCHAR(5) NOT NULL DEFAULT 'no',
deny VARCHAR(95),
permit VARCHAR(95),
mask VARCHAR(95),
pickupgroup VARCHAR(10),
port VARCHAR(5) NOT NULL,
qualify CHAR(3),
restrictcid CHAR(1),
rtptimeout CHAR(3),
rtpholdtimeout CHAR(3),
secret VARCHAR(80),
type VARCHAR(6) NOT NULL DEFAULT 'friend',
username VARCHAR(80) NOT NULL,
disallow VARCHAR(100),
allow VARCHAR(100),
musiconhold VARCHAR(100),
regseconds INT(11) NOT NULL DEFAULT '0',
ipaddr VARCHAR(15) NOT NULL,
regexten VARCHAR(80) NOT NULL,
cancallforward CHAR(3),
setvar VARCHAR(100) NOT NULL
);
CREATE UNIQUE INDEX ast_sip_name ON ast_sip(name);
/*
* Dialplan RealTime table.
*/
CREATE TABLE ast_exten
(
id INTEGER PRIMARY KEY,
commented INT(11) NOT NULL DEFAULT '0',
context VARCHAR(20) NOT NULL,
exten VARCHAR(20) NOT NULL,
priority TINYINT(4) NOT NULL,
app VARCHAR(20) NOT NULL,
appdata VARCHAR(128) NOT NULL
);

View File

@ -394,6 +394,12 @@
/* Define this to indicate the ${SQLITE_DESCRIP} library */
#undef HAVE_SQLITE
/* Define this to indicate the ${SQLITE3_DESCRIP} library */
#undef HAVE_SQLITE3
/* Define to indicate the ${SQLITE3_DESCRIP} library version */
#undef HAVE_SQLITE3_VERSION
/* Define to indicate the ${SQLITE_DESCRIP} library version */
#undef HAVE_SQLITE_VERSION

View File

@ -141,6 +141,9 @@ SPEEX_LIB=@SPEEX_LIB@
SQLITE_INCLUDE=@SQLITE_INCLUDE@
SQLITE_LIB=@SQLITE_LIB@
SQLITE3_INCLUDE=@SQLITE3_INCLUDE@
SQLITE3_LIB=@SQLITE3_LIB@
SSL_INCLUDE=@OPENSSL_INCLUDE@
SSL_LIB=@OPENSSL_LIB@

1311
res/res_config_sqlite.c Normal file

File diff suppressed because it is too large Load Diff