Platon Technologies
neprihlásený Prihlásiť Registrácia
SlovakEnglish
open source software development oslavujeme 10 rokov vývoja otvoreného softvéru! Sobota, 14. jún 2025

Súbor: [Platon] / perl-modules / Platon / MySQL / Admin.pm (stiahnutie)

Revízia 1.2, Sun Mar 27 00:31:42 2005 UTC (20 years, 2 months ago) by rajo


Zmeny od 1.1: +2 -1 [lines]

Fix: call bind_param() on delete record SQL.

#
# admin/sql.pm
#
# Developed by Lubomir Host 'rajo' <rajo AT platon.sk>
#
# Changelog:
# 2004-08-09 - created
#

# $Id: Admin.pm,v 1.2 2005/03/27 00:31:42 rajo Exp $

package Platon::MySQL::Admin;

use strict;
use Carp;
use DBI qw(:sql_types);

use vars qw($VERSION @ISA @EXPORT $AUTOLOAD $DEBUG);

@ISA        = qw(Exporter);
@EXPORT        = qw( );
$VERSION    = sprintf("%d.%02d", q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/);
$DEBUG        = 0;

sub new
{ #{{{
    my ($this, $dbh, $param) = @_;
    my $class = ref($this) || $this;
    my $self  = {
        dbh    => $dbh,
    };
    if (defined($param) and ref($param)) {
        foreach my $key (keys %$param) {
            #warn "Overvwiting '$key' => " . Dumper($param->{$key});
            $self->{$key} = $param->{$key};
        }
    }

    # zistime, kto nas zavolal
    my ($caller_pkg, $caller_file, $caller_line) = caller;
    $self->{_caller} = "$caller_file:$caller_line"; #  (" . __FILE__ . ':' . __LINE__ . ')';

    bless $self, $class;

    $self->_prepare_sql($dbh);

    return $self;
} # }}}

# funkcia skopiruje nejaky riadok v tabulke, ale niektore hodnoty stlpcov mozno zmenit
sub sql_copy_row($;)
{ # {{{
    my ($self, $data) = @_;
    my $dbh = $self->{dbh};

    $data = defined($data) ? $data : $self;

    foreach my $key (qw' table primary_key_name primary_key_value delete_columns new_values ') {
        if (!defined($data->{$key})) {
            die "Undefined REQUIRED parameter '$key'";
        }
    }
    $dbh = $data->{dbh} if (defined $data->{dbh});

    my $sql_select = $dbh->prepare(" /* sql_select " . __FILE__ . ':' . __LINE__ . "*/
        SELECT
            *
        FROM $data->{table} WHERE $data->{primary_key_name} = ?
    ") or $self->sql_error(__LINE__, $dbh->errstr);
    $sql_select->bind_param(1, 0, SQL_INTEGER);

    $sql_select->execute($data->{primary_key_value}) or $self->sql_error(__LINE__, $dbh->errstr);
    my $sel = $sql_select->fetchrow_hashref() or $self->sql_error(__LINE__, $dbh->errstr);
    $sql_select->finish() or $self->sql_error(__LINE__, $dbh->errstr);

    # prepisanie hodnot
    foreach my $key (@{$data->{delete_columns}}) {
        delete ($sel->{$key});
    }
    foreach my $key (keys %{$data->{new_values}}) {
        $sel->{$key} = $data->{new_values}->{$key};
    }

    # vytvorenie query
    my @val;
    my @var;
    my $sql = "INSERT INTO $data->{table}\n\t(" . (defined($data->{datetime_col}) ? "$data->{datetime_col}, " : "");
    foreach my $key (keys %$sel) {
        push @var, $key;
        push @val, $sel->{$key};
    }
    $sql .= join(", ", @var) . ")\n VALUES (" . (defined($data->{datetime_col}) ? "NOW(), " : "") . ("?, " x (scalar(@val) - 1)) . "?)";
    my $sql_insert = $dbh->prepare("/* sql_insert " . __FILE__ . ':' . __LINE__
        . "*/\n$sql") or $self->sql_error(__LINE__, $dbh->errstr);
    $sql_insert->execute(@val) or $self->sql_error(__LINE__, $dbh->errstr);

    my $mid = $sql_insert->{'mysql_insertid'} or $self->sql_error(__LINE__, $dbh->errstr);

    return $mid;

} # }}}

# do something if error during sql query occures
sub sql_error($$;)
{ # {{{
    my ($self, $line, $errstr) = @_;
    
    #push @sql_errors, "line $line: $errstr";
    print STDERR "$line: $errstr\n";
    
} # }}}

# vrati zoznam vsetkych prvkov
sub get_data($)
{ # {{{
    my ($self, $param) = @_;
    my @param;
    my $dbh = $self->{dbh};

    foreach my $key (qw'data_where data_limit ') {
        if (defined($param->{$key}) and ref($param->{$key}) eq 'ARRAY') {
            push @param, $param->{$key};
        }
    }
    
    $self->{sql_get_data}->execute(@param) or $self->sql_error(__LINE__, $dbh->errstr);
    my $data = $self->{sql_get_data}->fetchall_arrayref({}) or $self->sql_error(__LINE__, $dbh->errstr);
    $self->{sql_get_data}->finish();

    return $data;

} # }}}

# vrati udaje o jednom zazname v tabulke
sub get_record($$;)
{ # {{{
    my ($self, $pk) = @_;
    my $dbh = $self->{dbh};

    $self->{sql_get_record}->execute($pk) or $self->sql_error(__LINE__, $dbh->errstr);
    my $data = $self->{sql_get_record}->fetchrow_hashref() or $self->sql_error(__LINE__, $dbh->errstr);
    $self->{sql_get_record}->finish();

    return $data;

} # }}}

# aktualizuje jeden zaznam v tabulke
sub update_record($$;)
{ # {{{
    my ($self, $data) = @_;
    my @param;
    my $dbh = $self->{dbh};

    # fill with parameter from user
    foreach my $key (@{$self->{update_columns}}) {
        push @param, $data->{$key};
    }
    $self->{sql_update_record}->execute(@param, $data->{ $self->{primary_key_name} }) or $self->sql_error(__LINE__, $dbh->errstr);

    return $self->{sql_update_record}->rows();

} # }}}

# vutvori jeden zaznam v tabulke
sub create_record($$;)
{ # {{{
    my ($self, $data) = @_;
    my @param;
    my $dbh = $self->{dbh};

    # fill with parameter from user
    foreach my $key (@{$self->{update_columns}}) {
        push @param, $data->{$key};
    }
    $self->{sql_create_record}->execute(@param) or $self->sql_error(__LINE__, $dbh->errstr);

    return $self->{sql_create_record}->{'mysql_insertid'};

} # }}}

# zmaze jeden zaznam v tabulke
sub delete_record($$;)
{ # {{{
    my ($self, $pk, $limit) = @_;
    my $dbh = $self->{dbh};

    $limit = defined($limit) ? $limit : 1;

    $self->{sql_delete_record}->execute($pk, $limit) or $self->sql_error(__LINE__, $dbh->errstr);

    return $self->{sql_delete_record}->rows();

} # }}}

sub _prepare_sql ($$;)
{ # {{{
    my ($self, $dbh) = @_;

    $self->{sql_get_data} = $dbh->prepare(" /* sql_get_data $self->{_caller} */
        SELECT "
            . join(', ', @{$self->{select_columns}}) .
    "    FROM $self->{table} "
    . ((defined($self->{data_where}) and $self->{data_where} ne '')
        ? "WHERE " . join('AND ', @{$self->{data_where}}) : '')

    . ((defined($self->{data_order}) and $self->{data_order} ne '')
        ? "ORDER BY " . join(', ', @{$self->{data_order}}) : '')

    . ((defined($self->{data_limit}) and $self->{data_limit} ne '')
        ? "LIMIT " . join(', ', @{$self->{data_limit}}) : '')
    ) or croak "Can't get record: " . $dbh->errstr;

    $self->{sql_get_record} = $dbh->prepare(" /* sql_get_record $self->{_caller} */
        SELECT "
            . join(', ', @{$self->{select_columns}}) .
    "    FROM $self->{table}
        WHERE $self->{primary_key_name} = ?
        LIMIT 1
    ") or croak "Can't get record: " . $dbh->errstr;

    $self->{sql_update_record} = $dbh->prepare(" /* sql_update_record $self->{_caller} */
        UPDATE $self->{table} "
        . "SET " . join(' = ?, ', @{$self->{update_columns}}) . " = ?
        WHERE $self->{primary_key_name} = ?
        LIMIT 1
    ") or croak "Can't update record: " . $dbh->errstr;

    $self->{sql_create_record} = $dbh->prepare(" /* sql_create_record $self->{_caller} */
        INSERT INTO  $self->{table} "
        . "(" . join(', ', @{$self->{update_columns}}) . ")
        VALUES (" . ('?, ' x (scalar(@{$self->{update_columns}}) - 1)) . "?)
    ") or croak "Can't create record: " . $dbh->errstr;

    $self->{sql_delete_record} = $dbh->prepare(" /* sql_delete_record $self->{_caller} */
        DELETE FROM  $self->{table}
        WHERE $self->{primary_key_name} = ?
        LIMIT ?
    ") or croak "Can't delete record: " . $dbh->errstr;
    $self->{sql_delete_record}->bind_param(2, 0, SQL_INTEGER);

} # }}}

1;

__END__

=head1 NAME

sql - <<<description of module>>>

=head1 SYNOPSIS

  use Platon::MySQL::Admin;

  my $xxx = new sql;

=head1 DESCRIPTION

The sql module allows you ...
<<<your description here>>>

=head2 EXPORT

<<here describe exported methods>>>

=head1 SEE ALSO

=head1 AUTHORS

Lubomir Host 'rajo', <rajo AT platon.sk>

=cut

# vim: ts=4
# vim600: fdm=marker fdl=0 fdc=3


Platon Group <platon@platon.sk> http://platon.sk/
Copyright © 2002-2006 Platon Group
Stránka používa redakčný systém Metafox
Na začiatok