summaryrefslogtreecommitdiff
path: root/misc/freeswitch/scripts/common/database.lua
diff options
context:
space:
mode:
Diffstat (limited to 'misc/freeswitch/scripts/common/database.lua')
-rw-r--r--misc/freeswitch/scripts/common/database.lua151
1 files changed, 151 insertions, 0 deletions
diff --git a/misc/freeswitch/scripts/common/database.lua b/misc/freeswitch/scripts/common/database.lua
new file mode 100644
index 0000000..3692f84
--- /dev/null
+++ b/misc/freeswitch/scripts/common/database.lua
@@ -0,0 +1,151 @@
+-- Gemeinschaft 5 module: database class
+-- (c) AMOOMA GmbH 2012
+--
+
+module(...,package.seeall)
+
+Database = {}
+
+DATABASE_DRIVER = 'mysql'
+
+function Database.new(self, arg)
+ arg = arg or {}
+ object = arg.object or {}
+ setmetatable(object, self);
+ self.__index = self;
+ self.class = 'database';
+ self.log = arg.log;
+ self.conn = nil;
+ return object;
+end
+
+
+function Database.connect(self, database_name, user_name, password, host_name)
+ local database_driver = nil;
+ if not (database_name and user_name and password) then
+ require 'common.configuration_file'
+ local config = common.configuration_file.get('/opt/freeswitch/scripts/ini/database.ini');
+ if config then
+ database_driver = config[true].driver
+ database_name = config[database_driver].database
+ user_name = config[database_driver].user
+ password = config[database_driver].password
+ host_name = config[database_driver].host
+ end
+ end
+
+ host_name = host_name or 'localhost';
+ database_driver = database_driver or DATABASE_DRIVER;
+
+ if database_driver == 'mysql' then
+ require "luasql.mysql"
+ self.env = luasql.mysql();
+ elseif database_driver == 'odbc' then
+ require "luasql.odbc"
+ self.env = luasql.odbc();
+ end
+
+ self.conn = self.env:connect(database_name, user_name, password, host_name);
+ self.conn_id = tostring(self.conn);
+ self.database_name = database_name;
+ self.user_name = user_name;
+ self.password = password;
+ self.host_name = host_name;
+
+ -- self.log:debug('DATABASE_CONNECT - connection: ', self.conn_id, ', environment: ', self.env);
+
+ return self;
+end
+
+
+function Database.reconnect(self)
+ self.conn = self.env:connect(self.database_name, self.user_name, self.password, self.host_name);
+ self.conn_id = tostring(self.conn);
+
+ if self.log then
+ self.log:info('DATABASE_RECONNECT - connection: ', self.conn_id, ', environment: ', self.env);
+ end
+
+ return self;
+end
+
+
+function Database.connected(self)
+ return self.conn;
+end
+
+
+function Database.query(self, sql_query, call_function)
+ local cursor = self.conn:execute(sql_query);
+
+ if cursor == nil and not self.conn:execute('SELECT @@VERSION') then
+ if self.log then
+ self.log:error('DATABASE_QUERY - lost connection: ', self.conn_id, ', environment: ', self.env, ', query: ', sql_query);
+ end
+ self:reconnect();
+
+ if call_function then
+ cursor = self.conn:execute(sql_query);
+ self.log:notice('DATABASE_QUERY - retry: ', sql_query);
+ end
+ end
+
+ if cursor and call_function then
+ repeat
+ row = cursor:fetch({}, 'a');
+ if row then
+ call_function(row);
+ end
+ until not row;
+ end
+
+ if type(cursor) == 'userdata' then
+ cursor:close();
+ end
+
+ return cursor;
+end
+
+
+function Database.query_return_value(self, sql_query)
+ local cursor = self.conn:execute(sql_query);
+
+ if cursor == nil and not self.conn:execute('SELECT @@VERSION') then
+ if self.log then
+ self.log:error('DATABASE_QUERY - lost connection: ', self.conn_id, ', environment: ', self.env, ', query: ', sql_query);
+ end
+ self:reconnect();
+ cursor = self.conn:execute(sql_query);
+ self.log:notice('DATABASE_QUERY - retry: ', sql_query);
+ end
+
+ if type(cursor) == 'userdata' then
+ local row = cursor:fetch({}, 'n');
+ cursor:close();
+
+ if not row then
+ return row;
+ else
+ return row[1];
+ end
+ end
+
+ return cursor;
+end
+
+
+function Database.last_insert_id(self)
+ return self:query_return_value('SELECT LAST_INSERT_ID()');
+end
+
+
+function Database.release(self, sql_query, call_function)
+ if self.conn then
+ self.conn:close();
+ end
+ if self.env then
+ self.env:close();
+ end
+
+ -- self.log:debug('DATABASE_RELEASE - connection: ', self.conn_id, ', status: ', self.env, ', ', self.conn);
+end