#!/usr/bin/perl
package RVL::DB;
# WebSite: http://www.rvglobalsoft.com
# Unauthorized copying is strictly forbidden and may result in severe legal action.
# Copyright (c) 2013 RV Global Soft Co.,Ltd. All rights reserved.
#
# =====YOU MUST KEEP THIS COPYRIGHTS NOTICE INTACT AND CAN NOT BE REMOVE =======
# Copyright (c) 2013 RV Global Soft Co.,Ltd. All rights reserved.
# This Agreement is a legal contract, which specifies the terms of the license
# and warranty limitation between you and RV Global Soft Co.,Ltd. and RV2Factor Product for RV Global Soft.
# You should carefully read the following terms and conditions before
# installing or using this software. Unless you have a different license
# agreement obtained from RV Global Soft Co.,Ltd., installation or use of this software
# indicates your acceptance of the license and warranty limitation terms
# contained in this Agreement. If you do not agree to the terms of this
# Agreement, promptly delete and destroy all copies of the Software.
#
# ===== Grant of License =======
# The Software may only be installed and used on a single host machine.
#
# ===== Disclaimer of Warranty =======
# THIS SOFTWARE AND ACCOMPANYING DOCUMENTATION ARE PROVIDED "AS IS" AND
# WITHOUT WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR ANY OTHER
# WARRANTIES WHETHER EXPRESSED OR IMPLIED. BECAUSE OF THE VARIOUS HARDWARE
# AND SOFTWARE ENVIRONMENTS INTO WHICH RV SITE BUILDER MAY BE USED, NO WARRANTY OF
# FITNESS FOR A PARTICULAR PURPOSE IS OFFERED. THE USER MUST ASSUME THE
# ENTIRE RISK OF USING THIS PROGRAM. ANY LIABILITY OF RV GLOBAL SOFT CO.,LTD. WILL BE
# LIMITED EXCLUSIVELY TO PRODUCT REPLACEMENT OR REFUND OF PURCHASE PRICE.
# IN NO CASE SHALL RV GLOBAL SOFT CO.,LTD. BE LIABLE FOR ANY INCIDENTAL, SPECIAL OR
# CONSEQUENTIAL DAMAGES OR LOSS, INCLUDING, WITHOUT LIMITATION, LOST PROFITS
# OR THE INABILITY TO USE EQUIPMENT OR ACCESS DATA, WHETHER SUCH DAMAGES ARE
# BASED UPON A BREACH OF EXPRESS OR IMPLIED WARRANTIES, BREACH OF CONTRACT,
# NEGLIGENCE, STRICT TORT, OR ANY OTHER LEGAL THEORY. THIS IS TRUE EVEN IF
# RV GLOBAL SOFT CO.,LTD. IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO CASE WILL
# RV GLOBAL SOFT CO.,LTD.'S LIABILITY EXCEED THE AMOUNT OF THE LICENSE FEE ACTUALLY PAID
# BY LICENSEE TO RV GLOBAL SOFT CO.,LTD.
# ===============================
use strict;
use warnings;
use DBI;
use define RVL_DSN_HASH => 0;
use define RVL_DSN_STRING => 1;
use Class::Std::Utils;
{
sub new {
RVL::logMessage('', __CONSTANT__::RVL_LOG_DEBUG);
my ($class, $opt) = @_;
my (%hash);
# dns = dbi:TYPE:database=DATABASE_NAME;host=HOSTNAME:PORT://USERNAME@PASSOWD
my ($this) = bless( \%hash, $class);
my ($dsn, $userpass) = split(/:\/\//, $opt->{dsn}, 2);
my ($user, $passwd) = split(/@/, $userpass, 2);
$this->{DBI} = DBI->connect($dsn, $user, $passwd, {
Callbacks => {
PrintError => 1,
PrintWarn => 1,
connected => sub {
my ($c) = RVL::Config::singleton();
my ($conf) = $c->getAll();
if (defined $conf->{'db'}->{'postConnect'} && $conf->{'db'}->{'postConnect'} ne '') {
shift->do(q{$conf->{'db'}->{'postConnect'};});
}
return;
},
}
});
return $this;
}
sub singleton {
RVL::logMessage('', __CONSTANT__::RVL_LOG_DEBUG);
my ($dsn) = @_;
my ($class) = __PACKAGE__;
my ($msg) = 'Cannot connect to DB, check your credentials, exiting ...';
my ($c) = RVL::Config::singleton();
my ($conf) = $c->getAll();
$dsn = (!defined($dsn) || $dsn eq '' || !$dsn) ? RVL::DB::_getDsnAsString($conf) : $dsn;
if (!defined $RVL::INSTANCE{$class}{$dsn}) {
$RVL::INSTANCE{$class}{$dsn} = $class->new({'dsn' => $dsn});
}
return $RVL::INSTANCE{$class}{$dsn}
}
sub _getDsnAsString {
RVL::logMessage('', __CONSTANT__::RVL_LOG_DEBUG);
my ($conf) = @_;
my ($type) = (defined $conf->{'db'}->{'type'}) ? $conf->{'db'}->{'type'} : 'mysql';
my ($database) = $conf->{'db'}->{'name'};
my ($hostname) = (defined $conf->{'db'}->{'host'}) ? $conf->{'db'}->{'host'} : 'localhost';
my ($port) = (defined $conf->{'db'}->{'port'}) ? $conf->{'db'}->{'port'} : 3306;
my ($user) = $conf->{'db'}->{'user'};
my ($passwd) = $conf->{'db'}->{'pass'};
return 'dbi:' . $type . ':database=' . $database . ';host=' . $hostname . ':' . $port . '://' . $user . '@' . $passwd;
}
sub query {
my ($this, $query) = @_;
if ($this->{sqldebug}) {
print "$query\n";
return 1;
}
my ($q) = $this->{DBI}->prepare($query);
$q->execute;
return 1;
}
sub getRow {
my ($this, $query) = @_;
my (@row, @result);
my $q = $this->{DBI}->prepare($query);
$q->execute;
while (@row = $q->fetchrow_array()){
next if ($row[0] =~/^$/);
push(@result, $row[0]);
}
return @result;
}
sub getAllHash {
my ($this, $query) = @_;
my $q = $this->{DBI}->prepare($query);
$q->execute;
my @hashRows = ();
while (my $row_ref = $q->fetchrow_hashref()) {
push (@hashRows, $row_ref);
}
return @hashRows;
}
}
package RVL::ServiceLocator;
use strict;
use warnings;
use Class::Std::Utils;
{
sub new {
my ($class, $opt) = @_;
my (%hash);
my ($this) = bless( \%hash, $class);
return $this;
}
sub singleton {
my ($class) = __PACKAGE__;
if (!defined $RVL::INSTANCE{$class}) {
$RVL::INSTANCE{$class} = $class->new();
}
return $RVL::INSTANCE{$class}
}
sub register {
my ($this, $serviceName, $oService) = @_;
$this->{aServices}->{$serviceName} = $oService;
return 1;
}
sub remove {
my ($this, $serviceName) = @_;
delete $this->{aServices}->{$serviceName};
}
sub get {
my ($this, $serviceName) = @_;
if (defined $this->{aServices}->{$serviceName}) {
return ${$this->{aServices}->{$serviceName}};
} else {
return 0;
}
}
sub staticGet
{
my ($serviceName) = @_;
my ($oServiceLocator) = RVL::ServiceLocator::singleton();
return $oServiceLocator->get($serviceName);
}
}
1;
Copyright 2K16 - 2K18 Indonesian Hacker Rulez