File Coverage

blib/lib/Xtract/Scan/mysql.pm
Criterion Covered Total %
statement 12 43 27.9
branch 0 18 0.0
condition 0 6 0.0
subroutine 4 6 66.6
pod 0 2 0.0
total 16 75 21.3


line stmt bran cond sub pod time code
1             package Xtract::Scan::mysql;
2              
3 4     4   71 use 5.008005;
  4         12  
  4         164  
4 4     4   21 use strict;
  4         120  
  4         2142  
5 4     4   30 use DBI 1.57 ':sql_types';
  4         101  
  4         2562  
6 4     4   26 use Xtract::Scan ();
  4         10  
  4         2602  
7              
8             our $VERSION = '0.16';
9             our @ISA = 'Xtract::Scan';
10              
11              
12              
13              
14              
15             ######################################################################
16             # Introspection Methods
17              
18             sub tables {
19 0 0         map {
20 0     0 0   /`([^`]+)`$/ ? "$1" : $_
21             } $_[0]->dbh->tables;
22             };
23              
24              
25              
26              
27              
28             ######################################################################
29             # SQL Generation
30              
31             sub add_table {
32 0     0 0   my $self = shift;
33 0           my $table = shift;
34 0           my $tname = $table->name;
35 0   0       my $from = shift || $tname;
36              
37             # Capture table metadata from a select on the table
38 0           my $sth = $self->from_dbh->prepare("select * from $from");
39 0 0 0       unless ( $sth and $sth->execute ) {
40 0           return $self->SUPER::add_table( $table, $from );
41             }
42              
43 0           my @name = @{$sth->{NAME_lc}};
  0            
44 0           my @type = @{$sth->{TYPE}};
  0            
45 0           my @null = @{$sth->{NULLABLE}};
  0            
46 0           my @blob = @{$sth->{mysql_is_blob}};
  0            
47 0           $sth->finish;
48              
49             # Generate the create fragments
50 0           foreach my $i ( 0 .. $#name ) {
51 0 0         if ( $blob[$i] ) {
    0          
    0          
    0          
    0          
52 0           $type[$i] = 'BLOB';
53             } elsif ( $type[$i] == SQL_INTEGER ) {
54 0           $type[$i] = 'INTEGER';
55             } elsif ( $type[$i] == SQL_FLOAT ) {
56 0           $type[$i] = 'REAL';
57             } elsif ( $type[$i] == SQL_REAL ) {
58 0           $type[$i] = 'REAL';
59             } elsif ( $type[$i] == -6 ) {
60 0           $type[$i] = 'INTEGER';
61             } else {
62 0           $type[$i] = 'TEXT';
63             }
64 0 0         $null[$i] = $null[$i] ? 'NULL' : 'NOT NULL';
65             }
66              
67             return (
68 0           create => [
69             "CREATE TABLE $tname (\n"
70             . join( ",\n",
71             map {
72 0           "\t$name[$_] $type[$_] $null[$_]"
73             } (0 .. $#name)
74             )
75             . "\n)"
76             ],
77             select => [
78             "SELECT * FROM $from"
79             ],
80             insert => (
81             "INSERT INTO $tname VALUES ( "
82             . join( ", ",
83 0           map { '?' } @name
84             )
85             . " )",
86             ),
87 0 0         blobs => scalar( grep { $_ } @blob ) ? \@blob : undef,
88             );
89             }
90              
91             1;