зеркало из https://github.com/mozilla/pjs.git
a generic interface to get data from oracle. Currently only tested with
PVCS Dimensions.
This commit is contained in:
Родитель
113f893e3a
Коммит
d860f16166
|
@ -0,0 +1,169 @@
|
||||||
|
# -*- Mode: perl; indent-tabs-mode: nil -*-
|
||||||
|
#
|
||||||
|
|
||||||
|
# Isolate the calls to oracle for PVCS we may need to reuse these with
|
||||||
|
# other oracle products some day.
|
||||||
|
|
||||||
|
# The contents of this file are subject to the Mozilla Public
|
||||||
|
# License Version 1.1 (the "License"); you may not use this file
|
||||||
|
# except in compliance with the License. You may obtain a copy of
|
||||||
|
# the License at http://www.mozilla.org/NPL/
|
||||||
|
#
|
||||||
|
# Software distributed under the License is distributed on an "AS
|
||||||
|
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
# implied. See the License for the specific language governing
|
||||||
|
# rights and limitations under the License.
|
||||||
|
#
|
||||||
|
# The Original Code is the Tinderbox build tool.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
# Corporation. Portions created by Netscape are
|
||||||
|
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
# Rights Reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
# complete rewrite by Ken Estes for contact info see the
|
||||||
|
# mozilla/webtools/tinderbox2/Contact file.
|
||||||
|
# Contributor(s):
|
||||||
|
|
||||||
|
|
||||||
|
# $Revision: 1.1 $
|
||||||
|
# $Date: 2003-12-23 13:24:29 $
|
||||||
|
# $Author: kestes%walrus.com $
|
||||||
|
# $Source: /home/jrmuizel/cvs-mirror/mozilla/webtools/tinderbox2/src/lib/PVCSGetData.pm,v $
|
||||||
|
# $Name: $
|
||||||
|
|
||||||
|
|
||||||
|
# Standard perl libraries
|
||||||
|
|
||||||
|
package PVCSGetData;
|
||||||
|
|
||||||
|
use Time::Local;
|
||||||
|
|
||||||
|
|
||||||
|
$SQL_USER = $TinderConfig::VC_PVCS_USER || 'tinderbox/tinderbox';
|
||||||
|
$SEP = $TinderConfig::VC_PVCS_SEPERATOR || '___///___';
|
||||||
|
|
||||||
|
sub time2pvcsFormat {
|
||||||
|
# convert time() format to the format which appears in perforce output
|
||||||
|
my ($time) = @_;
|
||||||
|
|
||||||
|
my ($sec,$min,$hour,$mday,$mon,
|
||||||
|
$year,$wday,$yday,$isdst) =
|
||||||
|
localtime($time);
|
||||||
|
|
||||||
|
$year += 1900;
|
||||||
|
$mon++;
|
||||||
|
|
||||||
|
my $date_str = sprintf("%04u/%02u/%02u/%02u/%02u/%02u",
|
||||||
|
$year, $mon, $mday, $hour, $min, $sec);
|
||||||
|
|
||||||
|
return ($date_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub pvcs_date_str2time {
|
||||||
|
my ($pvcs_date_str) = @_;
|
||||||
|
|
||||||
|
my ($year, $mon, $mday, $hour, $min, $sec) =
|
||||||
|
split('/', $pvcs_date_str);
|
||||||
|
|
||||||
|
$mon--;
|
||||||
|
|
||||||
|
my ($time) = timelocal($sec,$min,$hour,$mday,$mon,$year);
|
||||||
|
|
||||||
|
return $time;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub pvcs_trim_whitespace {
|
||||||
|
my ($line) = (@_);
|
||||||
|
|
||||||
|
$line =~ s{\t+}{}g;
|
||||||
|
$line =~ s{\n+}{}g;
|
||||||
|
$line =~ s{ +}{}g;
|
||||||
|
|
||||||
|
return $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Adapted from oraselect()
|
||||||
|
# code by Ulrich Herbst <Ulrich.Herbst@gmx.de>
|
||||||
|
# found at
|
||||||
|
# http://servdoc.sourceforge.net/docs/pod/ServDoc_0310oracle.pod.html
|
||||||
|
|
||||||
|
sub get_oraselect_separator {
|
||||||
|
return $SEP;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub oraselect {
|
||||||
|
my ($sqltable) = @_;
|
||||||
|
|
||||||
|
my $tmpfile = "/tmp/oracle.$$.sql";
|
||||||
|
my $SQLCMD = 'sqlplus';
|
||||||
|
$OSNAME = $^O;
|
||||||
|
|
||||||
|
if ($OSNAME =~ /MSWin32/) {
|
||||||
|
$SQLCMD='plus80';
|
||||||
|
$tmpfile='c:\TEMP\oracle.$$.sql';
|
||||||
|
$ADDTOPATH="$ENV{ORACLE_HOME}\\bin;";
|
||||||
|
}
|
||||||
|
|
||||||
|
# We don't use pipes to input sqlplus because that doesn't work
|
||||||
|
# for windows.
|
||||||
|
|
||||||
|
my $sqlheader = <<"EOSQL";
|
||||||
|
|
||||||
|
set pages 0
|
||||||
|
set pagesize 10000
|
||||||
|
set linesize 10000
|
||||||
|
|
||||||
|
set heading off
|
||||||
|
set feedback off
|
||||||
|
set serveroutput on
|
||||||
|
|
||||||
|
set colsep '$SEP'
|
||||||
|
alter session set NLS_DATE_FORMAT='yyyy/mm/dd/hh24/mi/ss';
|
||||||
|
|
||||||
|
EOSQL
|
||||||
|
;
|
||||||
|
|
||||||
|
open TEMPFH, ">$tmpfile";
|
||||||
|
print TEMPFH "$sqlheader\n";
|
||||||
|
print TEMPFH "$sqltable\n";
|
||||||
|
print TEMPFH "$select; \n";
|
||||||
|
print TEMPFH "exit;\n";
|
||||||
|
close TEMPFH;
|
||||||
|
|
||||||
|
my $executestring;
|
||||||
|
if ($OSNAME =~ /MSWin32/) {
|
||||||
|
$executestring = "$SQLCMD -s '$SQL_USER' \@$tmpfile 2>&1";
|
||||||
|
} else {
|
||||||
|
$executestring =
|
||||||
|
"source /etc/profile; ".
|
||||||
|
"$SQLCMD -s \'$SQL_USER\' \@$tmpfile 2>&1";
|
||||||
|
}
|
||||||
|
|
||||||
|
my @sqlout=`$executestring`;
|
||||||
|
|
||||||
|
# I do not thin sqlplus ever returns non zero, but I wish to be
|
||||||
|
# complete to I check it. Real errors are harder to discribe, we
|
||||||
|
# use pattern matching to find strings like:
|
||||||
|
|
||||||
|
# SP2-0042: unknown command "asdf" - rest of line ignored.
|
||||||
|
# ORA-00923: FROM keyword not found where expected
|
||||||
|
|
||||||
|
my $rc = $?;
|
||||||
|
if (
|
||||||
|
($rc) ||
|
||||||
|
("@sqlout" =~ m/\nERROR at line /) ||
|
||||||
|
("@sqlout" =~ m/\n[A-Z0-9]+\-\d+\:/) ||
|
||||||
|
0) {
|
||||||
|
die(@sqlout);
|
||||||
|
}
|
||||||
|
|
||||||
|
unlink ($tmpfile);
|
||||||
|
|
||||||
|
|
||||||
|
return \@sqlout;
|
||||||
|
} # oraselect
|
||||||
|
|
||||||
|
1;
|
Загрузка…
Ссылка в новой задаче