]> gitweb.michael.orlitzky.com - mailshears.git/blob - lib/common/davical_plugin.rb
mailshears.gemspec: bump version to 0.1.0
[mailshears.git] / lib / common / davical_plugin.rb
1 require 'common/plugin'
2 require 'common/user'
3
4 # Code that all DAViCal plugins ({DavicalPrune}, {DavicalRm}, and
5 # {DavicalMv}) will share.
6 #
7 module DavicalPlugin
8
9 # We implement the Plugin "interface."
10 include Plugin
11
12 # Initialize this DAViCal {Plugin} with values in *cfg*.
13 #
14 # @param cfg [Configuration] the configuration for this plugin.
15 #
16 def initialize(cfg)
17 @db_hash = {
18 :host => cfg.davical_dbhost,
19 :port => cfg.davical_dbport,
20 :options => cfg.davical_dbopts,
21 :dbname => cfg.davical_dbname,
22 :user => cfg.davical_dbuser,
23 :password => cfg.davical_dbpass }
24 end
25
26
27 # Describe the given DAViCal user who is assumed to exist.
28 #
29 # @param user [User] the {User} object whose description we want.
30 #
31 # @return [String] a String describing the given *user* in terms
32 # of his DAViCal "Principal ID".
33 #
34 def describe_user(user)
35 principal_id = self.get_principal_id(user)
36 return "Principal ID: #{principal_id}"
37 end
38
39
40 #
41 # Produce a list of DAViCal users.
42 #
43 # This method remains public for use in testing.
44 #
45 # @return [Array<User>] an array of {User} objects, one for each
46 # user found in the DAViCal database.
47 #
48 def list_users()
49 usernames = []
50
51 connection = PG::Connection.new(@db_hash)
52
53 # User #1 is the super-user, and not tied to an email address.
54 sql_query = 'SELECT username FROM usr WHERE user_no > 1;'
55
56 begin
57 connection.sync_exec(sql_query) do |result|
58 usernames = result.field_values('username')
59 end
60 ensure
61 # Make sure the connection gets closed even if the query explodes.
62 connection.close()
63 end
64
65 return usernames.map{ |u| User.new(u) }
66 end
67
68
69 protected;
70
71
72 # Find the "Principal ID" of the given user.
73 #
74 # @param user [User] the user whose Principal ID we want.
75 #
76 # @return [Fixnum] an integer representing the user's Principal ID
77 # that we obtained from the DAViCal database.
78 #
79 def get_principal_id(user)
80 principal_id = nil
81
82 connection = PG::Connection.new(@db_hash)
83
84 sql_query = 'SELECT principal.principal_id '
85 sql_query += 'FROM (principal INNER JOIN usr '
86 sql_query += ' ON principal.user_no = usr.user_no) '
87 sql_query += 'WHERE usr.username = $1;'
88
89 begin
90 connection.sync_exec_params(sql_query, [user.to_s()]) do |result|
91 if result.num_tuples > 0
92 principal_id = result[0]['principal_id']
93 end
94 end
95 ensure
96 # Make sure the connection gets closed even if the query explodes.
97 connection.close()
98 end
99
100 return principal_id
101 end
102
103 end