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