cvs commit: p5ee/App-Repository/lib/App/Repository MySQL.pm

[email protected] (Stephen Adkins)
Newsgroups perl.cvs.p5ee
Message-ID <[email protected]>
cvsuser     05/08/09 11:55:48

  Modified:    App-Repository/lib/App/Repository MySQL.pm
  Log:
  _last_insertid(), export_rows(), import_rows()
  
  Revision  Changes    Path
  1.11      +188 -2    p5ee/App-Repository/lib/App/Repository/MySQL.pm
  
  Index: MySQL.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/App-Repository/lib/App/Repository/MySQL.pm,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- MySQL.pm	9 Dec 2004 21:54:12 -0000	1.10
  +++ MySQL.pm	9 Aug 2005 18:55:48 -0000	1.11
  @@ -95,6 +95,11 @@
       return($suffix);
   }
   
  +sub _last_inserted_id {
  +    my ($self) = @_;
  +    return($self->{dbh}{mysql_insertid});
  +}
  +
   sub _load_table_key_metadata {
       &App::sub_entry if ($App::trace);
       my ($self, $table) = @_;
  @@ -175,5 +180,186 @@
   #    my ($dbh, $catalog, $schema, $table, $column) = @_;
   #    return $dbh->set_err(1, "column_info doesn't support table wildcard")
   
  +#############################################################################
  +# METHODS
  +#############################################################################
  +
  +=head1 Methods: Import/Export Data From File
  +
  +=cut
  +
  +#############################################################################
  +# import_rows()
  +#############################################################################
  +
  +=head2 import_rows()
  +
  +    * Signature: $rep->import_rows($table, $file);
  +    * Signature: $rep->import_rows($table, $file, $options);
  +    * Param:     $table        string
  +    * Param:     $file         string
  +    * Param:     $options      named
  +    * Param:     columns       ARRAY     names of columns of the fields in the file
  +    * Param:     method        string    [basic=invokes generic superclass to do work]
  +    * Param:     local         boolean   file is on client machine rather than database server
  +    * Param:     replace       boolean   rows should replace existing rows based on unique indexes
  +    * Param:     field_sep     char      character which separates the fields in the file (can by "\t")
  +    * Param:     field_quote   char      character which optionally encloses the fields in the file (i.e. '"')
  +    * Param:     field_escape  char      character which escapes the quote chars within quotes (i.e. "\")
  +    * Return:    void
  +    * Throws:    App::Exception::Repository
  +    * Since:     0.01
  +
  +    Sample Usage: 
  +
  +    $rep->import_rows("usr","usr.dat");
  +
  +    # root:x:0:0:root:/root:/bin/bash
  +    $rep->import_rows("usr", "/etc/passwd" ,{
  +        field_sep => ":",
  +        columns => [ "username", "password", "uid", "gid", "comment", "home_directory", "shell" ],
  +    });
  +
  +=cut
  +
  +#SYNTAX:
  +#LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
  +#    [REPLACE | IGNORE]
  +#    INTO TABLE tbl_name
  +#    [FIELDS
  +#        [TERMINATED BY 'string']
  +#        [[OPTIONALLY] ENCLOSED BY 'char']
  +#        [ESCAPED BY 'char' ]
  +#    ]
  +#    [LINES
  +#        [STARTING BY 'string']
  +#        [TERMINATED BY 'string']
  +#    ]
  +#    [IGNORE number LINES]
  +#    [(col_name_or_user_var,...)]
  +#    [SET col_name = expr,...)]
  +
  +sub import_rows {
  +    &App::sub_entry if ($App::trace);
  +    my ($self, $table, $file, $options) = @_;
  +
  +    if ($options->{method} && $options->{method} eq "basic") {
  +        $self->SUPER::import_rows($table, $file, $options);
  +    }
  +    else {
  +        my $local = $options->{local};
  +        $local = 1 if (!defined $local);
  +        my $local_modifier = $local ? " local" : "";
  +        my $sql = "load data$local_modifier infile '$file' into table $table";
  +        if ($options->{field_sep} || $options->{field_quote} || $options->{field_escape}) {
  +            $sql .= "\nfields";
  +            $sql .= "\n   terminated by '$options->{field_sep}'" if ($options->{field_sep});
  +            $sql .= "\n   optionally enclosed by '$options->{field_quote}'" if ($options->{field_quote});
  +            $sql .= "\n   escaped by '$options->{field_escape}'" if ($options->{field_escape});
  +        }
  +        if ($options->{columns}) {
  +            $sql .= "\n(" . join(",", @{$options->{columns}}) . ")";
  +        }
  +        my $debug_sql = $self->{context}{options}{debug_sql};
  +        if ($debug_sql) {
  +            print "DEBUG_SQL: import_rows()\n";
  +            print $sql;
  +        }
  +        my $retval = $self->{dbh}->do($sql);
  +        if ($debug_sql) {
  +            print "DEBUG_SQL: import_rows() = [$retval]\n";
  +        }
  +    }
  +
  +    &App::sub_exit() if ($App::trace);
  +}
  +
  +#############################################################################
  +# export_rows()
  +#############################################################################
  +
  +=head2 export_rows()
  +
  +    * Signature: $rep->export_rows($table, $file);
  +    * Signature: $rep->export_rows($table, $file, $options);
  +    * Param:     $table        string
  +    * Param:     $file         string
  +    * Param:     $options      named
  +    * Param:     columns       ARRAY     names of columns of the fields in the file
  +    * Param:     method        string    [basic=invokes generic superclass to do work]
  +    * Param:     field_sep     char      character which separates the fields in the file (can by "\t")
  +    * Param:     field_quote   char      character which optionally encloses the fields in the file (i.e. '"')
  +    * Param:     field_escape  char      character which escapes the quote chars within quotes (i.e. "\")
  +    * Return:    void
  +    * Throws:    App::Exception::Repository
  +    * Since:     0.01
  +
  +    Sample Usage: 
  +
  +    $rep->export_rows("usr","usr.dat");
  +
  +    # root:x:0:0:root:/root:/bin/bash
  +    $rep->export_rows("usr", "passwd.dat" ,{
  +        field_sep => ":",
  +        columns => [ "username", "password", "uid", "gid", "comment", "home_directory", "shell" ],
  +    });
  +
  +=cut
  +
  +#SELECT ... INTO OUTFILE is the complement of LOAD DATA INFILE; the syntax for the
  +#export_options part of the statement consists of the same FIELDS and LINES clauses
  +#that are used with the LOAD DATA INFILE statement.
  +#See Section 13.2.5, .LOAD DATA INFILE Syntax..
  +
  +#SELECT
  +#    [ALL | DISTINCT | DISTINCTROW ]
  +#      [HIGH_PRIORITY]
  +#      [STRAIGHT_JOIN]
  +#      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
  +#      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
  +#    select_expr, ...
  +#    [INTO OUTFILE 'file_name' export_options
  +#      | INTO DUMPFILE 'file_name']
  +#    [FROM table_references
  +#      [WHERE where_definition]
  +#      [GROUP BY {col_name | expr | position}
  +#        [ASC | DESC], ... [WITH ROLLUP]]
  +#      [HAVING where_definition]
  +#      [ORDER BY {col_name | expr | position}
  +#        [ASC | DESC] , ...]
  +#      [LIMIT {[offset,] row_count | row_count OFFSET offset}]
  +#      [PROCEDURE procedure_name(argument_list)]
  +#      [FOR UPDATE | LOCK IN SHARE MODE]]
  +
  +sub export_rows {
  +    &App::sub_entry if ($App::trace);
  +    my ($self, $table, $file, $options) = @_;
  +
  +    if ($options->{method} && $options->{method} eq "basic") {
  +        $self->SUPER::export_rows($table, $file, $options);
  +    }
  +    else {
  +        my $columns = $options->{columns} || $self->{table}{$table}{columns};
  +        my $sql = "select\n   " . join(",\n   ", @$columns) . "\ninto outfile '$file'";
  +        if ($options->{field_sep} || $options->{field_quote} || $options->{field_escape}) {
  +            $sql .= "\nfields";
  +            $sql .= "\n   terminated by '$options->{field_sep}'" if ($options->{field_sep});
  +            $sql .= "\n   optionally enclosed by '$options->{field_quote}'" if ($options->{field_quote});
  +            $sql .= "\n   escaped by '$options->{field_escape}'" if ($options->{field_escape});
  +        }
  +        my $debug_sql = $self->{context}{options}{debug_sql};
  +        if ($debug_sql) {
  +            print "DEBUG_SQL: export_rows()\n";
  +            print $sql;
  +        }
  +        my $retval = $self->{dbh}->do($sql);
  +        if ($debug_sql) {
  +            print "DEBUG_SQL: export_rows() = [$retval]\n";
  +        }
  +    }
  +    
  +    &App::sub_exit() if ($App::trace);
  +}
  +
   1;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.