]> gitweb.michael.orlitzky.com - mailshears.git/blobdiff - lib/mv/plugins/davical.rb
Begin building the framework to rename accounts. A pile of crap right now.
[mailshears.git] / lib / mv / plugins / davical.rb
diff --git a/lib/mv/plugins/davical.rb b/lib/mv/plugins/davical.rb
new file mode 100644 (file)
index 0000000..860abdc
--- /dev/null
@@ -0,0 +1,112 @@
+require 'pg'
+
+require 'common/plugin'
+require 'rm/rm_plugin'
+
+class DavicalMv
+  #
+  # DAViCal only supports Postgres, so even if we ever are
+  # database-agnostic, this plugin can't be.
+  #
+  include Plugin
+  include MvPlugin
+
+  def initialize()
+    cfg = Configuration.new()
+    @db_host = cfg.davical_dbhost
+    @db_port = cfg.davical_dbport
+    @db_opts = cfg.davical_dbopts
+    @db_tty  = cfg.davical_dbtty
+    @db_name = cfg.davical_dbname
+    @db_user = cfg.davical_dbuser
+    @db_pass = cfg.davical_dbpass
+  end
+
+
+  def describe_domain(domain)
+    # DAViCal doesn't have a concept of domains.
+    return 'N/A'
+  end
+
+
+  def describe_account(account)
+    principal_id = self.get_principal_id(account)
+
+    if principal_id.nil?
+      return 'User not found'
+    else
+      return "Principal ID: #{principal_id}"
+    end
+  end
+
+
+  def mv_domain(from, to)
+    # DAViCal doesn't have a concept of domains.
+  end
+
+
+  def mv_account(from, to)
+    # Delete the given username. DAViCal uses foreign keys properly
+    # and only supports postgres, so we let the ON UPDATE CASCADE
+    # trigger handle most of the work.
+    sql_queries = ['UPDATE usr SET username = $1 WHERE username = $2']
+
+    begin
+      connection = PGconn.connect(@db_host,
+                                  @db_port,
+                                  @db_opts,
+                                  @db_tty,
+                                  @db_name,
+                                  @db_user,
+                                  @db_pass)
+
+      sql_queries.each do |sql_query|
+        connection.query(sql_query, [to, from])
+      end
+
+      connection.close()
+
+    rescue PGError => e
+      # Pretend like we're database-agnostic in case we ever are.
+      raise DatabaseError.new(e)
+    end
+
+  end
+
+
+  protected;
+
+  def get_principal_id(account)
+    principal_id = nil
+
+    begin
+      connection = PGconn.connect(@db_host,
+                                  @db_port,
+                                  @db_opts,
+                                  @db_tty,
+                                  @db_name,
+                                  @db_user,
+                                  @db_pass)
+
+      sql_query =  "SELECT principal.principal_id "
+      sql_query += "FROM (principal INNER JOIN usr "
+      sql_query += "      ON principal.user_no = usr.user_no) "
+      sql_query += "WHERE usr.username = $1;"
+
+      connection.query(sql_query, [account]) do |result|
+        if result.num_tuples > 0
+          principal_id = result[0]['principal_id']
+        end
+      end
+
+      connection.close()
+
+    rescue PGError => e
+      # Pretend like we're database-agnostic in case we ever are.
+      raise DatabaseError.new(e)
+    end
+
+    return principal_id
+  end
+
+end