]> gitweb.michael.orlitzky.com - mailshears.git/blob - lib/mailshears/plugins/davical.rb
Fix table name (again) in DAViCal plugin.
[mailshears.git] / lib / mailshears / plugins / davical.rb
1 require 'pg'
2
3 class DavicalDb
4 #
5 # DAViCal only supports Postgres, so even if we ever are
6 # database-agnostic, this plugin can't be.
7 #
8 include Plugin
9
10 def initialize()
11 cfg = Configuration.new()
12 @db_host = cfg.davical_dbhost
13 @db_port = cfg.davical_dbport
14 @db_opts = cfg.davical_dbopts
15 @db_tty = cfg.davical_dbtty
16 @db_name = cfg.davical_dbname
17 @db_user = cfg.davical_dbuser
18 @db_pass = cfg.davical_dbpass
19 end
20
21
22 def describe_domain(domain)
23 # DAViCal doesn't have a concept of domains.
24 return 'N/A'
25 end
26
27
28 def describe_account(account)
29 user_id = self.get_principal_id(account)
30
31 if user_id.nil?
32 return 'User not found'
33 else
34 return "Principal ID: #{user_id}"
35 end
36 end
37
38
39 def delete_domain(domain)
40 # DAViCal doesn't have a concept of domains.
41 end
42
43
44 def delete_account(account)
45 # Delete the given username. DAViCal uses foreign keys properly
46 # and only supports postgres, so we let the ON DELETE CASCADE
47 # trigger handle most of the work.
48 sql_queries = ['DELETE FROM usr WHERE username = $1']
49
50 begin
51 connection = PGconn.connect(@db_host,
52 @db_port,
53 @db_opts,
54 @db_tty,
55 @db_name,
56 @db_user,
57 @db_pass)
58
59 sql_queries.each do |sql_query|
60 connection.query(sql_query, [account])
61 end
62
63 connection.close()
64
65 rescue PGError => e
66 # Pretend like we're database-agnostic in case we ever are.
67 raise DatabaseError.new(e)
68 end
69
70 end
71
72
73 def get_leftover_domains(db_domains)
74 # AgenDAV doesn't have a concept of domains.
75 return []
76 end
77
78
79 def get_leftover_accounts(db_accounts)
80 # Get a list of all users who have logged in to DAViCal.
81 davical_accounts = self.get_davical_usernames()
82 return davical_accounts - db_accounts
83 end
84
85
86 protected;
87
88 def get_principal_id(account)
89 principal_id = nil
90
91 begin
92 connection = PGconn.connect(@db_host,
93 @db_port,
94 @db_opts,
95 @db_tty,
96 @db_name,
97 @db_user,
98 @db_pass)
99
100 sql_query = "SELECT principal_id FROM principal WHERE username = $1;"
101
102 connection.query(sql_query, [account]) do |result|
103 if result.num_tuples > 0
104 principal_id = result[0]['principal_id']
105 end
106 end
107
108 connection.close()
109
110 rescue PGError => e
111 # Pretend like we're database-agnostic in case we ever are.
112 raise DatabaseError.new(e)
113 end
114
115 return principal_id
116 end
117
118
119 def get_davical_usernames()
120 usernames = []
121
122 begin
123 connection = PGconn.connect(@db_host,
124 @db_port,
125 @db_opts,
126 @db_tty,
127 @db_name,
128 @db_user,
129 @db_pass)
130
131 # User #1 is the super-user, and not tied to an email address.
132 sql_query = 'SELECT username FROM usr WHERE user_no > 1;'
133
134 connection.query(sql_query) do |result|
135 usernames = result.field_values('username')
136 end
137
138 connection.close()
139 rescue PGError => e
140 # Pretend like we're database-agnostic in case we ever are.
141 raise DatabaseError.new(e)
142 end
143
144 return usernames
145 end
146
147 end