Mercurial > repos > deepakjadmin > mayatool3_test3
diff mayachemtools/lib/DBUtil.pm @ 0:73ae111cf86f draft
Uploaded
author | deepakjadmin |
---|---|
date | Wed, 20 Jan 2016 11:55:01 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mayachemtools/lib/DBUtil.pm Wed Jan 20 11:55:01 2016 -0500 @@ -0,0 +1,328 @@ +package DBUtil; +# +# $RCSfile: DBUtil.pm,v $ +# $Date: 2015/02/28 20:47:02 $ +# $Revision: 1.34 $ +# +# Author: Manish Sud <msud@san.rr.com> +# +# Copyright (C) 2015 Manish Sud. All rights reserved. +# +# This file is part of MayaChemTools. +# +# MayaChemTools is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 3 of the License, or (at your option) any +# later version. +# +# MayaChemTools is distributed in the hope that it will be useful, but without +# any warranty; without even the implied warranty of merchantability of fitness +# for a particular purpose. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or +# write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, +# Boston, MA, 02111-1307, USA. +# + +use strict; +use Exporter; +use Carp; +use DBI; +use TextUtil; + +use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + +@ISA = qw(Exporter); +@EXPORT = qw(DBConnect DBDisconnect DBFetchSchemaTableNames DBSetupDescribeSQL DBSetupSelectSQL DBSQLToTextFile); +@EXPORT_OK = qw(); +%EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); + +# Connect to a specified database... +sub DBConnect { + my($DBDriver, $DBName, $DBHost, $DBUser, $DBPassword) = @_; + my($DBHandle, $DataSource); + + if ($DBDriver eq "Oracle") { + $DataSource = qq(DBI:$DBDriver:$DBHost); + } + else { + $DataSource = qq(DBI:$DBDriver:database=$DBName); + if ($DBHost) { + $DataSource .= qq(;host=$DBHost); + } + } + + # Don't raise the error; otherwise, DBI functions termiates on encountering an error. + # All terminations decisions are made outside of DBI functions... + $DBHandle = DBI->connect($DataSource, $DBUser, $DBPassword, { RaiseError => 0, AutoCommit => 0 }) or croak "Couldn't connect to database..."; + + return $DBHandle; +} + +# Disconnect from a database... +sub DBDisconnect { + my($DBHandle) = @_; + + $DBHandle->disconnect or carp "Couldn't disconnect from a database..."; +} + +# Fetch all table name for a database schema... +sub DBFetchSchemaTableNames { + my($DBDriver, $DBHandle, $SchemaName) = @_; + my(@SchemaTableNames, $SQL, $SQLHandle); + + @SchemaTableNames = (); + + $SchemaName = (defined $SchemaName && length $SchemaName) ? $SchemaName : ""; + + if ($DBDriver eq "mysql") { + # Switch schemas... + $SQL = qq(USE $SchemaName); + $SQLHandle = $DBHandle->prepare($SQL) or return @SchemaTableNames; + $SQLHandle->execute or return @SchemaTableNames; + $SQLHandle->finish or return @SchemaTableNames; + + # Setup to fetch table names... + $SQL = qq(SHOW TABLES); + } + elsif ($DBDriver eq "Oracle") { + $SQL = qq(SELECT SEGMENT_NAME FROM DBA_SEGMENTS WHERE OWNER = '$SchemaName' AND SEGMENT_TYPE = 'TABLE' ORDER BY SEGMENT_NAME); + } + elsif ($DBDriver =~ /^(Pg|Postgres)$/i) { + $SQL = qq(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '$SchemaName'); + } + $SQLHandle = $DBHandle->prepare($SQL) or return @SchemaTableNames; + $SQLHandle->execute or return @SchemaTableNames; + + my(@RowValues, $TableName); + while (@RowValues = $SQLHandle->fetchrow_array) { + $TableName = ($DBDriver =~ /^(mysql|Oracle)$/i) ? uc($RowValues[0]) : $RowValues[0]; + if (defined $TableName && length $TableName) { + push @SchemaTableNames, $TableName; + } + } + $SQLHandle->finish or return @SchemaTableNames; + + return @SchemaTableNames; +} + +# Setup describe SQL statement... +sub DBSetupDescribeSQL { + my($DBDriver, $TableName, $SchemaName); + my($DescribeSQL); + + $DBDriver = ""; $TableName = ""; $SchemaName = ""; + if (@_ == 3) { + ($DBDriver, $TableName, $SchemaName) = @_; + } + else { + ($DBDriver, $TableName) = @_; + } + $TableName = (defined $TableName && length $TableName) ? $TableName : ""; + $SchemaName = (defined $SchemaName && length $SchemaName) ? $SchemaName : ""; + + $DescribeSQL = ($SchemaName) ? ("DESCRIBE " . "$SchemaName" . ".$TableName") : "DESCRIBE $TableName"; + + if ($DBDriver eq "Oracle") { + $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'); + if ($SchemaName) { + $DescribeSQL .= qq( AND OWNER = '$SchemaName'); + } + $DescribeSQL .= qq( ORDER BY COLUMN_ID); + } + elsif ($DBDriver =~ /^(Pg|Postgres)$/i) { + $DescribeSQL = qq(SELECT COLUMN_NAME "Column_Name", data_type "Data_Type" FROM information_schema.columns WHERE table_name ='$TableName'); + if ($SchemaName) { + $DescribeSQL .= " and table_schema = '$SchemaName'"; + } + } + + return $DescribeSQL; +} + +# Setup describe SQL statement... +sub DBSetupSelectSQL { + my($DBDriver, $TableName, $SchemaName); + my($SelectSQL); + + $DBDriver = ""; $TableName = ""; $SchemaName = ""; + if (@_ == 3) { + ($DBDriver, $TableName, $SchemaName) = @_; + } + else { + ($DBDriver, $TableName) = @_; + } + $TableName = (defined $TableName && length $TableName) ? $TableName : ""; + $SchemaName = (defined $SchemaName && length $SchemaName) ? $SchemaName : ""; + + $SelectSQL = ($SchemaName) ? ("SELECT * FROM " . "$SchemaName" . ".$TableName") : "SELECT * FROM $TableName"; + + return $SelectSQL; +} + +# Prepare and execute a SQL statement and write out results into +# a text file. +sub DBSQLToTextFile { + my($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote, $ExportDataLabels, $ExportLOBs, $ReplaceNullStr); + my($SQLHandle, $Status); + + $Status = 1; + $ExportDataLabels = 1; + $ExportLOBs = 0; + $ReplaceNullStr = ""; + if (@_ == 8) { + ($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote, $ExportDataLabels, $ExportLOBs, $ReplaceNullStr) = @_; + } + elsif (@_ == 7) { + ($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote, $ExportDataLabels, $ExportLOBs) = @_; + } + elsif (@_ == 6) { + ($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote, $ExportDataLabels) = @_; + } + else { + ($DBHandle, $SQL, $TextFile, $OutDelim, $OutQuote) = @_; + } + + # Execute SQL statement... + $SQLHandle = $DBHandle->prepare($SQL) or return $Status; + $SQLHandle->execute() or return $Status; + + my($FieldsNum, @FieldNames, @RowValues, @ColNumsToExport, @ColLabels, $ColNum, $ColLabelsLine, @Values, $Value, $ValuesLine); + + $Status = 0; + # Figure out which column numbers need to be exported... + $FieldsNum = $SQLHandle->{NUM_OF_FIELDS}; + @FieldNames = @{$SQLHandle->{NAME}}; + @ColNumsToExport = (); + if ($ExportLOBs) { + @ColNumsToExport = (0 .. $#FieldNames); + } + else { + my(@FieldTypes, @FieldTypeNames, $Type, $TypeName); + @FieldTypes = @{$SQLHandle->{TYPE}}; + @FieldTypeNames = map { scalar $DBHandle->type_info($_)->{TYPE_NAME} } @FieldTypes; + for $ColNum (0 .. $#FieldNames) { + if ($FieldTypeNames[$ColNum] !~ /lob|bytea/i ) { + push @ColNumsToExport, $ColNum; + } + } + } + + if ($ExportDataLabels) { + # Print out column labels... + @ColLabels = (); + for $ColNum (@ColNumsToExport) { + push @ColLabels, $FieldNames[$ColNum]; + } + $ColLabelsLine = JoinWords(\@ColLabels, $OutDelim, $OutQuote); + print $TextFile "$ColLabelsLine\n"; + } + # Print out row values... + while (@RowValues = $SQLHandle->fetchrow_array) { + @Values = (); + for $ColNum (@ColNumsToExport) { + if (defined($RowValues[$ColNum]) && length($RowValues[$ColNum])) { + $Value = $RowValues[$ColNum]; + } + else { + $Value = $ReplaceNullStr ? $ReplaceNullStr : ""; + } + push @Values, $Value; + } + $ValuesLine = JoinWords(\@Values, $OutDelim, $OutQuote); + print $TextFile "$ValuesLine\n"; + } + $SQLHandle->finish or return $Status; + $Status = 0; + + return $Status; +} + +1; + +__END__ + +=head1 NAME + +DBUtil + +=head1 SYNOPSIS + +use DBUtil; + +use DBUtil qw(:all); + +=head1 DESCRIPTION + +B<DBUtil> module provides the following functions: + +DBConnect, DBDisconnect, DBFetchSchemaTableNames, DBSQLToTextFile, +DBSetupDescribeSQL, DBSetupSelectSQL + +DBUtil package uses Perl DBI for interacting with MySQL Oracle, and PostgreSQL +databases. + +=head1 FUNCTIONS + +=over 4 + +=item B<DBConnect> + + $DBHandle = DBConnect($DBDriver, $DBName, $DBHost, $DBUser, $DBPassword); + +Connects to a database using specified parameters and returns a B<DBHandle>. + +=item B<DBDisconnect> + + DBDisconnect($DBHandle); + +Disconnects from a database specified by I<DBHandle>. + +=item B<DBFetchSchemaTableNames> + + @SchemaTableNames = DBFetchSchemaTableNames($DBDriver, $DBHandle, + $SchemaName); + +Returns an array of all the table names in a database I<SchemaName>. + +=item B<DBSetupDescribeSQL> + + $DescribeSQL = DBSetupDescribeSQL($DBDriver, $TableName, [$SchemaName]); + +Sets up and returns a SQL statement to describe a table for MySQ, Oracle or PostgreSQL. + +=item B<DBSetupSelectSQL> + + $SelectSQL = DBSetupSelectSQL($DBDriver, $TableName, $SchemaName); + +Sets up and returns a SQL statement to retrieve all columns from a table for MySQL, +Oracle, or PostgreSQL. + +=item B<DBSQLToTextFile> + + $Status = DBSQLToTextFile($DBHandle, $SQL, \*TEXTFILE, $OutDelim, + $OutQuote, [$ExportDataLabels, $ExportLOBs, + $ReplaceNullStr]); + +Executes a I<SQL> statement and export all data into a text file. + +=back + +=head1 AUTHOR + +Manish Sud <msud@san.rr.com> + +=head1 COPYRIGHT + +Copyright (C) 2015 Manish Sud. All rights reserved. + +This file is part of MayaChemTools. + +MayaChemTools is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) +any later version. + +=cut