source: main/trunk/greenstone2/perllib/dbutil.pm@ 22844

Last change on this file since 22844 was 22485, checked in by ak19, 14 years ago
  1. Dr Bainbridge fixed the database perl modules to all have the method read_info_keys (which reads the keys from the database into a map), so that dbutil.pm can have the same as a generic method. 2. buildConfigxml.pm only writes out the defaultIndex if it is set (to prevent an Uninitialised Variable warning message from Perl).
File size: 11.1 KB
Line 
1###########################################################################
2#
3# dbutil.pm -- gateway to utilities for reading/writing to different databases
4# Copyright (C) 2008 DL Consulting Ltd
5#
6# A component of the Greenstone digital library software
7# from the New Zealand Digital Library Project at the
8# University of Waikato, New Zealand.
9#
10# This program is free software; you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation; either version 2 of the License, or
13# (at your option) any later version.
14#
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
19#
20# You should have received a copy of the GNU General Public License
21# along with this program; if not, write to the Free Software
22# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23#
24###########################################################################
25
26package dbutil;
27
28use strict;
29
30
31sub open_infodb_write_handle
32{
33 my $infodb_type = shift(@_);
34 my $infodb_file_path = shift(@_);
35
36 if ($infodb_type eq "sqlite")
37 {
38 require dbutil::sqlite;
39 return &dbutil::sqlite::open_infodb_write_handle($infodb_file_path, @_);
40 }
41 elsif ($infodb_type eq "gdbm-txtgz")
42 {
43 require dbutil::gdbmtxtgz;
44 return &dbutil::gdbmtxtgz::open_infodb_write_handle($infodb_file_path, @_);
45 }
46 elsif ($infodb_type eq "jdbm")
47 {
48 require dbutil::jdbm;
49 return &dbutil::jdbm::open_infodb_write_handle($infodb_file_path, @_);
50 }
51 elsif ($infodb_type eq "mssql")
52 {
53 require dbutil::mssql;
54 return &dbutil::mssql::open_infodb_write_handle($infodb_file_path, @_);
55 }
56
57 # Use GDBM if the infodb type is empty or not one of the values above
58 require dbutil::gdbm;
59 return &dbutil::gdbm::open_infodb_write_handle($infodb_file_path, @_);
60}
61
62
63sub close_infodb_write_handle
64{
65 my $infodb_type = shift(@_);
66 my $infodb_handle = shift(@_);
67
68 if ($infodb_type eq "sqlite")
69 {
70 require dbutil::sqlite;
71 return &dbutil::sqlite::close_infodb_write_handle($infodb_handle, @_);
72 }
73 elsif ($infodb_type eq "gdbm-txtgz")
74 {
75 require dbutil::gdbmtxtgz;
76 return &dbutil::gdbmtxtgz::close_infodb_write_handle($infodb_handle, @_);
77 }
78 elsif ($infodb_type eq "jdbm")
79 {
80 require dbutil::jdbm;
81 return &dbutil::jdbm::close_infodb_write_handle($infodb_handle, @_);
82 }
83 elsif ($infodb_type eq "mssql")
84 {
85 require dbutil::mssql;
86 return &dbutil::mssql::close_infodb_write_handle($infodb_handle, @_);
87 }
88
89 # Use GDBM if the infodb type is empty or not one of the values above
90 require dbutil::gdbm;
91 return &dbutil::gdbm::close_infodb_write_handle($infodb_handle, @_);
92}
93
94
95sub get_default_infodb_type
96{
97 # The default is GDBM so everything works the same for existing collections
98 # To use something else, specify the "infodbtype" in the collection's collect.cfg file
99 return "gdbm";
100}
101
102
103sub get_infodb_file_path
104{
105 my $infodb_type = shift(@_);
106 my $collection_name = shift(@_);
107 my $infodb_directory_path = shift(@_);
108
109 if ($infodb_type eq "sqlite")
110 {
111 require dbutil::sqlite;
112 return &dbutil::sqlite::get_infodb_file_path($collection_name, $infodb_directory_path, @_);
113 }
114 elsif ($infodb_type eq "gdbm-txtgz")
115 {
116 require dbutil::gdbmtxtgz;
117 return &dbutil::gdbmtxtgz::get_infodb_file_path($collection_name, $infodb_directory_path, @_);
118 }
119 elsif ($infodb_type eq "jdbm")
120 {
121 require dbutil::jdbm;
122 return &dbutil::jdbm::get_infodb_file_path($collection_name, $infodb_directory_path, @_);
123 }
124 elsif ($infodb_type eq "mssql")
125 {
126 #==================================================================================================#
127 # Updated by Jeffrey (2008/08/25 Monday)
128 # After look into the run-time code, it seems we should still create a database file.
129 # Since the run-time code is always try to read a database file, the easiest way here is not
130 # to change the whole structure, but to give whatever the system is looking for.
131 #==================================================================================================#
132 # Added by Jeffrey (2008/08/15 Friday)
133 # No file path required for MS SQL, it is a server-client connection.
134 # At the moment the information is hard coded in dbutil::mssql::open_infodb_write_handle
135 # the this might need some tidy up sometime.
136 #==================================================================================================#
137 require dbutil::mssql;
138 return &dbutil::mssql::get_infodb_file_path($collection_name, $infodb_directory_path, @_);
139 }
140
141 # Use GDBM if the infodb type is empty or not one of the values above
142 require dbutil::gdbm;
143 return &dbutil::gdbm::get_infodb_file_path($collection_name, $infodb_directory_path, @_);
144}
145
146# This function, conceptually, would be better structured if it didn't
147# use return statements, as the database methods it calls do not
148# themselves return anything.
149# Note: if doing this, then the GDBM lines of code should be moved into
150# an 'else' clause
151
152sub read_infodb_file
153{
154 my $infodb_type = shift(@_);
155 my $infodb_file_path = shift(@_);
156 my $infodb_map = shift(@_);
157
158 if ($infodb_type eq "sqlite")
159 {
160 require dbutil::sqlite;
161 return &dbutil::sqlite::read_infodb_file($infodb_file_path, $infodb_map, @_);
162 }
163 elsif ($infodb_type eq "gdbm-txtgz")
164 {
165 require dbutil::gdbmtxtgz;
166 return &dbutil::gdbmtxtgz::read_infodb_file($infodb_file_path, $infodb_map, @_);
167 }
168 elsif ($infodb_type eq "jdbm")
169 {
170 require dbutil::jdbm;
171 return &dbutil::jdbm::read_infodb_file($infodb_file_path, $infodb_map, @_);
172 }
173 elsif ($infodb_type eq "mssql")
174 {
175 require dbutil::mssql;
176 return &dbutil::mssql::read_infodb_file($infodb_file_path, $infodb_map, @_);
177 }
178
179 # Use GDBM if the infodb type is empty or not one of the values above
180 require dbutil::gdbm;
181 return &dbutil::gdbm::read_infodb_file($infodb_file_path, $infodb_map, @_);
182}
183
184sub read_infodb_keys
185{
186 my $infodb_type = shift(@_);
187 my $infodb_file_path = shift(@_);
188 my $infodb_map = shift(@_);
189
190 if ($infodb_type eq "sqlite")
191 {
192 require dbutil::sqlite;
193 &dbutil::sqlite::read_infodb_keys($infodb_file_path, $infodb_map, @_);
194 }
195 elsif ($infodb_type eq "gdbm-txtgz")
196 {
197 require dbutil::gdbmtxtgz;
198 &dbutil::gdbmtxtgz::read_infodb_keys($infodb_file_path, $infodb_map, @_);
199 }
200 elsif ($infodb_type eq "jdbm")
201 {
202 require dbutil::jdbm;
203 &dbutil::jdbm::read_infodb_keys($infodb_file_path, $infodb_map, @_);
204 }
205 elsif ($infodb_type eq "mssql")
206 {
207 require dbutil::mssql;
208 &dbutil::mssql::read_infodb_keys($infodb_file_path, $infodb_map, @_);
209 }
210 else {
211 # Use GDBM if the infodb type is empty or not one of the values above
212 require dbutil::gdbm;
213 &dbutil::gdbm::read_infodb_keys($infodb_file_path, $infodb_map, @_);
214 }
215}
216
217sub read_infodb_entry
218{
219 my $infodb_type = shift(@_);
220 my $infodb_file_path = shift(@_);
221 my $infodb_key = shift(@_);
222
223 # !! TEMPORARY: Slow and naive implementation that just reads the entire file and picks out the one value
224 # !! This will soon be replaced with database-specific versions that will use dbget etc.
225 my $infodb_map = {};
226 &read_infodb_file($infodb_type, $infodb_file_path, $infodb_map);
227 return $infodb_map->{$infodb_key};
228}
229
230
231sub write_infodb_entry
232{
233 my $infodb_type = shift(@_);
234 my $infodb_handle = shift(@_);
235 my $infodb_key = shift(@_);
236 my $infodb_map = shift(@_);
237
238 if ($infodb_type eq "sqlite")
239 {
240 require dbutil::sqlite;
241 return &dbutil::sqlite::write_infodb_entry($infodb_handle, $infodb_key, $infodb_map, @_);
242 }
243 elsif ($infodb_type eq "gdbm-txtgz")
244 {
245 require dbutil::gdbmtxtgz;
246 return &dbutil::gdbmtxtgz::write_infodb_entry($infodb_handle, $infodb_key, $infodb_map, @_);
247 }
248 elsif ($infodb_type eq "jdbm")
249 {
250 require dbutil::jdbm;
251 return &dbutil::jdbm::write_infodb_entry($infodb_handle, $infodb_key, $infodb_map, @_);
252 }
253 elsif ($infodb_type eq "mssql")
254 {
255 require dbutil::mssql;
256 return &dbutil::mssql::write_infodb_entry($infodb_handle, $infodb_key, $infodb_map, @_);
257 }
258
259 # Use GDBM if the infodb type is empty or not one of the values above
260 require dbutil::gdbm;
261 return &dbutil::gdbm::write_infodb_entry($infodb_handle, $infodb_key, $infodb_map, @_);
262}
263
264
265sub write_infodb_rawentry
266{
267 my $infodb_type = shift(@_);
268 my $infodb_handle = shift(@_);
269 my $infodb_key = shift(@_);
270 my $infodb_val = shift(@_);
271
272 if ($infodb_type eq "sqlite")
273 {
274 require dbutil::sqlite;
275 return &dbutil::sqlite::write_infodb_rawentry($infodb_handle, $infodb_key, $infodb_val, @_);
276 }
277 elsif ($infodb_type eq "gdbm-txtgz")
278 {
279 require dbutil::gdbmtxtgz;
280 return &dbutil::gdbmtxtgz::write_infodb_rawentry($infodb_handle, $infodb_key, $infodb_val, @_);
281 }
282 elsif ($infodb_type eq "jdbm")
283 {
284 require dbutil::jdbm;
285 return &dbutil::jdbm::write_infodb_rawentry($infodb_handle, $infodb_key, $infodb_val, @_);
286 }
287 elsif ($infodb_type eq "mssql")
288 {
289 require dbutil::mssql;
290 return &dbutil::mssql::write_infodb_rawentry($infodb_handle, $infodb_key, $infodb_val, @_);
291 }
292
293 # Use GDBM if the infodb type is empty or not one of the values above
294 require dbutil::gdbm;
295 return &dbutil::gdbm::write_infodb_rawentry($infodb_handle, $infodb_key, $infodb_val, @_);
296}
297
298
299
300sub delete_infodb_entry
301{
302 my $infodb_type = shift(@_);
303 my $infodb_handle = shift(@_);
304 my $infodb_key = shift(@_);
305
306 if ($infodb_type eq "sqlite")
307 {
308 require dbutil::sqlite;
309 return &dbutil::sqlite::delete_infodb_entry($infodb_handle, $infodb_key, @_);
310 }
311 elsif ($infodb_type eq "gdbm-txtgz")
312 {
313 require dbutil::gdbmtxtgz;
314 return &dbutil::gdbmtxtgz::delete_infodb_entry($infodb_handle, $infodb_key, @_);
315 }
316 elsif ($infodb_type eq "jdbm")
317 {
318 require dbutil::jdbm;
319 return &dbutil::jdbm::delete_infodb_entry($infodb_handle, $infodb_key, @_);
320 }
321 elsif ($infodb_type eq "mssql")
322 {
323 require dbutil::mssql;
324 return &dbutil::mssql::delete_infodb_entry($infodb_handle, $infodb_key, @_);
325 }
326
327 # Use GDBM if the infodb type is empty or not one of the values above
328 require dbutil::gdbm;
329 return &dbutil::gdbm::delete_infodb_entry($infodb_handle, $infodb_key, @_);
330}
331
332
333# ---- GENERAL FUNCTIONS --------
334
335sub convert_infodb_hash_to_string
336{
337 my $infodb_map = shift(@_);
338
339 my $infodb_entry_value = "";
340 foreach my $infodb_value_key (keys(%$infodb_map))
341 {
342 foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
343 {
344 $infodb_entry_value .= "<$infodb_value_key>" . $infodb_value . "\n";
345 }
346 }
347
348 return $infodb_entry_value;
349}
350
351
352sub convert_infodb_string_to_hash
353{
354 my $infodb_entry_value = shift(@_);
355 my $infodb_map = ();
356
357 if (!defined $infodb_entry_value) {
358 print STDERR "Warning: No value to convert into a infodb hashtable\n";
359 }
360 else {
361 while ($infodb_entry_value =~ /^<(.*?)>(.*)$/mg)
362 {
363 my $infodb_value_key = $1;
364 my $infodb_value = $2;
365
366 if (!defined($infodb_map->{$infodb_value_key}))
367 {
368 $infodb_map->{$infodb_value_key} = [ $infodb_value ];
369 }
370 else
371 {
372 push(@{$infodb_map->{$infodb_value_key}}, $infodb_value);
373 }
374 }
375 }
376
377 return $infodb_map;
378}
379
380
3811;
Note: See TracBrowser for help on using the repository browser.