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