mirror of
				https://github.com/openresty/openresty.git
				synced 2024-10-13 00:29:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			131 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env perl
 | 
						|
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
 | 
						|
use Getopt::Long;
 | 
						|
use lib 'lib';
 | 
						|
use Params::Util qw( _HASH );
 | 
						|
use JSON::XS ();
 | 
						|
use JSON::Syck;
 | 
						|
#use WWW::OpenResty::Simple;
 | 
						|
use Data::Dumper;
 | 
						|
use Data::Structure::Util qw(_utf8_on _utf8_off);
 | 
						|
use DBI;
 | 
						|
 | 
						|
sub usage {
 | 
						|
    my $progname;
 | 
						|
    if ($0 =~ m{[^/\\]+$}) {
 | 
						|
        $progname = $&;
 | 
						|
    }
 | 
						|
    return <<_EOC_;
 | 
						|
Usage: $progname [options] <json_file>
 | 
						|
Options:
 | 
						|
    --user <user>      OpenResty user (i.e. agentzh.Admin)
 | 
						|
    --password <s>     OpenResty password for the user specified
 | 
						|
    --model <model>    OpenResty model name being imported
 | 
						|
    --server <host>    OpenResty server hostname
 | 
						|
    --step <num>       Size of the bulk insertion group
 | 
						|
    --retries <num>    Number of automatic retries when failures occur
 | 
						|
    --no-id            Skipped the id field in the records being imported
 | 
						|
    --skip N           Skipped the first N rows in the input file (default 0)
 | 
						|
    --add-id N          Add ID started from N (default 1)
 | 
						|
    --update-col <col>  Update records according to the column given
 | 
						|
    --ignore-dup-error  Ignore dupliciate errors
 | 
						|
_EOC_
 | 
						|
}
 | 
						|
 | 
						|
my $server = 'api.openresty.org';
 | 
						|
my $step = 20;
 | 
						|
my $skip = 0;
 | 
						|
my $add_id = 1;
 | 
						|
my $update_col;
 | 
						|
GetOptions(
 | 
						|
    'help|h'   => \(my $help),
 | 
						|
    'user|u=s' => \(my $user),
 | 
						|
    'model=s' => \(my $model),
 | 
						|
    'server=s' => \$server,
 | 
						|
    'password=s' => \(my $password),
 | 
						|
    'step=i' => \$step,
 | 
						|
    'reset' => \(my $reset),
 | 
						|
    'retries=i' => \(my $retries),
 | 
						|
    'no-id' => \(my $no_id),
 | 
						|
    'skip=i' => \$skip,
 | 
						|
    'add-id=i' => \$add_id,
 | 
						|
    'ignore-dup-error' => \(my $ignore_dup_error),
 | 
						|
    'update-col=s' => \$update_col,
 | 
						|
    'port=s' => \(my $port),
 | 
						|
) or die usage();
 | 
						|
 | 
						|
if ($help) { print usage() }
 | 
						|
 | 
						|
$user or die "No --user given.\n";
 | 
						|
$model or die "No --model given.\n";
 | 
						|
 | 
						|
my $json_xs = JSON::XS->new->utf8->allow_nonref;
 | 
						|
 | 
						|
my $database = 'test';
 | 
						|
 | 
						|
$port ||= 3306;
 | 
						|
 | 
						|
my $dsn = "DBI:mysql:database=$database;host=$server;port=$port;mysql_server_prepare=1";
 | 
						|
my $dbh = DBI->connect($dsn, $user, $password, { RaiseError => 1, AutoCommit => 0 });
 | 
						|
 | 
						|
if ($reset) {
 | 
						|
    $dbh->do("truncate $model");
 | 
						|
}
 | 
						|
 | 
						|
if ($update_col) { $step = 1 }
 | 
						|
 | 
						|
my @rows;
 | 
						|
my $inserted = 0;
 | 
						|
local $| = 1;
 | 
						|
 | 
						|
my ($sth);
 | 
						|
 | 
						|
my @cols;
 | 
						|
while (<>) {
 | 
						|
    #select(undef, undef, undef, 0.1);
 | 
						|
    #warn "count: ", scalar(@elems), "\n";
 | 
						|
    next if $. <= $skip;
 | 
						|
    my $row = $json_xs->decode($_);
 | 
						|
    #my $row = JSON::Syck::Load($_);
 | 
						|
 | 
						|
 | 
						|
    if (!defined $row->{id}) {
 | 
						|
        #warn "ADDing id...\n";
 | 
						|
        $row->{id} = $add_id++;
 | 
						|
    }
 | 
						|
    if ($no_id) {
 | 
						|
        delete $row->{id};
 | 
						|
    }
 | 
						|
 | 
						|
    if (!defined $sth) {
 | 
						|
        @cols = reverse sort keys %$row;
 | 
						|
        my $cols = join ',', @cols;
 | 
						|
        my @holders = map { '?' } @cols;
 | 
						|
        my $holders = join ',', @holders;
 | 
						|
        $sth = $dbh->prepare("insert into $model ($cols) values ($holders)");
 | 
						|
    }
 | 
						|
 | 
						|
    my @vals;
 | 
						|
    for my $col (@cols) {
 | 
						|
        push @vals, $row->{$col};
 | 
						|
    }
 | 
						|
 | 
						|
    $sth->execute(@vals);
 | 
						|
    $inserted++;
 | 
						|
 | 
						|
    if ($inserted % $step == 0) {
 | 
						|
        print STDERR "\r", ($update_col ? "Updated" : "Inserted"), " rows: $inserted (row $.)";
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
print STDERR "\n$inserted row(s) inserted.\n";
 | 
						|
 | 
						|
$dbh->disconnect();
 | 
						|
 | 
						|
warn "\nFor tatal $inserted records inserted.\n";
 | 
						|
#print encode('UTF-8', YAML::Syck::Dump(\@rows));
 | 
						|
 |