#!/usr/bin/perl
# Pokus s přístupem z Perlu k databázi Microsoft Accessu
# (c) 2007 Dan Zeman <zeman@ufal.mff.cuni.cz>
# Licence: GNU GPL

use utf8;
use open ":utf8";
binmode(STDIN, ":utf8");
binmode(STDOUT, ":raw");
binmode(STDERR, ":encoding(cp852)");
use Encode;

#Windows-based Perl/DBI/MS Access example
use DBI;
#open connection to Access database
$dbh = DBI->connect('dbi:ODBC:MSO');
#make long strings readable (otherwise, the execution of the query will end prematurely)
$dbh->{LongReadLen} = 20000;
#construct SQL statement
#CONVERT(`osoby`.`prijmeni` USING utf8) = 'Hájek'
$sqlstatement="SELECT `jmeno`, `prijmeni` FROM `Osoby`";
print STDERR ("$sqlstatement\n");
#prepare and execute SQL statement
$sth = $dbh->prepare($sqlstatement);
print STDERR ($DBI::errstr);
$sth->execute || 
      die "Could not execute SQL statement, maybe invalid?";
print STDERR ($DBI::errstr);
#debugging:
#$sth->dump_results;
#output database results
while (@row=$sth->fetchrow_array)
{
    $i++;
    # Microsoft Access se nikoho neptá a posílá data v nepoužitelné kódové stránce.
    # Znaky reprezentovatelné pomocí cp1250 (Východní Evropa) jsou poslány v cp1250.
    # Ostatní znaky jsou poslány v Unicodu. Znamená to ale, že západoevropské znaky
    # se ztratí a my se o tom nedozvíme, protože je budeme považovat za východoevropské.
    # Stránka cp1250 se totiž kryje s tou částí Unicodu, která obsahuje západoevropské znaky.
    my @row_utf = @row;
    @row_utf = map {decode("cp1250", $_)} @row;
    my $jmeno = $row_utf[0];
    my $prijmeni = $row_utf[1];
    my $radek = "$i. $jmeno $prijmeni\n";
    $radek = encode("cp852", $radek);
    print($radek);
}
