lib,test: replace connection query() method with sync_exec{,_params}.
[mailshears.git] / lib / common / postfixadmin_plugin.rb
index 8bf03f96f5a95d8bf8279cff6721035dc13f835f..92b7a5b3036cdc8be3bba7df549d9d026cf8e87f 100644 (file)
@@ -16,13 +16,14 @@ module PostfixadminPlugin
   # @param cfg [Configuration] the configuration for this plugin.
   #
   def initialize(cfg)
-    @db_host = cfg.postfixadmin_dbhost
-    @db_port = cfg.postfixadmin_dbport
-    @db_opts = cfg.postfixadmin_dbopts
-    @db_tty  = cfg.postfixadmin_dbtty
-    @db_name = cfg.postfixadmin_dbname
-    @db_user = cfg.postfixadmin_dbuser
-    @db_pass = cfg.postfixadmin_dbpass
+    @db_hash = {
+      :host     => cfg.postfixadmin_dbhost,
+      :port     => cfg.postfixadmin_dbport,
+      :options  => cfg.postfixadmin_dbopts,
+      :tty      => cfg.postfixadmin_dbtty,
+      :dbname   => cfg.postfixadmin_dbname,
+      :user     => cfg.postfixadmin_dbuser,
+      :password => cfg.postfixadmin_dbpass }
   end
 
 
@@ -36,16 +37,19 @@ module PostfixadminPlugin
   def list_domains()
     domains = []
 
-    connection = PGconn.connect(@db_host, @db_port, @db_opts, @db_tty,
-                                @db_name, @db_user, @db_pass)
+    connection = PG::Connection.new(@db_hash)
 
     # 'ALL' is a magic domain, and we don't want it.
     sql_query = "SELECT domain FROM domain WHERE domain <> 'ALL';"
-    connection.query(sql_query) do |result|
-      domains = result.field_values('domain')
-    end
 
-    connection.close()
+    begin
+      connection.sync_exec(sql_query) do |result|
+        domains = result.field_values('domain')
+      end
+    ensure
+      # Make sure the connection gets closed even if the query explodes.
+      connection.close()
+    end
 
     return domains.map{ |d| Domain.new(d) }
   end
@@ -59,15 +63,18 @@ module PostfixadminPlugin
   def list_users()
     users = []
 
-    connection = PGconn.connect(@db_host, @db_port, @db_opts, @db_tty,
-                                @db_name, @db_user, @db_pass)
+    connection = PG::Connection.new(@db_hash)
 
     sql_query = 'SELECT username FROM mailbox;'
-    connection.query(sql_query) do |result|
-      users = result.field_values('username')
-    end
 
-    connection.close()
+    begin
+      connection.sync_exec(sql_query) do |result|
+        users = result.field_values('username')
+      end
+    ensure
+      # Make sure the connection gets closed even if the query explodes.
+      connection.close()
+    end
 
     return users.map{ |u| User.new(u) }
   end
@@ -86,8 +93,7 @@ module PostfixadminPlugin
     usernames = []
     return usernames if domains.length() == 0
 
-    connection = PGconn.connect(@db_host, @db_port, @db_opts, @db_tty,
-                                @db_name, @db_user, @db_pass)
+    connection = PG::Connection.new(@db_hash)
 
     # The number of parameters that we'll pass into our prepared query
     # is the number of domains that we're given. It's important that
@@ -95,14 +101,17 @@ module PostfixadminPlugin
     params = 1.upto(domains.length()).map{ |i| '$' + i.to_s() }.join(',')
     sql_query  = "SELECT username FROM mailbox WHERE domain IN (#{params});"
 
-    # Now replace each Domain with its string representation and pass
-    # those in as our individual parameters.
-    connection.query(sql_query, domains.map{ |d| d.to_s() }) do |result|
-      usernames = result.field_values('username')
+    begin
+      # Now replace each Domain with its string representation and pass
+      # those in as our individual parameters.
+      connection.sync_exec_params(sql_query, domains.map{ |d| d.to_s() }) do |result|
+        usernames = result.field_values('username')
+      end
+    ensure
+      # Make sure the connection gets closed even if the query explodes.
+      connection.close()
     end
 
-    connection.close()
-
     return usernames.map{ |u| User.new(u) }
   end
 
@@ -117,17 +126,20 @@ module PostfixadminPlugin
   def list_aliases()
     aliases = []
 
-    connection = PGconn.connect(@db_host, @db_port, @db_opts, @db_tty,
-                                @db_name, @db_user, @db_pass)
+    connection = PG::Connection.new(@db_hash)
 
     sql_query = 'SELECT address,goto FROM alias;'
-    results = connection.query(sql_query)
-    results.each do |row|
-      # row should be a hash
-      aliases << row
-    end
 
-    connection.close()
+    begin
+      results = connection.sync_exec(sql_query)
+      results.each do |row|
+        # row should be a hash
+        aliases << row
+      end
+    ensure
+      # Make sure the connection gets closed even if the query explodes.
+      connection.close()
+    end
 
     return aliases
   end
@@ -146,18 +158,21 @@ module PostfixadminPlugin
   def domain_exists(domain)
     count = 0
 
-    connection = PGconn.connect(@db_host, @db_port, @db_opts, @db_tty,
-                                @db_name, @db_user, @db_pass)
+    connection = PG::Connection.new(@db_hash)
 
     sql_query = 'SELECT COUNT(domain) as count FROM domain WHERE domain = $1;'
-    connection.query(sql_query, [domain.to_s()]) do |result|
-      return false if result.ntuples() < 1
-      count = result.getvalue(0,0).to_i()
 
-      return false if count.nil?
-    end
+    begin
+      connection.sync_exec_params(sql_query, [domain.to_s()]) do |result|
+        return false if result.ntuples() < 1
+        count = result.getvalue(0,0).to_i()
 
-    connection.close()
+        return false if count.nil?
+      end
+    ensure
+      # Make sure the connection gets closed even if the query explodes.
+      connection.close()
+    end
 
     return (count > 0)
   end