Cosmetic fixes.
[vcard2ldap.git] / tools / jabber2db.pl
blobfdcd1c1d72c94d87386c24912a1d690677947798
1 #!/usr/bin/perl -w
3 #### CONFIG
5 my $db = "Pg"; # Pg : PostgresSQL, mysql: MySQL...
6 my $dbuser = "jabber";
7 my $dbpass = "secret";
8 my $dbname = "jabberd2";
10 my $DUMP_QUERY = 0;
12 ##########################
13 use strict;
14 use DBI;
15 use Vcard2Ldap;
17 my $vcard2db = {
18 "FN" => "fn",
19 "NICKNAME" => "nickname",
20 "URL" => "url",
21 "TEL/NUMBER" => "tel",
22 "EMAIL/USERID" => "email",
23 "TITLE" => "title",
24 "ROLE" => "role",
25 "BDAY" => "bday",
26 "DESC" => "desc",
27 "N/FAMILY" => "n-family",
28 "N/GIVEN" => "n-given",
29 "N/MIDDLE" => "n-middle",
30 "N/PREFIX" => "n-prefix",
31 "N/SUFFIX" => "n-suffix",
32 "ADR/STREET" => "adr-street",
33 "ADR/POBOX" => "adr-pobox",
34 "ADR/EXTADD" => "adr-extadd",
35 "ADR/LOCALITY" => "adr-locality",
36 "ADR/REGION" => "adr-region",
37 "ADR/PCODE" => "adr-pcode",
38 "ADR/CTRY" => "adr-country",
39 "ORG/ORGNAME" => "org-orgname",
40 "ORG/ORGUNIT" => "org-orgunit",
42 "TZ" => "tz",
43 "GEO/LAT" => "geo-lat",
44 "GEO/LON" => "geo-lon",
45 "AGENT/EXTVAL" => "agent-extval",
46 "NOTE" => "note",
47 "REV" => "rev",
48 "SORT-STRING" => "sort-string",
50 "KEY/TYPE" => "key-type",
51 "KEY/CRED" => "key-cred",
53 "PHOTO/TYPE" => "photo-type",
54 "PHOTO/BINVAL" => "photo-binval",
55 "PHOTO/EXTVAL" => "photo-extval",
57 "LOGO/TYPE" => "logo-type",
58 "LOGO/BINVAL" => "logo-binval",
59 "LOGO/EXTVAL" => "logo-extval",
61 "SOUND/PHONETIC" => "sound-phonetic",
62 "SOUND/BINVAL" => "sound-binval",
63 "SOUND/EXTVAL" => "sound-extval"
66 my $option_populate = 0;
67 my $option_add_user = 0;
69 my ($ldap, $dbh, $vcard2ldap);
71 ### MAIN
72 if ($#ARGV == 0) {
73 if ($ARGV[0] eq "-p" || $ARGV[0] eq "--populate") {
74 $option_populate = 1;
75 } elsif ($ARGV[0] =~ /^[\w\-_\.]+@.+/){
76 $option_add_user = 1;
77 } else {
78 usage ();
80 } elsif ($#ARGV > 0) {
81 usage ();
84 $vcard2ldap = Vcard2Ldap::vcard_get_map ();
85 $ldap = Vcard2Ldap::ldap_open ();
86 $dbh = db_open ();
88 set_all_vcards ();
89 add_user ($ARGV[0]) if $option_add_user;
90 populate_all_rosters () if $option_populate;
92 $dbh->disconnect;
93 exit;
95 ###
96 sub usage {
97 print "usage: jabber2db [-p|--populate] [user\@$Vcard2Ldap::jabberd]\n";
98 exit (1);
101 sub set_all_vcards {
102 my $query = "";
104 db_delete_vcards () if $option_populate;
106 foreach (Vcard2Ldap::ldap_get_users ($ldap)) {
107 $query .= db_set_vcard ($_);
110 execute_query ($query);
113 sub add_user {
114 my $jid = shift;
115 my $user = Vcard2Ldap::jabber_user ($jid);
116 my $query = "";
118 return if (!$user);
120 foreach (Vcard2Ldap::jabber_get_users ()) {
121 if ($user->{"jid"} ne $_->{"jid"} &&
122 $user->{"rostergroup"} eq $_->{"rostergroup"}) {
123 $query .= db_insert_user_to_roster ($user->{"jid"}, $_->{"jid"});
124 $query .= db_insert_user_to_roster ($_->{"jid"}, $user->{"jid"});
128 execute_query ($query);
131 sub populate_all_rosters {
132 my $query = "";
134 db_delete_rosters ();
136 foreach my $us1 (Vcard2Ldap::jabber_get_users ()) {
137 foreach my $us2 (Vcard2Ldap::jabber_get_users ()) {
138 if ($us1->{"jid"} ne $us2->{"jid"} &&
139 $us1->{"rostergroup"} eq $us2->{"rostergroup"}) {
140 $query .= db_insert_user_to_roster ($us1->{"jid"}, $us2->{"jid"}) . ";";
145 execute_query ($query);
148 sub db_open {
149 my $dbh = DBI->connect (
150 "DBI:$db:database=$dbname;host=localhost",
151 $dbuser,
152 $dbpass
153 ) or die "jabberd2db: cannot connect to DB!";
155 return $dbh;
158 sub execute_query {
159 my $query = shift;
160 my $rows;
162 print $query if ($DUMP_QUERY);
164 return $dbh->do ($query) || die "jabber2db: cannot execute query! ($!)";
167 sub db_delete_vcards {
168 execute_query ("DELETE FROM \"vcard\";");
171 sub db_delete_rosters {
172 execute_query ("DELETE FROM \"roster-items\";\n" .
173 "DELETE FROM \"roster-groups\";");
176 sub db_insert_vcard {
177 my $pers = shift;
179 my $squery = "";
180 my $ssquery = "";
181 my $query = "";
183 $query = "INSERT INTO vcard (\"collection-owner\"";
185 while (my ($key, $value) = each (%$vcard2db)) {
186 if ($vcard2ldap->{$key} && $pers->get_value ($vcard2ldap->{$key})) {
187 $squery .= ", \"". $value . "\"";
188 $ssquery .= $dbh->quote ($pers->get_value ($vcard2ldap->{$key})) .
189 ",";
193 chop ($ssquery);
195 $query .= $squery . ") VALUES ('" .
196 Vcard2Ldap::jabber_jid ($pers) . "', " .
197 $ssquery . ");\n";
199 return $query;
202 sub db_update_vcard {
203 my $pers = shift;
205 my $squery = "";
206 my $ssquery = "";
207 my $query = "";
209 $query = "UPDATE vcard SET ";
211 while (my ($key, $value) = each (%$vcard2db)) {
212 if ($vcard2ldap->{$key} && $pers->get_value ($vcard2ldap->{$key})) {
213 $query .= "\"". $value . "\" = " .
214 $dbh->quote ($pers->get_value ($vcard2ldap->{$key})) . ",";
218 chop ($query);
220 $query .= " WHERE \"collection-owner\" = " .
221 $dbh->quote (Vcard2Ldap::jabber_jid ($pers)) . ";\n";
223 return $query;
226 sub db_vcard_exists {
227 my $pers = shift;
228 my $query;
229 my $rc;
231 $query = "SELECT COUNT(*) FROM vcard WHERE \"collection-owner\" = " .
232 $dbh->quote (Vcard2Ldap::jabber_jid ($pers));
234 return execute_query ($query) > 0;
237 sub db_set_vcard {
238 my $pers = shift;
239 my $is_update = 0;
240 my $query;
242 return ""
243 if (!Vcard2Ldap::jabber_jid ($pers) ||
244 !Vcard2Ldap::jabber_group ($pers));
246 $is_update = db_vcard_exists ($pers) if (!$option_populate);
248 if ($is_update) {
249 db_update_vcard ($pers);
250 } else {
251 db_insert_vcard ($pers);
255 sub db_insert_user_to_roster {
256 my $ujid = shift;
257 my $rjid = shift;
258 my $query;
260 $query = "INSERT INTO \"roster-items\" (\"collection-owner\", \"jid\", \"to\", \"from\", \"ask\") VALUES (" .
261 $dbh->quote ($ujid) . "," .
262 $dbh->quote ($rjid) . "," .
263 "TRUE, TRUE, 0 );\n";
265 $query .= "INSERT INTO \"roster-groups\" (\"collection-owner\", \"jid\", \"group\") VALUES (" .
266 $dbh->quote ($ujid) . "," .
267 $dbh->quote ($rjid) . "," .
268 $dbh->quote ($Vcard2Ldap::groupname) . ");\n";
270 return $query;