/[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.3 - (hide annotations)
Tue Jun 12 12:07:37 2001 UTC (22 years, 10 months ago) by ravilov
Branch: MAIN
Changes since 1.2: +95 -4 lines
File MIME type: text/plain
Wrote conversion routine for "lijekovi". Minor bug fixes.

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 ravilov 1.3 $str =~ s/[\x00-\x1F]+//gs;
61 ravilov 1.1 $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 ravilov 1.3 my $ret = $pgdbh->do($sql);
90     my $err = $pgdbh->errstr;
91     print &Log("[$sql] ".$err) if ($err);
92     return $ret;
93 ravilov 1.2 }
94    
95 ravilov 1.1 sub tblATK {
96     my ($table, $fields, $data) = @_;
97     my $count = 0;
98     my $sth = $pgdbh->prepare("INSERT INTO atk_inn (sifra, naziv, razno) VALUES (?, ?, ?)");
99     unless ($sth) {
100     print &Log("[$table-prepare] ".$pgdbh->errstr);
101     return 0;
102     }
103     my $refresh = 0;
104     foreach my $row (@$data) {
105     my ($sifra, $naziv, $razno) = @$row;
106     $sifra = &ConvertString($sifra);
107     $naziv = &ConvertString($naziv);
108     $razno = &ConvertString($razno);
109     my $tmp = $sth->execute($sifra, $naziv, $razno);
110     unless (defined($tmp)) {
111     print &Log("[$table-execute] ".$pgdbh->errstr);
112     next;
113     }
114     $tmp ||= 0;
115     $tmp = 0 if ($tmp < 0);
116     $count += $tmp;
117 ravilov 1.2 if (++$refresh >= $refresh_timeout) {
118 ravilov 1.1 $refresh = 0;
119     print Progress($count, scalar(@$data));
120     }
121     }
122     $sth->finish();
123     return $count;
124     }
125    
126     sub tblDFZupa {
127     my ($table, $fields, $data) = @_;
128     my $count = 0;
129     my $sth = $pgdbh->prepare("INSERT INTO zupanije (broj, naziv, centar, pos_broj, npos_broj, spos_broj, grad, zip) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
130     unless ($sth) {
131     print &Log("[$table-prepare] ".$pgdbh->errstr);
132     return 0;
133     }
134     my $refresh = 0;
135     foreach my $row (@$data) {
136     my ($broj, $naziv, $centar, $pos_broj, $npos_broj,
137     $spos_broj, $grad, $zip, $grad_i) = @$row;
138     $broj += 0; # force numeric
139     $naziv = &ConvertString($naziv);
140     $centar = &ConvertString($centar);
141     $pos_broj = &ConvertString($pos_broj);
142     $npos_broj = &ConvertString($npos_broj);
143     $spos_broj = &ConvertString($spos_broj);
144     $grad = &ConvertString($grad);
145     $zip = &ConvertString($zip);
146     my $tmp = $sth->execute($broj, $naziv, $centar,
147     $pos_broj, $npos_broj, $spos_broj,
148     $grad, $zip);
149     unless (defined($tmp)) {
150     print &Log("[$table-execute] ".$pgdbh->errstr);
151     next;
152     }
153     $tmp = 0 if ($tmp < 0);
154     $count += $tmp;
155 ravilov 1.2 if (++$refresh >= $refresh_timeout) {
156 ravilov 1.1 $refresh = 0;
157     print Progress($count, scalar(@$data));
158     }
159     }
160     $sth->finish();
161     return $count;
162     }
163    
164     sub tblINN {
165     return &tblATK(@_);
166     }
167    
168     sub tblLijek {
169     my ($table, $fields, $data) = @_;
170 ravilov 1.3 my $count = 0;
171     my $sth = $pgdbh->prepare("INSERT INTO lijekovi (sifra, naziv, sif_atk, sif_inn, sif_proizvodjac, pakovanje, sastav_1, sastav_2, sif_nacin_izdavanja, sif_list_fond, sif_trudnoca, sif_dojencad, sif_vozac, sif_droga, cijena, sif_med, razno, glav_razno, djelovanje, indikacije, oprez) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
172     unless ($sth) {
173     print &Log("[$table-prepare] ".$pgdbh->errstr);
174     return 0;
175     }
176     my $refresh = 0;
177     foreach my $row (@$data) {
178     my ($sifra, $nsifra, $naziv, $sif_proizvodjac, $naz_proizvodjac,
179     $drzava, $zastupnistvo, $mjesto, $ulica_i_broj, $sif_inn,
180     $naz_inn, $sif_atk0, $naz_atk0, $sif_atk, $naz_atk,
181     $pakovanje, $sastav_1, $sastav_2, $sif_nacin_izdavanja,
182     $naz_nacin_izdavanja, $sif_list_fond, $naz_list_fond,
183     $sif_trudnoca, $naz_trudnoca, $sif_dojencad, $naz_dojencad,
184     $sif_vozac, $naz_vozac, $sif_droga, $cijena, $razno,
185     $sif_med, $glav_razno, $prazno, $djelovanje, $indikacije,
186     $oprez, $tel, $fax) = @$row;
187     $sifra += 0; # force numeric
188     $naziv = &ConvertString($naziv);
189     $sif_proizvodjac += 0; # force numeric
190     $naz_proizvodjac = &ConvertString($naz_proizvodjac);
191     $drzava = &ConvertString($drzava);
192     $zastupnistvo = &ConvertString($zastupnistvo);
193     $mjesto = &ConvertString($mjesto);
194     $ulica_i_broj = &ConvertString($ulica_i_broj);
195     $sif_inn = &ConvertString($sif_inn);
196     $naz_inn = &ConvertString($naz_inn);
197     $sif_atk = &ConvertString($sif_atk);
198     $naz_atk = &ConvertString($naz_atk);
199     $pakovanje = &ConvertString($pakovanje);
200     $sastav_1 = &ConvertString($sastav_1);
201     $sastav_2 = &ConvertString($sastav_2);
202     $sif_nacin_izdavanja = &ConvertString($sif_nacin_izdavanja);
203     $naz_nacin_izdavanja = &ConvertString($naz_nacin_izdavanja);
204     $sif_list_fond = &ConvertString($sif_list_fond);
205     $naz_list_fond = &ConvertString($naz_list_fond);
206     $sif_trudnoca = &ConvertString($sif_trudnoca);
207     $naz_trudnoca = &ConvertString($naz_trudnoca);
208     $sif_dojencad = &ConvertString($sif_dojencad);
209     $naz_dojencad = &ConvertString($naz_dojencad);
210     $sif_vozac = &ConvertString($sif_vozac);
211     $naz_vozac = &ConvertString($naz_vozac);
212     $sif_droga = &ConvertString($sif_droga);
213     $cijena = &ConvertString($cijena);
214     $razno = &ConvertString($razno);
215     $sif_med += 0; # force numeric
216     $glav_razno = &ConvertString($glav_razno);
217     $djelovanje = &ConvertString($djelovanje);
218     $indikacije = &ConvertString($indikacije);
219     $oprez = &ConvertString($oprez);
220     $tel = &ConvertString($tel);
221     $fax = &ConvertString($fax);
222     CondInsert("atk_inn", "sifra", $sif_atk,
223     "(sifra, naziv, razno)", "($sif_atk, $naz_atk, '')");
224     CondInsert("atk_inn", "sifra", $sif_inn,
225     "(sifra, naziv, razno)", "($sif_inn, $naz_inn, '')");
226     CondInsert("proizvodjaci", "sifra", $sif_proizvodjac,
227     "(sifra, naziv, drzava, zastupnistvo, mjesto, zip, ulica_i_broj, razno, telefon, fax)",
228     "($sif_proizvodjac, $naz_proizvodjac, $drzava, $zastupnistvo, $mjesto, '', $ulica_i_broj, '', $tel, $fax)");
229     CondInsert("nacin_izdavanja", "sifra", $sif_nacin_izdavanja,
230     "(sifra, opis)", "($sif_nacin_izdavanja, $naz_nacin_izdavanja)");
231     CondInsert("list_fond", "sifra", $sif_list_fond,
232     "(sifra, opis)", "($sif_list_fond, $naz_list_fond)");
233     CondInsert("trudnoca", "sifra", $sif_trudnoca,
234     "(sifra, opis)", "($sif_trudnoca, $naz_trudnoca)");
235     CondInsert("dojencad", "sifra", $sif_dojencad,
236     "(sifra, opis)", "($sif_dojencad, $naz_dojencad)");
237     CondInsert("vozac", "sifra", $sif_vozac,
238     "(sifra, opis)", "($sif_vozac, $naz_vozac)");
239     CondInsert("droga", "sifra", $sif_droga,
240     "(sifra, opis)", "($sif_droga, '')");
241     my $tmp = $sth->execute($sifra, $naziv, $sif_atk, $sif_inn,
242     $sif_proizvodjac, $pakovanje, $sastav_1, $sastav_2,
243     $sif_nacin_izdavanja, $sif_list_fond, $sif_trudnoca,
244     $sif_dojencad, $sif_vozac, $sif_droga, $cijena,
245     $sif_med, $razno, $glav_razno, $djelovanje,
246     $indikacije, $oprez);
247     unless (defined($tmp)) {
248     print &Log("[$table-execute] ".$pgdbh->errstr);
249     next;
250     }
251     $tmp = 0 if ($tmp < 0);
252     $count += $tmp;
253     if (++$refresh >= $refresh_timeout) {
254     $refresh = 0;
255     print Progress($count, scalar(@$data));
256     }
257     }
258     $sth->finish();
259     return $count;
260 ravilov 1.1 }
261    
262     sub tblProiz {
263     my ($table, $fields, $data) = @_;
264     my $count = 0;
265     my $sth = $pgdbh->prepare("INSERT INTO proizvodjaci (sifra, naziv, drzava, zastupnistvo, mjesto, zip, ulica_i_broj, razno, telefon, fax) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
266     unless ($sth) {
267     print &Log("[$table-prepare] ".$pgdbh->errstr);
268     return 0;
269     }
270     my $refresh = 0;
271     foreach my $row (@$data) {
272     my ($sifra, $naziv, $drzava, $zastupnistvo, $zip, $mjesto,
273     $ulica_i_broj, $razno, $tel, $fax) = @$row;
274     $sifra += 0; # force numeric
275     $naziv = &ConvertString($naziv);
276     $drzava = &ConvertString($drzava);
277     $zastupnistvo = &ConvertString($zastupnistvo);
278     $zip = &ConvertString($zip);
279     $mjesto = &ConvertString($mjesto);
280     $ulica_i_broj = &ConvertString($ulica_i_broj);
281     $razno = &ConvertString($razno);
282     $tel = &ConvertString($tel);
283     $fax = &ConvertString($fax);
284     my $tmp = $sth->execute($sifra, $naziv, $drzava,
285 ravilov 1.2 $zastupnistvo, $mjesto, $zip, $ulica_i_broj,
286 ravilov 1.1 $razno, $tel, $fax);
287     unless (defined($tmp)) {
288     print &Log("[$table-execute] ".$pgdbh->errstr);
289     next;
290     }
291     $tmp = 0 if ($tmp < 0);
292     $count += $tmp;
293 ravilov 1.2 if (++$refresh >= $refresh_timeout) {
294 ravilov 1.1 $refresh = 0;
295     print Progress($count, scalar(@$data));
296     }
297     }
298     $sth->finish();
299 ravilov 1.2 return $count;
300 ravilov 1.1 }
301    
302     sub tblVodeca {
303     my ($table, $fields, $data) = @_;
304     my $count = 0;
305     my $refresh = 0;
306     foreach my $row (@$data) {
307     my ($sifra, $naziv) = @$row;
308 ravilov 1.2 $sifra =~ s/^(..)//;
309     my $code = $1;
310     $sifra = &ConvertString($sifra);
311 ravilov 1.1 $naziv = &ConvertString($naziv);
312 ravilov 1.2 my $tmp = 0;
313     if ($code eq "06") {
314     $tmp += CondInsert("nacin_izdavanja", "sifra", $sifra,
315     "(sifra, opis)", "($sifra, $naziv)");
316     } elsif ($code eq "07") {
317     $tmp += CondInsert("list_fond", "sifra", $sifra,
318     "(sifra, opis)", "($sifra, $naziv)");
319     } elsif ($code eq "08") {
320     $tmp += CondInsert("trudnoca", "sifra", $sifra,
321     "(sifra, opis)", "($sifra, $naziv)");
322     } elsif ($code eq "09") {
323     $tmp += CondInsert("dojencad", "sifra", $sifra,
324     "(sifra, opis)", "($sifra, $naziv)");
325     } elsif ($code eq "10") {
326     $tmp += CondInsert("vozac", "sifra", $sifra,
327     "(sifra, opis)", "($sifra, $naziv)");
328     } elsif ($code eq "11") {
329     $tmp += CondInsert("droga", "sifra", $sifra,
330     "(sifra, opis)", "($sifra, $naziv)");
331     } else {
332     # UNKNOWN CODE!!!
333     print &Log("[WARNING: unknown code \"$code\"]");
334 ravilov 1.1 }
335     $tmp = 0 if ($tmp < 0);
336     $count += $tmp;
337 ravilov 1.2 if (++$refresh >= $refresh_timeout) {
338 ravilov 1.1 $refresh = 0;
339     print Progress($count, scalar(@$data));
340     }
341     }
342 ravilov 1.2 return $count;
343 ravilov 1.1 }
344    
345     my (%dbf) = (
346     "atk" => \&tblATK,
347     "atkstr" => undef,
348     "boja" => undef,
349     "dfzupa" => \&tblDFZupa,
350     "inn" => \&tblINN,
351     "innstr" => undef,
352     "lijek" => \&tblLijek,
353     "lijstr" => undef,
354     "proiz" => \&tblProiz,
355     "prostr" => undef,
356     "registar" => undef,
357     "regstr" => undef,
358     "strukt" => undef,
359     "vodeca" => \&tblVodeca
360     );
361    
362     ### MAIN
363     foreach my $table (@tables) {
364     next unless ($table =~ s/\.dbf$//i);
365     $table =~ s,^.+/([^/]+),$1,;
366     unless (exists($dbf{$table})) {
367     print "[WARNING: Don't know what to do with table \"$table\"!]\n\n";
368     next;
369     }
370     unless (defined($dbf{$table})) {
371     print "[WARNING: Ignoring table \"$table\"]\n\n";
372     next;
373     }
374     print &Log("Working on \"$table\"...");
375     my $sql = "SELECT * FROM $table";
376     my $sth = $xbdbh->prepare($sql) || die "[$sql] ".$xbdbh->errstr();
377     $sth->execute() || die "[$sql] ".$sth->errstr();
378     my @names = @{$sth->{'NAME'}};
379     my @types = @{$sth->{'TYPE'}};
380     if ($debug) {
381     print STDERR "\n#-- \"$table\" structure\n";
382     for (my $i = 0; $i <= scalar(@names); $i++) {
383     next unless ($names[$i]);
384     print STDERR "\t".$names[$i]." (".$types[$i].")\n";
385     }
386     }
387     print "Gathering data...";
388     my @rows = ();
389     while (my @arr = $sth->fetchrow_array()) {
390     push(@rows, \@arr);
391     }
392     $sth->finish();
393     print " done.\n";
394     my $nrows = $dbf{$table}($table, \@names, \@rows);
395     print &Log("Inserted $nrows of ".scalar(@rows)." records in table \"$table\" (".
396     sprintf("%.2f%%", ($nrows * 100 / scalar(@rows))).")");
397     print "\n";
398     }
399     close(LOG);
400     $xbdbh->disconnect();
401     $pgdbh->disconnect();
402 ravilov 1.2 print "Log left in file \"$log\".\n";
403 ravilov 1.1 exit $?;

  ViewVC Help
Powered by ViewVC 1.1.26