1 package databases;
2 use Exporter;
3 @ISA = qw(Exporter);
4 my @events = (
5 "get_events",
6 "query_jobdb",
7 "count_jobdb",
8 "delete_jobdb_entry",
9 "clear_jobdb",
10 "update_status_jobdb_entry",
11 "query_packages_list",
12 "count_packages_list",
13 "query_fai_server",
14 "count_fai_server",
15 "query_fai_release",
16 "count_fai_release",
17 );
18 @EXPORT = @events;
20 use strict;
21 use warnings;
22 use GOSA::GosaSupportDaemon;
23 use Data::Dumper;
25 BEGIN {}
27 END {}
29 ### Start ######################################################################
31 #&main::read_configfile($main::cfg_file, %cfg_defaults);
33 sub get_events {
34 return \@events;
35 }
37 sub query_fai_release{ return &query_db( @_ ); }
38 sub query_fai_server{ return &query_db( @_ ) ; }
39 sub query_packages_list { return &query_db( @_ ) ; }
40 sub query_jobdb { return &query_db( @_ ) ; }
41 sub query_db {
42 my ($msg, $msg_hash, $session_id) = @_ ;
43 my $header = @{$msg_hash->{'header'}}[0];
44 my $target = @{$msg_hash->{'target'}}[0];
45 my $source = @{$msg_hash->{'source'}}[0];
46 my $table;
47 my $db;
48 if( $header =~ /query_jobdb/ ) {
49 $table = $main::job_queue_tn;
50 $db = $main::job_db;
51 } elsif( $header =~ /query_packages_list/ ) {
52 $table = $main::packages_list_tn;
53 $db = $main::packages_list_db;
54 } elsif( $header =~ /query_fai_server/ ) {
55 $table = $main::fai_server_tn;
56 $db = $main::fai_server_db;
57 } elsif( $header =~ /query_fai_release/ ) {
58 $table = $main::fai_release_tn;
59 $db = $main::fai_release_db;
60 }
63 # prepare sql statement and execute query
64 my $select= &get_select_statement($msg, $msg_hash);
65 my $where= &get_where_statement($msg, $msg_hash);
66 my $limit= &get_limit_statement($msg, $msg_hash);
67 my $orderby= &get_orderby_statement($msg, $msg_hash);
68 my $sql_statement= "SELECT $select FROM $table $where $orderby $limit";
69 my $res_hash = $db->select_dbentry($sql_statement);
71 my $out_xml = &db_res2si_msg($res_hash, $header, $source, $target);
72 #$out_xml =~ s/<\/xml>/<session_id>$session_id<\/session_id><\/xml>/;
73 my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
74 if (defined $forward_to_gosa) {
75 #&add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
76 $out_xml =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
77 }
78 my @out_msg_l = ( $out_xml );
80 return @out_msg_l;
81 }
83 sub count_fai_release{ return &count_db( @_ ); }
84 sub count_fai_server{ return &count_db( @_ ); }
85 sub count_packages_list{ return &count_db( @_ ); }
86 sub count_jobdb{ return &count_db( @_ ); }
87 sub count_db {
88 my ($msg, $msg_hash, $session_id) = @_;
89 my $header = @{$msg_hash->{'header'}}[0];
90 my $target = @{$msg_hash->{'target'}}[0];
91 my $source = @{$msg_hash->{'source'}}[0];
92 my $table;
93 my $db;
95 if( $header =~ /count_jobdb/ ) {
96 $table = $main::job_queue_tn;
97 $db = $main::job_db;
98 } elsif( $header =~ /count_packages_list/ ) {
99 $table = $main::packages_list_tn;
100 $db = $main::packages_list_db;
101 } elsif( $header =~ /count_fai_server/ ) {
102 $table = $main::fai_server_tn;
103 $db = $main::fai_server_db;
104 } elsif( $header =~ /count_fai_release/ ) {
105 $table = $main::fai_release_tn;
106 $db = $main::fai_release_db;
107 }
109 my $count = $db->count_dbentries($table);
110 my $out_xml= "<xml><header>answer</header><source>$target</source><target>$source</target><count>$count</count><session_id>$session_id</session_id></xml>";
111 my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
112 if (defined $forward_to_gosa) {
113 #&add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
114 $out_xml =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
115 }
117 my @out_msg_l = ( $out_xml );
118 return @out_msg_l;
119 }
121 sub delete_jobdb_entry {
122 my ($msg, $msg_hash, $session_id) = @_ ;
123 my $target = @{$msg_hash->{'target'}}[0];
124 my $source = @{$msg_hash->{'source'}}[0];
126 # prepare query sql statement
127 my $where= &get_where_statement($msg, $msg_hash);
129 #my $sql_statement = "DELETE FROM $main::job_queue_tn $where";
130 #&main::daemon_log("$session_id DEBUG: $sql_statement",7);
131 # execute db query
132 #my $db_res = $main::job_db->del_dbentry($sql_statement);
133 #
134 #my $res;
135 #if( $db_res > 0 ) {
136 # $res = 0 ;
137 #} else {
138 # $res = 1;
139 #}
141 # set job to status 'done', job will be deleted automatically
142 my $sql_statement = "UPDATE $main::job_queue_tn SET status='done', modified='1', periodic='none' $where";
143 &main::daemon_log("$session_id DEBUG: $sql_statement", 7);
144 my $res = $main::job_db->update_dbentry( $sql_statement );
146 # prepare xml answer
147 my $out_xml = "<xml><header>answer</header><source>$target</source><target>$source</target><answer1>$res</answer1><session_id>$session_id</session_id></xml>";
148 my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
149 if (defined $forward_to_gosa) {
150 $out_xml =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
151 }
153 my @out_msg_l = ( $out_xml );
154 return @out_msg_l;
156 }
159 sub clear_jobdb {
160 my ($msg, $msg_hash, $session_id) = @_ ;
161 my $target = @{$msg_hash->{'target'}}[0];
162 my $source = @{$msg_hash->{'source'}}[0];
164 my $error= 0;
165 my $out_xml= "<xml><answer1>1</answer1></xml>";
167 my $table= $main::job_queue_tn;
169 my $sql_statement = "DELETE FROM $table";
170 my $db_res = $main::job_db->del_dbentry($sql_statement);
171 if( not $db_res > 0 ) { $error++; };
173 if( $error == 0 ) {
174 $out_xml = "<xml><header>answer</header><source>$target</source><target>$source</target><answer1>0</answer1><session_id>$session_id</session_id></xml>";
175 }
176 my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
177 if (defined $forward_to_gosa) {
178 #&add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
179 $out_xml =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
180 }
182 my @out_msg_l = ( $out_xml );
183 return @out_msg_l;
184 }
187 sub update_status_jobdb_entry {
188 my ($msg, $msg_hash, $session_id) = @_ ;
189 my $target = @{$msg_hash->{'target'}}[0];
190 my $source = @{$msg_hash->{'source'}}[0];
192 my $error= 0;
193 my $out_xml= "<xml><header>answer</header><source>$target</source><target>$source</target><answer1>1</answer1><session_id>$session_id</session_id></xml>";
195 my @len_hash = keys %{$msg_hash};
196 if( 0 == @len_hash) { $error++; };
198 # prepare query sql statement
199 if( $error == 0) {
200 my $table= $main::job_queue_tn;
201 my $where= &get_where_statement($msg, $msg_hash);
202 my $update= &get_update_statement($msg, $msg_hash);
204 # conditions
205 # no timestamp update if status eq waiting
206 my $sql_statement = "SELECT * FROM $table $where AND status='processing'";
207 my $res_hash = $main::job_db->select_dbentry($sql_statement);
208 if( (0 != keys(%$res_hash)) && ($update =~ /timestamp/i) ) {
209 $error ++;
210 $out_xml = "<answer1>1</answer1><error_string>there is no timestamp update allowed while status is 'processing'</error_string>";
211 }
213 if( $error == 0 ) {
214 my $sql_statement = "UPDATE $table $update $where";
215 # execute db query
216 my $db_res = $main::job_db->update_dbentry($sql_statement);
218 # check success of db update
219 if( not $db_res > 0 ) { $error++; };
220 }
221 }
223 if( $error == 0) {
224 $out_xml = "<answer1>0</answer1>";
225 }
227 my $out_msg = sprintf("<xml><header>answer</header><source>%s</source><target>%s</target>%s<session_id>$session_id</session_id></xml>", $target, $source, $out_xml);
228 my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
229 if (defined $forward_to_gosa) {
230 #&add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
231 $out_xml =~s/<\/xml>/<forward_to_gosa>$forward_to_gosa<\/forward_to_gosa><\/xml>/;
232 }
234 my @out_msg_l = ( $out_msg );
235 return @out_msg_l;
236 }
239 =pod
241 =head1 NAME
243 databases - Implementation of a GOsa-SI event module for GOsa-SI-server.
245 =head1 SYNOPSIS
247 use GOSA::GosaSupportDaemon;
249 =head1 DESCRIPTION
251 This GOsa-SI event module containing all functions to handle messages coming from GOsa and concerning GOsa-SI databases.
253 This module will be automatically imported by GOsa-SI if it is under F</usr/lib/gosa-si/server/E<lt>PACKAGEMODULEE<gt>/> .
255 =head1 METHODS
257 =over 4
259 =item get_events ( )
261 =item query_jobdb ( )
263 =item count_jobdb ( )
265 =item delete_jobdb_entry ( )
267 =item clear_jobdb ( )
269 =item update_status_jobdb_entry ( )
271 =item query_packages_list ( )
273 =item count_packages_list ( )
275 =item query_fai_server ( )
277 =item count_fai_server ( )
279 =item query_fai_release ( )
281 =item count_fai_release ( )
283 =back
285 =head1 BUGS
287 Please report any bugs, or post any suggestions, to the GOsa mailing list E<lt>gosa-devel@oss.gonicus.deE<gt> or to L<https://oss.gonicus.de/labs/gosa>
289 =head1 COPYRIGHT
291 This code is part of GOsa (L<http://www.gosa-project.org>)
293 Copyright (C) 2003-2008 GONICUS GmbH
295 This program is distributed in the hope that it will be useful,
296 but WITHOUT ANY WARRANTY; without even the implied warranty of
297 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
298 GNU General Public License for more details.
300 =cut
303 1;