comparison mayachemtools/lib/DBUtil.pm @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:73ae111cf86f
1 package DBUtil;
2 #
3 # $RCSfile: DBUtil.pm,v $
4 # $Date: 2015/02/28 20:47:02 $
5 # $Revision: 1.34 $
6 #
7 # Author: Manish Sud <msud@san.rr.com>
8 #
9 # Copyright (C) 2015 Manish Sud. All rights reserved.
10 #
11 # This file is part of MayaChemTools.
12 #
13 # MayaChemTools is free software; you can redistribute it and/or modify it under
14 # the terms of the GNU Lesser General Public License as published by the Free
15 # Software Foundation; either version 3 of the License, or (at your option) any
16 # later version.
17 #
18 # MayaChemTools is distributed in the hope that it will be useful, but without
19 # any warranty; without even the implied warranty of merchantability of fitness
20 # for a particular purpose. See the GNU Lesser General Public License for more
21 # details.
22 #
23 # You should have received a copy of the GNU Lesser General Public License
24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
26 # Boston, MA, 02111-1307, USA.
27 #
28
29 use strict;
30 use Exporter;
31 use Carp;
32 use DBI;
33 use TextUtil;
34
35 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
36
37 @ISA = qw(Exporter);
38 @EXPORT = qw(DBConnect DBDisconnect DBFetchSchemaTableNames DBSetupDescribeSQL DBSetupSelectSQL DBSQLToTextFile);
39 @EXPORT_OK = qw();
40 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]);
41
42 # Connect to a specified database...
43 sub DBConnect {
44 my($DBDriver, $DBName, $DBHost, $DBUser, $DBPassword) = @_;
45 my($DBHandle, $DataSource);
46
47 if ($DBDriver eq "Oracle") {
48 $DataSource = qq(DBI:$DBDriver:$DBHost);
49 }
50 else {
51 $DataSource = qq(DBI:$DBDriver:database=$DBName);
52 if ($DBHost) {
53 $DataSource .= qq(;host=$DBHost);
54 }
55 }
56
57 # Don't raise the error; otherwise, DBI functions termiates on encountering an error.
58 # All terminations decisions are made outside of DBI functions...
59 $DBHandle = DBI->connect($DataSource, $DBUser, $DBPassword, { RaiseError => 0, AutoCommit => 0 }) or croak "Couldn't connect to database...";
60
61 return $DBHandle;
62 }
63
64 # Disconnect from a database...
65 sub DBDisconnect {
66 my($DBHandle) = @_;
67
68 $DBHandle->disconnect or carp "Couldn't disconnect from a database...";
69 }
70
71 # Fetch all table name for a database schema...
72 sub DBFetchSchemaTableNames {
73 my($DBDriver, $DBHandle, $SchemaName) = @_;
74 my(@SchemaTableNames, $SQL, $SQLHandle);
75
76 @SchemaTableNames = ();
77
78 $SchemaName = (defined $SchemaName && length $SchemaName) ? $SchemaName : "";
79
80 if ($DBDriver eq "mysql") {
81 # Switch schemas...
82 $SQL = qq(USE $SchemaName);
83 $SQLHandle = $DBHandle->prepare($SQL) or return @SchemaTableNames;
84 $SQLHandle->execute or return @SchemaTableNames;
85 $SQLHandle->finish or return @SchemaTableNames;
86
87 # Setup to fetch table names...
88 $SQL = qq(SHOW TABLES);
89 }
90 elsif ($DBDriver eq "Oracle") {
91 $SQL = qq(SELECT SEGMENT_NAME FROM DBA_SEGMENTS WHERE OWNER = '$SchemaName' AND SEGMENT_TYPE = 'TABLE' ORDER BY SEGMENT_NAME);
92 }
93 elsif ($DBDriver =~ /^(Pg|Postgres)$/i) {
94 $SQL = qq(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '$SchemaName');
95 }
96 $SQLHandle = $DBHandle->prepare($SQL) or return @SchemaTableNames;
97 $SQLHandle->execute or return @SchemaTableNames;
98
99 my(@RowValues, $TableName);
100 while (@RowValues = $SQLHandle->fetchrow_array) {
101 $TableName = ($DBDriver =~ /^(mysql|Oracle)$/i) ? uc($RowValues[0]) : $RowValues[0];
102 if (defined $TableName && length $TableName) {
103 push @SchemaTableNames, $TableName;
104 }
105 }
106 $SQLHandle->finish or return @SchemaTableNames;
107
108 return @SchemaTableNames;
109 }
110
111 # Setup describe SQL statement...
112 sub DBSetupDescribeSQL {
113 my($DBDriver, $TableName, $SchemaName);
114 my($DescribeSQL);
115
116 $DBDriver = ""; $TableName = ""; $SchemaName = "";
117 if (@_ == 3) {
118 ($DBDriver, $TableName, $SchemaName) = @_;
119 }
120 else {
121 ($DBDriver, $TableName) = @_;
122 }
123 $TableName = (defined $TableName && length $TableName) ? $TableName : "";
124 $SchemaName = (defined $SchemaName && length $SchemaName) ? $SchemaName : "";
125
126 $DescribeSQL = ($SchemaName) ? ("DESCRIBE " . "$SchemaName" . ".$TableName") : "DESCRIBE $TableName";
127
128 if ($DBDriver eq "Oracle") {
129 $DescribeSQL = qq(SELECT COLUMN_NAME "Column_Name", DECODE(NULLABLE, 'N','Not Null','Y','Null') "Null", DATA_TYPE "Data_Type", DATA_LENGTH "Data_Length", DATA_PRECISION "Data_Precision" FROM DBA_TAB_COLUMNS WHERE TABLE_NAME = '$TableName');
130 if ($SchemaName) {
131 $DescribeSQL .= qq( AND OWNER = '$SchemaName');
132 }
133 $DescribeSQL .= qq( ORDER BY COLUMN_ID);
134 }
135 elsif ($DBDriver =~ /^(Pg|Postgres)$/i) {
136 $DescribeSQL = qq(SELECT COLUMN_NAME "Column_Name", data_type "Data_Type" FROM information_schema.columns WHERE table_name ='$TableName');
137 if ($SchemaName) {
138 $DescribeSQL .= " and table_schema = '$SchemaName'";
139 }
140 }
141
142 return $DescribeSQL;
143 }
144
145 # Setup describe SQL statement...
146 sub DBSetupSelectSQL {
147 my($DBDriver, $TableName, $SchemaName);
148 my($SelectSQL);
149
150 $DBDriver = ""; $TableName = ""; $SchemaName = "";
151 if (@_ == 3) {
152 ($DBDriver, $TableName, $SchemaName) = @_;
153 }
154 else {
155 ($DBDriver, $TableName) = @_;
156 }
157 $TableName = (defined $TableName && length $TableName) ? $TableName : "";
158 $SchemaName = (defined $SchemaName && length $SchemaName) ? $SchemaName : "";
159
160 $SelectSQL = ($SchemaName) ? ("SELECT * FROM " . "$SchemaName" . ".$TableName") : "SELECT * FROM $TableName";
161
162 return $SelectSQL;
163 }
164
165 # Prepare and execute a SQL statement and write out results into
166 # a text file.
167 sub DBSQLToTextFile {
168 my($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote, $ExportDataLabels, $ExportLOBs, $ReplaceNullStr);
169 my($SQLHandle, $Status);
170
171 $Status = 1;
172 $ExportDataLabels = 1;
173 $ExportLOBs = 0;
174 $ReplaceNullStr = "";
175 if (@_ == 8) {
176 ($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote, $ExportDataLabels, $ExportLOBs, $ReplaceNullStr) = @_;
177 }
178 elsif (@_ == 7) {
179 ($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote, $ExportDataLabels, $ExportLOBs) = @_;
180 }
181 elsif (@_ == 6) {
182 ($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote, $ExportDataLabels) = @_;
183 }
184 else {
185 ($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote) = @_;
186 }
187
188 # Execute SQL statement...
189 $SQLHandle = $DBHandle->prepare($SQL) or return $Status;
190 $SQLHandle->execute() or return $Status;
191
192 my($FieldsNum, @FieldNames, @RowValues, @ColNumsToExport, @ColLabels, $ColNum, $ColLabelsLine, @Values, $Value, $ValuesLine);
193
194 $Status = 0;
195 # Figure out which column numbers need to be exported...
196 $FieldsNum = $SQLHandle->{NUM_OF_FIELDS};
197 @FieldNames = @{$SQLHandle->{NAME}};
198 @ColNumsToExport = ();
199 if ($ExportLOBs) {
200 @ColNumsToExport = (0 .. $#FieldNames);
201 }
202 else {
203 my(@FieldTypes, @FieldTypeNames, $Type, $TypeName);
204 @FieldTypes = @{$SQLHandle->{TYPE}};
205 @FieldTypeNames = map { scalar $DBHandle->type_info($_)->{TYPE_NAME} } @FieldTypes;
206 for $ColNum (0 .. $#FieldNames) {
207 if ($FieldTypeNames[$ColNum] !~ /lob|bytea/i ) {
208 push @ColNumsToExport, $ColNum;
209 }
210 }
211 }
212
213 if ($ExportDataLabels) {
214 # Print out column labels...
215 @ColLabels = ();
216 for $ColNum (@ColNumsToExport) {
217 push @ColLabels, $FieldNames[$ColNum];
218 }
219 $ColLabelsLine = JoinWords(\@ColLabels, $OutDelim, $OutQuote);
220 print $TextFile "$ColLabelsLine\n";
221 }
222 # Print out row values...
223 while (@RowValues = $SQLHandle->fetchrow_array) {
224 @Values = ();
225 for $ColNum (@ColNumsToExport) {
226 if (defined($RowValues[$ColNum]) && length($RowValues[$ColNum])) {
227 $Value = $RowValues[$ColNum];
228 }
229 else {
230 $Value = $ReplaceNullStr ? $ReplaceNullStr : "";
231 }
232 push @Values, $Value;
233 }
234 $ValuesLine = JoinWords(\@Values, $OutDelim, $OutQuote);
235 print $TextFile "$ValuesLine\n";
236 }
237 $SQLHandle->finish or return $Status;
238 $Status = 0;
239
240 return $Status;
241 }
242
243 1;
244
245 __END__
246
247 =head1 NAME
248
249 DBUtil
250
251 =head1 SYNOPSIS
252
253 use DBUtil;
254
255 use DBUtil qw(:all);
256
257 =head1 DESCRIPTION
258
259 B<DBUtil> module provides the following functions:
260
261 DBConnect, DBDisconnect, DBFetchSchemaTableNames, DBSQLToTextFile,
262 DBSetupDescribeSQL, DBSetupSelectSQL
263
264 DBUtil package uses Perl DBI for interacting with MySQL Oracle, and PostgreSQL
265 databases.
266
267 =head1 FUNCTIONS
268
269 =over 4
270
271 =item B<DBConnect>
272
273 $DBHandle = DBConnect($DBDriver, $DBName, $DBHost, $DBUser, $DBPassword);
274
275 Connects to a database using specified parameters and returns a B<DBHandle>.
276
277 =item B<DBDisconnect>
278
279 DBDisconnect($DBHandle);
280
281 Disconnects from a database specified by I<DBHandle>.
282
283 =item B<DBFetchSchemaTableNames>
284
285 @SchemaTableNames = DBFetchSchemaTableNames($DBDriver, $DBHandle,
286 $SchemaName);
287
288 Returns an array of all the table names in a database I<SchemaName>.
289
290 =item B<DBSetupDescribeSQL>
291
292 $DescribeSQL = DBSetupDescribeSQL($DBDriver, $TableName, [$SchemaName]);
293
294 Sets up and returns a SQL statement to describe a table for MySQ, Oracle or PostgreSQL.
295
296 =item B<DBSetupSelectSQL>
297
298 $SelectSQL = DBSetupSelectSQL($DBDriver, $TableName, $SchemaName);
299
300 Sets up and returns a SQL statement to retrieve all columns from a table for MySQL,
301 Oracle, or PostgreSQL.
302
303 =item B<DBSQLToTextFile>
304
305 $Status = DBSQLToTextFile($DBHandle, $SQL, \*TEXTFILE, $OutDelim,
306 $OutQuote, [$ExportDataLabels, $ExportLOBs,
307 $ReplaceNullStr]);
308
309 Executes a I<SQL> statement and export all data into a text file.
310
311 =back
312
313 =head1 AUTHOR
314
315 Manish Sud <msud@san.rr.com>
316
317 =head1 COPYRIGHT
318
319 Copyright (C) 2015 Manish Sud. All rights reserved.
320
321 This file is part of MayaChemTools.
322
323 MayaChemTools is free software; you can redistribute it and/or modify it under
324 the terms of the GNU Lesser General Public License as published by the Free
325 Software Foundation; either version 3 of the License, or (at your option)
326 any later version.
327
328 =cut