X-Git-Url: http://gitweb.michael.orlitzky.com/?p=mailshears.git;a=blobdiff_plain;f=lib%2Fmv%2Fplugins%2Fdavical.rb;fp=lib%2Fmv%2Fplugins%2Fdavical.rb;h=860abdc3765a2e0b47dd08c244ca0a8b3fa1f38a;hp=0000000000000000000000000000000000000000;hb=ec3c9099a29f40d95f055ea0f7fb25a99d913de3;hpb=c6cab6b71770d14dad1115db90a00b990c44a58d diff --git a/lib/mv/plugins/davical.rb b/lib/mv/plugins/davical.rb new file mode 100644 index 0000000..860abdc --- /dev/null +++ b/lib/mv/plugins/davical.rb @@ -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