NAME
MySQL::Slurp - Use PIPEs to write directly to a MySQL table
CAVEAT
MySQL::Slurp only works on systems that support FIFOs and
does not support Windows ... yet.
VERSION
0.28
SYNOPSIS
use MySQL::Slurp;
# NEW OBJECTS
my $slurper= MySQL::Slurp->new(
database => 'test' ,
table => 'table_1' ,
buffer => 10000 ,
args => [] ,
);
$slurper->open;
# OR,
my $slurper = MySQL::Slurp->new(
database => 'test',
table => 'table_1'
)->open;
# IMPORT METHODS
$slurper->slurp(); # slurp from <STDIN>
# RECOMMENDED METHOD TO WRITE TO A TABLE
# implements buffer and locks
$slurper->write( @records );
# WRITE DIRECTLY TO TABLE WITHOUT BUFFER AND LOCKS
$slurper->print( "Fred\tFlinstone\n" );
print { $slurper->{writer} } "Fred\tFlinstone\n";
$slurper->close;
# In coordinated environents
my $slurper1 = MySQL::Slurp::Writer->new( ... );
my $slurper2 = MySQL::Slurp::Writer->new( ... );
$slurper1->write( @a ); # In thread 1.
$slurper2->write( @b ); # In thread 2.
DESCRIPTION
MySQL::Slurp provides methods for writing directly to a MySQL table using a convenient interface. This module creates a writable FIFO and uses mysqlimport
or LOAD DATA INFILE
to load whatever is written to that FIFO. This is the fastest method for importing data into a MySQL table. This module makes it easy. The user needs only open
, write
, and close
a MySQL::Slurp object.
This module also provides a slurp
method for reaing directly from <STDIN> and writing to the table. This allows you to do tasks such as the following:
cat data.tsv | perl myscript.pl
This is very handy for large ETL jobs.
Unike using DBI for trapping errors, catching errors with mysqlimport can be troublesome with inconsitent data. It is recommended that you check you data before writing to the MySQL::Slurp handle or use a suitable DBI method.
The module also implements buffering and locking using MySQL::Slurp::Writer. This allows for multi-process and multi- threading.
METHODS
new
Creates a new MySQL::Slurp object
- database (required)
-
name of the MySQL database containing the target table.
- table (required)
-
Name of MySQL table to write to.
- tmp
-
The (name of the) temporary directory in which the FIFO/pipe is created. This is created by File::Temp
- buffer
-
default: 1 ( buffer one line, i.e. no buffering )
Maximum number of records that are stored in the buffer before locking the fifo and flushing to the MySQL table. By default, there is no buffering, Buffer = 1. This attribute is used by MySQL::Slurp::Writer
There is no checking for memory limits. The user is responsible for using a sensible value.
- method
-
default: dbi
Method to use for importing. Supports c<mysqlimport>, c<mysql> and c<dbi> for mysqlimport, mysql and dbi loading methods, respectively.
c<dbi> is the default method. This method uses the DBI module and is the most portable.
mysql
uses themysql
command line application.mysqlimport
uses the mysqlimport appication. Since the mysqlimport uses multiple threads. This is faster than the DBI method. It reads settings from~/.my.cnf
. - args
-
Options to pass to mysqlimport.
args
is an array ref and should appear exactly as it does in the command line invocation of mysqlimport. Applies tomysqlimport
method only - verbose
-
Whether to display verbose output
- force
-
Continue even if errors are encountered
open
Opens a connection to the MySQL table through a temporary FIFO. Returns a GlobRef that can be directly written to. This calls internal methods _mkfifo, <_import>, <_install_writer>, After the MySQL::Slurp
object is open, one can print directly to the table.
Writes arguments directly to the MySQL database. Buffering is off by default, see the buffer attribute.
slurp
Read from <STDIN> and write to the database table.
close
Closes and removes the pipe and temporary table. Calls MySQL::Slurp::Writer::close
and _rmfifo.
INTERNAL SLOTS
writer
The slow holding the MySQL::Slurp::Writer used for buffering the writing and thread-safe.
dbh
The database handle to the target table. The handle is created using the defaults in your ~/.my.cnf
file. Compression is used and query is streamed, mysql_use_result=1
.
fifo
The fifo used for import. This is simply the path. It is set to the name of the tmp
directory and the name of the table
.
INTERNAL METHODS
Do not use these methods directly.
_mkfifo
Creates the FIFO at [tmp]/mysqlslurp/[table].txt
. This will die if a pipe, file, directory exists with the same descriptor.
The fifo is created as with default mode 0777.
_rmfifo
Removes the FIFO. Used in cleaning up after the upload.
_import
This is the heart of MySQL::Slurp
, reading from the fifo and writing from the table.
_install_writer
_write
Print to MySQL::Slurp::Writer object located in $_[0]-
writer>.
THREAD SAFE
MySQL::Slurp is believed to be thread safe if using the 'write' method. Directly accessing the IO::File pipe is not considered Thread safe.
TODO
- use MooseX::Attribute::Defaults::GNU for object attributes
- remove reliance on installation of mysqlimport, by XS wrapping the C libraries.
- create a version to run on windows with named pipes(?)
- create method for INSERT DELAYED
SEE ALSO
MySQL::Slurp relies on the Moose metaobject package.
mysqlimport at http://mysql.com, currently http://dev.mysql.com/doc/refman/5.1/en/mysqlimport.html
AUTHOR
Christopher Brown, <ctbrown@cpan.org<gt>
COPYRIGHT AND LICENSE
Copyright (C) 2008 by Open Data
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.