package CallExternals;

#**************************************************************
#  
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
#  
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#  
#**************************************************************



use English;
use warnings;
use strict;
use loghelper;

BEGIN {
    use Exporter   ();
    our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);

    $VERSION     = 1.00;
    # if using RCS/CVS, this may be preferred
    $VERSION = do { my @r = (q$Revision: 1.29 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
    @ISA         = qw(Exporter);
    @EXPORT      = qw(&callphp &getPHPExecutable &ExecSQL &callperl &getPerlExecutable &calljava &setJavaExecutable &getJavaExecutable &setToolsPath &quote &quoteIfNeed &set_logfile &close_logfile );
    %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
    # your exported package globals go here,
    # as well as any optionally exported functions
    @EXPORT_OK   = ( ); # qw($Var1 %Hashit &func3);
}

# ------------------------------------------------------------------------------
# small helper, which replaces the return code
sub errorAdaption($)
{
    my $error = shift;
    if ($error != 0)
    {
        $error = $error / 256;
    }
    if ($error > 127)
    {
        $error = $error - 256;
    }
    return $error;
}
# ------------------------------------------------------------------------------
# helper to call external php with popen
sub callphp($$$)
{
    local *IN_FILE;
    my $phpexe = shift;
    my $phpprogram = shift;
    my $sParams = shift;
    my $line;
    my $error;
    my @result;

    # print "Will send: $phpexe $sParams\n";
    # log_print("CALLPHP: $phpexe $phpprogram $sParams\n");
#    if (open(IN_FILE, "$phpexe $sParams 2>&1 |"))
    if (open(IN_FILE, "$phpexe $phpprogram $sParams |"))
    {
        while ($line = <IN_FILE>)
        {
            chomp($line);
            # $line .= " ";
            push(@result, $line);
            # print "callphp output: $line\n";
        }
        close(IN_FILE);
        $error = errorAdaption($?);
    }
    else
    {
        print "callphp(): Can't popen '$phpexe' with parameter: '$sParams'\n";
        $error = 1;
    }
    return $error, @result;
}

# ------------------------------------------------------------------------------
sub getPHPExecutable()
{
    my $phpexe;
    if ($OSNAME eq "solaris")
    {
        $phpexe = "php5";
    }
    elsif ($OSNAME eq "linux")
    {
        if ( -e "/usr/bin/php5") # Suse :-(
        {
            $phpexe = "php5";
        }
        elsif ( -e "/usr/bin/php") # Gentoo
        {
            $phpexe = "php";
        }
        else
        {
            print "getPHPExecutable(): no php exec found.\n";
        }
    }
    elsif ( $OSNAME eq "MSWin32" )
    {
        $phpexe = "C:/programme/php/php.exe";
        # add second try (xampp)
        if (! -e $phpexe)
        {
            $phpexe = "C:/xampp/php/php.exe";
        }
    }
    elsif ( $OSNAME eq "cygwin" )
    {
        $phpexe = "/cygdrive/c/programme/php/php";
    }
    else
    {
        print "getPHPExecutable(): unknown environment. ($OSNAME)\n";
    }
    if (! $phpexe)
    {
        print "getPHPExecutable(): ERROR: php executable not found.\n";
        exit(1);
    }
    return $phpexe;
}
# ------------------------------------------------------------------------------
# helper to call external java with popen
sub calljava($$$)
{
    local *IN_FILE;
    my $javaexe = shift;
    my $sParams = shift;
    my $sDebug = shift;
    my $line;
    my $error = 1;

    if (! $javaexe)
    {
        log_print("ERROR: javaexe not set.\n");
        return;
    }
    if (! $sDebug)
    {
        $sDebug = "";
    }
    $javaexe = quoteIfNeed($javaexe);
    log_print ("CALLJAVA: $javaexe $sDebug $sParams\n");
    if (open(IN_FILE, "$javaexe $sDebug $sParams 2>&1 |"))
    {
        while ($line = <IN_FILE>)
        {
            chomp($line);
            log_print ("- $line\n");
        }
        close(IN_FILE);
        $error = errorAdaption($?);
    }
    else
    {
        log_print ("calljava(): Can't popen '$javaexe' with parameter '$sParams'\n");
        $error = 1;
    }
    return $error;
}

# ------------------------------------------------------------------------------
sub getPerlExecutable()
{
    my $perlexe;
    if ( $ENV{PERL} )
    {
        $perlexe = $ENV{PERL};
    }
    elsif ( $ENV{PERLEXE} )
    {
        $perlexe = $ENV{PERLEXE};
    }
    else
    {
        if ($OSNAME eq "MSWin32")
        {
            $perlexe="C:/xampp/perl/bin/perl.exe";
            if (! -e $perlexe)
            {
                $perlexe="r:/btw/perl/bin/perl";
            }
            if (! -e $perlexe)
            {
                $perlexe="C:/Programme/Perl/bin/perl.exe";
            }
        }
        elsif ($OSNAME eq "cygwin")
        {
            $perlexe = "perl";
        }
        elsif ($OSNAME eq "solaris")
        {
            $perlexe="/so/env/bt_solaris_intel/bin/perl";
        }
        elsif ($OSNAME eq "linux")
        {
            $perlexe="/so/env/bt_linux_libc2.32/DEV300/bin/perl";
        }
        else
        {
            log_print "WARNING: Use only the fallback of perl executable.\n";
            $perlexe = "perl"; # FALLBACK
        }
    }
    if ( ! -e $perlexe)
    {
        log_print "getPerlExecutable(): There exist no perl executable.\n";
        exit(1);
    }
    return $perlexe;
}
# ------------------------------------------------------------------------------
# helper to call external perl with popen
sub callperl($$$)
{
    local *IN_FILE;
    my $perlexe = shift;
    my $perlprogram = shift;
    my $sParams = shift;
    my $line;
    my $error;
    
    log_print("CALLPERL: $perlexe $perlprogram $sParams\n");
#    if (open(IN_FILE, "$perlexe $sParams 2>&1 |"))
    if (open(IN_FILE, "$perlexe $perlprogram $sParams |"))
    {
        while ($line = <IN_FILE>)
        {
            chomp($line);
            log_print ("- $line\n");
        }
        close(IN_FILE);
        $error = errorAdaption($?);
    }
    else
    {
        log_print ("Can't popen '$perlexe' with parameter: '$sParams'\n");
        $error = 1;
    }
    return $error;
}
# ------------------------------------------------------------------------------
our $sJavaExecutable;
sub setJavaExecutable($)
{
    $sJavaExecutable = shift;
}

# sub getJava14()
# {
#     my $sJava14;
#     if ($OSNAME eq "MSWin32")
#     {
#         if ($sJavaExecutable) 
#         {
#             $sJava14 = $sJavaExecutable;
#         }
#         else
#         {
#             # HARDCODE!
#             $sJava14 = "C:\\Programme\\Java\\j2re1.4.2_10\\bin\\java.exe";
#         }
#     }
#     else
#     {
#         if ($sJavaExecutable)
#         {
#             $sJava14 = $sJavaExecutable;
#         }
#         else
#         {
#             # HARDCODE!
#             $sJava14 = "/opt/java14/bin/java";
#         }
#     }
#     if ( ! -e $sJava14 )
#     {
#         log_print ("Java14 not found. Is searched in '$sJava14'\n");
#         # exit(1);
#         return "";
#     }
#     return $sJava14;
# }
# ------------------------------------------------------------------------------
sub getJava15()
{
    my $sJava15;
    if ($sJavaExecutable) 
    {
        $sJava15 = $sJavaExecutable;
    }
    else
    {
        if ($OSNAME eq "MSWin32")
        {
            # HARDCODE!
            $sJava15 = "C:\\Programme\\Java\\jre1.5.0_22\\bin\\java.exe";
            if ( ! -e $sJava15)
            {
                $sJava15 = "C:\\Program Files\\Java\\jre6\\bin\\java.exe";
            }
            if ( ! -e $sJava15)
            {
                $sJava15 = "C:\\Java\\jdk1.6\\bin\\java.exe";
            }
        }
        elsif ($OSNAME eq "cygwin")
        {
            $sJava15 = "java";
        }
        else
        {
            # HARDCODE!
            if ($OSNAME eq "solaris")
            {
                $sJava15 = "/usr/bin/java";
            }
            else
            {
                $sJava15 = "/usr/bin/java";
                if ( ! -e $sJava15 )
                {
                    $sJava15 = "/opt/java15/bin/java";
                }
            }
        }
        if ( ! -e $sJava15 )
        {
            log_print ("Java15 not found. Is searched in '$sJava15'\n");
            # exit(1);
            return "";
        }
    }
    return $sJava15;
}
# ------------------------------------------------------------------------------
sub getJava16()
{
    my $sJava16;
    if ($sJavaExecutable) 
    {
        $sJava16 = $sJavaExecutable;
    }
    else
    {
        if ($OSNAME eq "MSWin32")
        {
            # HARDCODE!
            $sJava16 = "C:\\Programme\\Java\\jre1.6.0_16\\bin\\java.exe";
            if ( ! -e $sJava16)
            {
                $sJava16 = "C:\\Program Files\\Java\\jre6\\bin\\java.exe";
            }
            if ( ! -e $sJava16)
            {
                $sJava16 = "C:\\Java\\jdk1.6\\bin\\java.exe";
            }
            # }
        }
        elsif ($OSNAME eq "cygwin")
        {
            # $sJava16 = "java";
            $sJava16 = "C:/Program Files/Java/jdk1.6.0_16/bin/java.exe";
        }
        else
        {
            # HARDCODE!
            if ($OSNAME eq "solaris")
            {
                $sJava16 = "/usr/bin/java";
            }
            else
            {
                $sJava16 = "/usr/bin/java";
                if ( ! -e $sJava16 )
                {
                    $sJava16 = "/opt/java16/bin/java";
                }
            }
        }
        if ( ! -e $sJava16 )
        {
            log_print ("Java16 not found. Is searched in '$sJava16'\n");
            # exit(1);
            return "";
        }
    }
    return $sJava16;
}
    
# ------------------------------------------------------------------------------
sub getJavaExecutable()
{
    return getJava16();
}

# ------------------------------------------------------------------------------
# this function is a helper for parameters
# if quotes the whole string with 'STR' or "STR" and replace quotes in it's content for the right.
sub singleQuote($)
{
    my $sStr = shift;
    if ( $OSNAME eq "MSWin32")
    {
        # we are MSWin32 (quote \" stronger)
        # $sStr =~ s/\'/\"/g;
        $sStr =~ s/\'/\\\"/g;
        return "\"" . $sStr . "\"";
    }
    else
    {
        if (index($sStr, "'") >= 0)
        {
            # replace all single quotes ("'") by "\""
            $sStr =~ s/\'/\"/g;
        }
    }
    return "'" . $sStr . "'";
}

sub quote($)
{
    my $sName = shift;
    return "\"" . $sName . "\"";
}

sub quoteIfNeed($)
{
    my $sName = shift;
    if (-1 != index($sName, " "))
    {
        return quote($sName);
    }
    return $sName;
}


# ------------------------------------------------------------------------------
our $sToolsPath;
sub setToolsPath($)
{
    my $sNewPath = shift;
    $sToolsPath = $sNewPath;
}

sub ExecSQL($)
{
    my $sSQL = shift;

    my $error;
    my @aResult;
    my $sSQLDirect;
    if ($sToolsPath)
    {
        $sSQLDirect = $sToolsPath;
        $sSQLDirect .= "/";
    }
    $sSQLDirect .= "sql_direct.php";

    # select(undef, undef, undef, 0.060);
    # log_print("ExecSQL: $sSQL\n");
    # sleep (1);
    ($error, @aResult) = callphp(getPHPExecutable(), $sSQLDirect, singleQuote($sSQL));
    if ($error)
    {
        log_print ("ExecSQL: An Error occurred.\n");
        log_print ("PHP: " . getPHPExecutable() . "\n");
        log_print ("SQL Statement: " . singleQuote($sSQL) . "\n");
        # exit(1);
    }
    # select(undef, undef, undef, 0.125);
    # sleep (1);
    return @aResult;
}

# ------------------------------------------------------------------------------
# helper to call external php with popen
# sub callexe($$$)
# {
#     local *IN_FILE;
#     my $exe = shift;
#     my $program = shift;
#     my $sParams = shift;
#     my $line;
#     my $error;
#     my @result;
# 
#     $exe = quoteIfNeed($exe);
#     $program = quoteIfNeed($program);
# 
#     # print "Will send: $exe $sParams\n";
#     # log_print("CALLEXE: $exe $program $sParams\n");
#     if (open(IN_FILE, "$exe $program $sParams |"))
#     {
#         while ($line = <IN_FILE>)
#         {
#             chomp($line);
#             # $line .= " ";
#             push(@result, $line);
#             # print "callphp output: $line\n";
#         }
#         close(IN_FILE);
#         $error = errorAdaption($?);
#     }
#     else
#     {
#         print "Can't popen '$exe' with parameter: '$sParams'\n";
#         $error = 1;
#     }
#     return $error, @result;
# }

1;
