/[registar]/convert.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /convert.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations)
Tue Jun 12 10:11:24 2001 UTC (22 years, 10 months ago) by ravilov
Branch: MAIN
Changes since 1.1: +45 -31 lines
File MIME type: text/plain
Fixed conversion routine for "vodeca". Removed "vodeca" from the scheme.

1 ravilov 1.1 #! /usr/local/bin/perl -w
2     use strict;
3     $| = 1;
4    
5     my $debug = 0;
6 ravilov 1.2 my $raise = 0;
7 ravilov 1.1 my $log = "log";
8     my $xbase = "./registar";
9     my $db = "registar";
10 ravilov 1.2 my $refresh_timeout = 10;
11 ravilov 1.1
12     open(LOG, ">$log") || die "can't open log: $!";
13    
14     use DBI;
15     my $xbdbh = DBI->connect("DBI:XBase:$xbase", "", "",
16     { 'RaiseError' => $raise }) || die $DBI::errstr;
17     my $pgdbh = DBI->connect("DBI:Pg:dbname=$db", "dpavlin", "",
18     { 'RaiseError' => $raise }) || die $DBI::errstr;
19 ravilov 1.2 $SIG{'__WARN__'} = sub { }; # inhibit DBI warnings.
20 ravilov 1.1
21     my @tables = ();
22     if (@ARGV > 0) {
23     push(@tables, @ARGV);
24     } else {
25     push(@tables, <$xbase/*.dbf>);
26     # Sto da radim sa ovima?
27     #push(@tables, <$xbase/*.slk>);
28     #push(@tables, <$xbase/*.sylk>);
29     # OLD GLOBBING METHOD
30     # opendir(DIR, $xbase) || die "can't open dir $xbase";
31     # @tables = grep { /\.dbf/i || /\.slk/i || /\.sylk/i } readdir(DIR);
32     # closedir(DIR);
33     }
34    
35     sub ConvertDate {
36     my ($dt) = @_;
37     if ($dt =~ m,^([12][09]\d\d)([0-1]\d)([0-3]\d)$,) {
38     $dt = ($2 < 1 || $2 > 12 || $1 < 1900 || $3 > 31) ? undef : "$1-$2-$3";
39     } elsif ($dt =~ m,^([12][09]\d\d)([0-1]\d)$,) {
40     $dt = ($2 >= 1 && $2 <= 12) ? "$1-$2-01" : "$1-01-01";
41     } elsif ($dt =~ m,^([12][09]\d\d)$,) {
42     $dt = "$1-01-01";
43     } else {
44     print STDERR "datum? ($dt) [nuke]\n";
45     # $dt = "NULL";
46     $dt = undef;
47     }
48     return $pgdbh->quote($dt);
49     }
50    
51     sub ConvertBool {
52     my ($b) = @_;
53     $b ||= 0;
54     $b = ($b != 0) ? "true" : "false";
55     return $b;
56     }
57    
58     sub ConvertString {
59     my $str = join("\n", @_);
60     $str =~ s/(^[\x00-\x1F]+|[\x00-\x1F]+$)//gs;
61     $str =~ s/\s*\x8D?\s*\r?\s*\n\s*/\n/gs;
62     $str =~ s/(^\s+|\s+$)//gs;
63     $str =~ s/(^"|"$)//g;
64     # char recoding
65     #$str =~ s/&#273;/ð/g;
66     #$str =~ s/&#269;/è/g;
67     #$str =~ s/ý/¾/g;
68     $str =~ tr/{|`~}[\\@^]/¹ð¾èæ©Ð®ÈÆ/;
69     return $pgdbh->quote($str);
70     }
71    
72     sub Progress {
73     my ($count, $total) = @_;
74     return sprintf("%6.2f%%", ($count * 100 / scalar($total)))." done.\r";
75     }
76    
77     sub Log {
78     my $msg = join("\n", @_);
79     print LOG "$msg\n";
80     return "$msg\n";
81     }
82    
83 ravilov 1.2 sub CondInsert {
84     my ($table, $name, $key, $fields, $values) = @_;
85     my $sql = "SELECT $name FROM $table WHERE ($name = $key)";
86     my $cnt = $pgdbh->do($sql);
87     return 0 if ($cnt > 0);
88     $sql = "INSERT INTO $table $fields VALUES $values";
89     return $pgdbh->do($sql);
90     }
91    
92 ravilov 1.1 sub tblATK {
93     my ($table, $fields, $data) = @_;
94     my $count = 0;
95     my $sth = $pgdbh->prepare("INSERT INTO atk_inn (sifra, naziv, razno) VALUES (?, ?, ?)");
96     unless ($sth) {
97     print &Log("[$table-prepare] ".$pgdbh->errstr);
98     return 0;
99     }
100     my $refresh = 0;
101     foreach my $row (@$data) {
102     my ($sifra, $naziv, $razno) = @$row;
103     $sifra = &ConvertString($sifra);
104     $naziv = &ConvertString($naziv);
105     $razno = &ConvertString($razno);
106     my $tmp = $sth->execute($sifra, $naziv, $razno);
107     unless (defined($tmp)) {
108     print &Log("[$table-execute] ".$pgdbh->errstr);
109     next;
110     }
111     $tmp ||= 0;
112     $tmp = 0 if ($tmp < 0);
113     $count += $tmp;
114 ravilov 1.2 if (++$refresh >= $refresh_timeout) {
115 ravilov 1.1 $refresh = 0;
116     print Progress($count, scalar(@$data));
117     }
118     }
119     $sth->finish();
120     return $count;
121     }
122    
123     sub tblDFZupa {
124     my ($table, $fields, $data) = @_;
125     my $count = 0;
126     my $sth = $pgdbh->prepare("INSERT INTO zupanije (broj, naziv, centar, pos_broj, npos_broj, spos_broj, grad, zip) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
127     unless ($sth) {
128     print &Log("[$table-prepare] ".$pgdbh->errstr);
129     return 0;
130     }
131     my $refresh = 0;
132     foreach my $row (@$data) {
133     my ($broj, $naziv, $centar, $pos_broj, $npos_broj,
134     $spos_broj, $grad, $zip, $grad_i) = @$row;
135     $broj += 0; # force numeric
136     $naziv = &ConvertString($naziv);
137     $centar = &ConvertString($centar);
138     $pos_broj = &ConvertString($pos_broj);
139     $npos_broj = &ConvertString($npos_broj);
140     $spos_broj = &ConvertString($spos_broj);
141     $grad = &ConvertString($grad);
142     $zip = &ConvertString($zip);
143     my $tmp = $sth->execute($broj, $naziv, $centar,
144     $pos_broj, $npos_broj, $spos_broj,
145     $grad, $zip);
146     unless (defined($tmp)) {
147     print &Log("[$table-execute] ".$pgdbh->errstr);
148     next;
149     }
150     $tmp = 0 if ($tmp < 0);
151     $count += $tmp;
152 ravilov 1.2 if (++$refresh >= $refresh_timeout) {
153 ravilov 1.1 $refresh = 0;
154     print Progress($count, scalar(@$data));
155     }
156     }
157     $sth->finish();
158     return $count;
159     }
160    
161     sub tblINN {
162     return &tblATK(@_);
163     }
164    
165     sub tblLijek {
166     my ($table, $fields, $data) = @_;
167     # ...
168     return 0;
169     }
170    
171     sub tblProiz {
172     my ($table, $fields, $data) = @_;
173     my $count = 0;
174     my $sth = $pgdbh->prepare("INSERT INTO proizvodjaci (sifra, naziv, drzava, zastupnistvo, mjesto, zip, ulica_i_broj, razno, telefon, fax) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
175     unless ($sth) {
176     print &Log("[$table-prepare] ".$pgdbh->errstr);
177     return 0;
178     }
179     my $refresh = 0;
180     foreach my $row (@$data) {
181     my ($sifra, $naziv, $drzava, $zastupnistvo, $zip, $mjesto,
182     $ulica_i_broj, $razno, $tel, $fax) = @$row;
183     $sifra += 0; # force numeric
184     $naziv = &ConvertString($naziv);
185     $drzava = &ConvertString($drzava);
186     $zastupnistvo = &ConvertString($zastupnistvo);
187     $zip = &ConvertString($zip);
188     $mjesto = &ConvertString($mjesto);
189     $ulica_i_broj = &ConvertString($ulica_i_broj);
190     $razno = &ConvertString($razno);
191     $tel = &ConvertString($tel);
192     $fax = &ConvertString($fax);
193     my $tmp = $sth->execute($sifra, $naziv, $drzava,
194 ravilov 1.2 $zastupnistvo, $mjesto, $zip, $ulica_i_broj,
195 ravilov 1.1 $razno, $tel, $fax);
196     unless (defined($tmp)) {
197     print &Log("[$table-execute] ".$pgdbh->errstr);
198     next;
199     }
200     $tmp = 0 if ($tmp < 0);
201     $count += $tmp;
202 ravilov 1.2 if (++$refresh >= $refresh_timeout) {
203 ravilov 1.1 $refresh = 0;
204     print Progress($count, scalar(@$data));
205     }
206     }
207     $sth->finish();
208 ravilov 1.2 return $count;
209 ravilov 1.1 }
210    
211     sub tblVodeca {
212     my ($table, $fields, $data) = @_;
213     my $count = 0;
214     my $refresh = 0;
215     foreach my $row (@$data) {
216     my ($sifra, $naziv) = @$row;
217 ravilov 1.2 $sifra =~ s/^(..)//;
218     my $code = $1;
219     $sifra = &ConvertString($sifra);
220 ravilov 1.1 $naziv = &ConvertString($naziv);
221 ravilov 1.2 my $tmp = 0;
222     if ($code eq "06") {
223     $tmp += CondInsert("nacin_izdavanja", "sifra", $sifra,
224     "(sifra, opis)", "($sifra, $naziv)");
225     } elsif ($code eq "07") {
226     $tmp += CondInsert("list_fond", "sifra", $sifra,
227     "(sifra, opis)", "($sifra, $naziv)");
228     } elsif ($code eq "08") {
229     $tmp += CondInsert("trudnoca", "sifra", $sifra,
230     "(sifra, opis)", "($sifra, $naziv)");
231     } elsif ($code eq "09") {
232     $tmp += CondInsert("dojencad", "sifra", $sifra,
233     "(sifra, opis)", "($sifra, $naziv)");
234     } elsif ($code eq "10") {
235     $tmp += CondInsert("vozac", "sifra", $sifra,
236     "(sifra, opis)", "($sifra, $naziv)");
237     } elsif ($code eq "11") {
238     $tmp += CondInsert("droga", "sifra", $sifra,
239     "(sifra, opis)", "($sifra, $naziv)");
240     } else {
241     # UNKNOWN CODE!!!
242     print &Log("[WARNING: unknown code \"$code\"]");
243 ravilov 1.1 }
244     $tmp = 0 if ($tmp < 0);
245     $count += $tmp;
246 ravilov 1.2 if (++$refresh >= $refresh_timeout) {
247 ravilov 1.1 $refresh = 0;
248     print Progress($count, scalar(@$data));
249     }
250     }
251 ravilov 1.2 return $count;
252 ravilov 1.1 }
253    
254     my (%dbf) = (
255     "atk" => \&tblATK,
256     "atkstr" => undef,
257     "boja" => undef,
258     "dfzupa" => \&tblDFZupa,
259     "inn" => \&tblINN,
260     "innstr" => undef,
261     "lijek" => \&tblLijek,
262     "lijstr" => undef,
263     "proiz" => \&tblProiz,
264     "prostr" => undef,
265     "registar" => undef,
266     "regstr" => undef,
267     "strukt" => undef,
268     "vodeca" => \&tblVodeca
269     );
270    
271     ### MAIN
272     foreach my $table (@tables) {
273     next unless ($table =~ s/\.dbf$//i);
274     $table =~ s,^.+/([^/]+),$1,;
275     unless (exists($dbf{$table})) {
276     print "[WARNING: Don't know what to do with table \"$table\"!]\n\n";
277     next;
278     }
279     unless (defined($dbf{$table})) {
280     print "[WARNING: Ignoring table \"$table\"]\n\n";
281     next;
282     }
283     print &Log("Working on \"$table\"...");
284     my $sql = "SELECT * FROM $table";
285     my $sth = $xbdbh->prepare($sql) || die "[$sql] ".$xbdbh->errstr();
286     $sth->execute() || die "[$sql] ".$sth->errstr();
287     my @names = @{$sth->{'NAME'}};
288     my @types = @{$sth->{'TYPE'}};
289     if ($debug) {
290     print STDERR "\n#-- \"$table\" structure\n";
291     for (my $i = 0; $i <= scalar(@names); $i++) {
292     next unless ($names[$i]);
293     print STDERR "\t".$names[$i]." (".$types[$i].")\n";
294     }
295     }
296     print "Gathering data...";
297     my @rows = ();
298     while (my @arr = $sth->fetchrow_array()) {
299     push(@rows, \@arr);
300     }
301     $sth->finish();
302     print " done.\n";
303     my $nrows = $dbf{$table}($table, \@names, \@rows);
304     print &Log("Inserted $nrows of ".scalar(@rows)." records in table \"$table\" (".
305     sprintf("%.2f%%", ($nrows * 100 / scalar(@rows))).")");
306     print "\n";
307     }
308     close(LOG);
309     $xbdbh->disconnect();
310     $pgdbh->disconnect();
311 ravilov 1.2 print "Log left in file \"$log\".\n";
312 ravilov 1.1 exit $?;

  ViewVC Help
Powered by ViewVC 1.1.26