#!/usr/local/bin/perl

use strict;
use lib 'lib';

use DBI 1.21;
use Getopt::Std;
use File::Path;

use Dimedis::Sql::Import;

my $VERSION = "0.01";

my $COPYRIGHT = <<__EOT;
dsql_import, version $VERSION, Copyright 2002 dimedis GmbH
__EOT

my $USAGE = <<__EOT;
Usage:dsql_import [-V] config-filename
      dsql_export -c
		
  -V         suppress verbose output
  -c         print example config file to STDOUT

__EOT


my $EXAMPLE_CONFIG = <<__EOT;
#  data_source              -- Data-Source der Zieldatenbank, in die die Daten
#                              importiert werden
#  username                 -- Schema-Name der Zieldatenbank, in die die Daten
#                              importiert werden
#  password                 -- DB-Passwort
#  directory                -- kompletter Pfad des Verzeichnisses, in dem die
#                              zu importierenden abgelegt sind
#  type_hash_file           -- kompletter Pfad der Datei, in der das Type-Hash
#                              fr die zu importierenden Tabellen abgelegt ist
#
# OPTIONAL:
#  inserts_per_transaction  -- the export module performs a commit
#                              after the given number of inserts
#                              (e.g. value 1 is equivalent to AUTOCOMMIT ON) 
#
#                              Default: one commit per database table
#
# iso2utf8		    -- Daten im Filesystem sind in ISO-8859-1,
#			       Datenbank ist UTF-8 (Unicode)

{
  data_source    	  => 'dbi:Oracle:',
  username                => 'usr',
  password       	  => 'passwd',
  directory               => '/tmp/export',
  type_hash_file 	  => './prod/config/lib.install.sql.general.all_tables.config',
  inserts_per_transaction => 1,
  iso2utf8		  => 0,
}
  
__EOT


main: {
  my %opt;
  my $opt_ok = getopts ('Vc', \%opt);

  #--- Beispiel-Config-File ausgeben	
  if ( $opt{c} ) {
    print $EXAMPLE_CONFIG;
    exit 1;
  }

  my $config_filename = shift @ARGV;

  if ( not $opt_ok or not $config_filename or @ARGV ) {
    print $COPYRIGHT, "\n";
    print $USAGE;
    exit 1;
  }

  if ( not -f $config_filename ) {
    print "Invalid config filename!\n";
    exit 1;
  }

  #--- get config file
  my $config = do $config_filename;

  if ( $config ->{data_source} =~ /oracle/i ) {
    #--- check version of DBD::Oracle (must be at least 1.12)
    eval "use DBD::Oracle 1.12";
    die $@ if $@;
  }

  #--- check if import directory exists
  if ( not -d "$config->{directory}" ) {
    print "Directory $config->{directory} not found!\n";
    exit 1;
  }

  #--- connect to database
  my $dbh = DBI->connect (
  	$config->{data_source},
	$config->{username},
	$config->{password},
	{
		AutoCommit => 0,
		RaiseError => 1,
	}
  );
	
  print "\nImporting data...\n";

  #--- execute database import
  my $import = Dimedis::Sql::Import->new(
	    dbh		     => $dbh,
      config 		 => $config,
      quiet_mode => $opt{V},
  );
	
  $import->do_import();

  print "\n\nDone.\n\n";

  END { $dbh->rollback if $dbh;
  	$dbh->disconnect if $dbh
  }
}

__END__

=head1 NAME

dsql_import - Kommandozeilen-Tool fr datenbankunabhngige DB-Imports

=head1 SYNOPSIS

  dsql_import [-V] Konfigurationsdatei-Name
  dsql_import -c
		
  -V    keine Statusmeldungen auf STDOUT ausgeben
  -c    Muster-Konfigurationsdatei auf STDOUT ausgeben

=head1 DESCRIPTION

Dieses Tool ermglicht einen Import von Daten aus einem bestimmten
Verzeichnis im Filesystem in ein bestehendes Datenbank-Schema
(Oracle, MySQL oder mSQL).

Es werden alle Daten aus dem angegebenen Verzeichnis importiert,
fr die es einen Eintrag im bergebenen Type-Hash gibt
(siehe Abschnitt 'KONFIGURATIONSDATEI').

Das angegebene Verzeichnis enthlt fr jede zu importierende Tabelle ein
Unterverzeichnis mit dem Namen der entsprechenden Tabelle. Dort sind die
zugehrigen Dateien abgelegt:

=over 4

=item B<format.conf>

Enthlt Informationen (Spaltenname, Typ und maximale Lnge) zu den zugehrigen
Tabellen-Spalten.

=item B<data.dump>

Enthlt die eigentlichen Daten, wobei die einzelnen Spalten durch Tabulatoren
voneinander getrennt sind.

=item B<blob_1.bin - blob_n.bin>

Enthlt eine Tabelle BLOB- oder CLOB-Spalten, sind die Inhalte dieser Spalten
in separaten Dateien gespeichert. In der CSV-Datei ist dann fr diese
Spalten nur der Name der zugehrigen Datei abgelegt.

=back

Die Start- und Endzeit des Imports, sowie die bergebenen Parameter
und die Statusmeldungen, die whrend des Imports ausgegeben werden,
werden in eine Meta-Datei im angegebenen Verzeichnis geschrieben.

Fr jeden Import wird eine neue Meta-Datei erzeugt.

=head1 KONFIGURATIONSDATEI

Die Konfigurationsdatei fr das Import-Tool muss folgende Eintrge enthalten:

=over 4

=item B<data_source>

Data-Source der Zieldatenbank, in die die Daten importiert werden

=item B<username>

Schema-Name der Zieldatenbank, in die die Daten importiert werden

=item B<password>

DB-Passwort

=item B<directory>

kompletter Pfad des Verzeichnisses, in dem die zu importierenden Daten liegen

=item B<type_hash_file>

kompletter Pfad der Datei, in der das Type-Hash fr die zu importierenden
Tabellen abgelegt ist

=back

Zustzlich gibt es einen optionalen Parameter, mit dem angegeben werden kann,
nach wievielen DB-Inserts jeweils ein Commit erfolgen soll:

=over 4

=item B<inserts_per_transaction>

Anzahl der DB-Inserts, nach denen jeweils ein Commit erfolgen soll

Beispiel: inserts_per_transaction => 1 gibt an, dass nach jedem
eingefgten Datensatz committed wird.

Wird der B<inserts_per_transaction>-Parameter nicht angegeben,
erfolgt jeweils ein Commit pro Tabelle. 

=back 

=head1 TYPE-HASH

Die im Konfigurationsdatei angegebene Type-Hash-Datei muss folgenden
Aufbau haben (siehe auch B<Dimedis::Sql>):

=for html
<P>

B<$type_hash_ref> = {
  'table_name_x'    => {
    'column_name_i' => 'serial',
    'column_name_j' => 'varchar(999)',
    'column_name_k' => 'clob',
    'column_name_l' => 'blob' ,   
  },
  'table_name_y'    => {
    'column_name_i' => 'numeric(2)',
    'column_name_j' => 'blob',
    'column_name_k' => 'char(16)',
  },
};

=for html
<P>

Hier muss ein Eintrag fr jede zu importierende DB-Tabelle vorhanden sein.

=head1 AUTOR

Sabine Tonn, sabine@dimedis.de

=head1 COPYRIGHT

Copyright (c) 2002 dimedis GmbH, All Rights Reserved

=cut
