#!/usr/bin/perl
# mkinsert

# Wygenerowanie zapytań INSERT na podstawie danych rozdzielonych tabulatorami.
# Takie rozwiązanie jest odpowiednie podczas dostarczania danych klientowi mysql.
# Przydaje się jeśli masz plik danych i starszą wersję MySQL, która nie obsługuje
# zapytania LOAD DATA LOCAL lub polecenia mysqlimport --local.

# Sposób użycia mkinsert:

# % mkinsert -t tbl_name data_file | mysql db_name

# lub:

# % mkinsert -t tbl_name data_file > junk
# <Sprawdź, czy otrzymałeś żądany wynik.>
# % mysql db_name < junk

# Przyjęto założenie, że kolumny znajdują się w prawidłowej kolejności i nie chcesz
# wczytać jedynie niektórych z nich.

# Ponadto, skrypt przeprowadza konwersję \N na NULL.

# Paul DuBois
# paul@kitebird.com
# 1999-06-25

# 1999-06-25
# - Utworzenie skryptu.
# 2002-06-15
# - Nie przyjmuj założenia, że słowo kluczowe "INTO" jest opcjonalne po "INSERT".

use strict;
use warnings;

use vars qw($opt_t);
use Getopt::Std;

my ($prog, $usage);

($prog = $0) =~ s|.*/||;    # Pobranie nazwy skryptu do umieszczenia w komunikatach.

$usage = "Użycie: $prog -t tbl_name [ data-file ] ...";

getopts ("t:") or die "$usage\n";
defined ($opt_t) or die "$usage\n";

my ($tbl_name) = $opt_t;
my (@f);
my ($delim);

print "# Poniższe dane wyjściowe zostaną przekazane do mysql db_name\n\n";

while (<>)
{
  chomp;
  @f = split (/\t/, $_);
  print "INSERT INTO $tbl_name VALUES(";
  $delim = "";
  foreach my $val (@f)
  {
    if ($val eq "\\N")
    {
      $val = "NULL";
    }
    else
    {
      $val =~ s/\\/\\\\/g;
      $val =~ s/'/\\'/g;
      $val = "'$val'";
    }
    print "$delim$val";
    $delim = ",";
  }
  print ");\n";
}
