/usr/share/perl5/Class/DBI/mysql.pm is in libclass-dbi-mysql-perl 1.00-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 | package Class::DBI::mysql;
$VERSION = '1.00';
=head1 NAME
Class::DBI::mysql - Extensions to Class::DBI for MySQL
=head1 SYNOPSIS
package Film;
use base 'Class::DBI::mysql';
__PACKAGE__->set_db('Main', 'dbi:mysql:dbname', 'user', 'password');
__PACKAGE__->set_up_table("film");
__PACKAGE__->autoinflate(dates => 'Time::Piece');
# Somewhere else ...
my $type = $class->column_type('column_name');
my @allowed = $class->enum_vals('column_name');
my $tonights_viewing = Film->retrieve_random;
=head1 DESCRIPTION
This is an extension to Class::DBI, containing several functions and
optimisations for the MySQL database. Instead of setting Class::DBI
as your base class, use this instead.
=cut
use strict;
use base 'Class::DBI';
=head1 METHODS
=head2 set_up_table
__PACKAGE__->set_up_table("table_name");
Traditionally, to use Class::DBI, you have to set up the columns:
__PACKAGE__->columns(All => qw/list of columns/);
__PACKAGE__->columns(Primary => 'column_name');
Whilst this allows for more flexibility if you're going to arrange your
columns into a variety of groupings, sometimes you just want to create the
'all columns' list. Well, this information is really simple to extract
from MySQL itself, so why not just use that?
This call will extract the list of all the columns, and the primary key
and set them up for you. It will die horribly if the table contains
no primary key, or has a composite primary key.
=cut
__PACKAGE__->set_sql(desc_table => 'DESCRIBE __TABLE__');
sub set_up_table {
my $class = shift;
$class->table(my $table = shift || $class->table);
(my $sth = $class->sql_desc_table)->execute;
my (@cols, @pri);
while (my $hash = $sth->fetch_hash) {
my ($col) = $hash->{field} =~ /(\w+)/;
push @cols, $col;
push @pri, $col if $hash->{key} eq "PRI";
}
$class->_croak("$table has no primary key") unless @pri;
$class->columns(Primary => @pri);
$class->columns(All => @cols);
}
=head2 autoinflate
__PACKAGE__->autoinflate(column_type => 'Inflation::Class');
__PACKAGE__->autoinflate(timestamp => 'Time::Piece');
__PACKAGE__->autoinflate(dates => 'Time::Piece');
This will automatically set up has_a() relationships for all columns of
the specified type to the given class.
We currently assume that all classess passed will be able to inflate
and deflate without needing extra has_a arguments, with the example of
Time::Piece objects, which we deal with using Time::Piece::mysql (which
you'll have to have installed!).
The special type 'dates' will autoinflate all columns of type date,
datetime or timestamp.
=cut
sub autoinflate {
my ($class, %how) = @_;
$how{$_} ||= $how{dates} for qw/date datetime timestamp/;
my $info = $class->_column_info;
foreach my $col (keys %$info) {
(my $type = $info->{$col}->{type}) =~ s/\W.*//;
next unless $how{$type};
my %args;
if ($how{$type} eq "Time::Piece") {
eval "use Time::Piece::MySQL";
$class->_croak($@) if $@;
$args{inflate} = "from_mysql_$type";
$args{deflate} = "mysql_$type";
}
$class->has_a($col => $how{$type}, %args);
}
}
=head2 create_table
$class->create_table(q{
name VARCHAR(40) NOT NULL PRIMARY KEY,
rank VARCHAR(20) NOT NULL DEFAULT 'Private',
serial INTEGER NOT NULL
});
This creates the table for the class, with the given schema. If the
table already exists we do nothing.
A typical use would be:
Music::CD->table('cd');
Music::CD->create_table(q{
cdid MEDIUMINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
artist MEDIUMINT UNSIGNED NOT NULL,
title VARCHAR(255),
year YEAR,
INDEX (artist),
INDEX (title)
});
Music::CD->set_up_table;
=head2 drop_table
$class->drop_table;
Drops the table for this class, if it exists.
=cut
__PACKAGE__->set_sql(
create_table => 'CREATE TABLE IF NOT EXISTS __TABLE__ (%s)');
__PACKAGE__->set_sql(drop_table => 'DROP TABLE IF EXISTS __TABLE__');
sub drop_table { shift->sql_drop_table->execute }
sub create_table {
my ($class, $schema) = @_;
$class->sql_create_table($schema)->execute;
}
=head2 column_type
my $type = $class->column_type('column_name');
This returns the 'type' of this table (VARCHAR(20), BIGINT, etc.)
=cut
sub _column_info {
my $class = shift;
(my $sth = $class->sql_desc_table)->execute;
return { map { $_->{field} => $_ } $sth->fetchall_hash };
}
sub column_type {
my $class = shift;
my $col = shift or die "Need a column for column_type";
return $class->_column_info->{$col}->{type};
}
=head2 enum_vals
my @allowed = $class->enum_vals('column_name');
This returns a list of the allowable values for an ENUM column.
=cut
sub enum_vals {
my $class = shift;
my $col = shift or die "Need a column for enum_vals";
my $series = $class->_column_info->{$col}->{type};
$series =~ /enum\((.*?)\)/ or die "$col is not an ENUM column";
(my $enum = $1) =~ s/'//g;
return split /,/, $enum;
}
=head2 retrieve_random
my $film = Film->retrieve_random;
This will select a random row from the database, and return you
the relevant object.
(MySQL 3.23 and higher only, at this point)
=cut
__PACKAGE__->add_constructor(_retrieve_random => '1 ORDER BY RAND() LIMIT 1');
sub retrieve_random { shift->_retrieve_random->first }
=head1 SEE ALSO
L<Class::DBI>. MySQL (http://www.mysql.com/)
=head1 AUTHOR
Tony Bowden
=head1 BUGS and QUERIES
Please direct all correspondence regarding this module to:
bug-Class-DBI-mysql@rt.cpan.org
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2001-2005 Tony Bowden.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License; either version 2 of the License,
or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.
=cut
1;
|