/[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

Contents of /convert.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (show 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 #! /usr/local/bin/perl -w
2 use strict;
3 $| = 1;
4
5 my $debug = 0;
6 my $raise = 0;
7 my $log = "log";
8 my $xbase = "./registar";
9 my $db = "registar";
10 my $refresh_timeout = 10;
11
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 $SIG{'__WARN__'} = sub { }; # inhibit DBI warnings.
20
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]+//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 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 my $ret = $pgdbh->do($sql);
90 my $err = $pgdbh->errstr;
91 print &Log("[$sql] ".$err) if ($err);
92 return $ret;
93 }
94
95 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 if (++$refresh >= $refresh_timeout) {
118 $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 if (++$refresh >= $refresh_timeout) {
156 $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 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 }
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 $zastupnistvo, $mjesto, $zip, $ulica_i_broj,
286 $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 if (++$refresh >= $refresh_timeout) {
294 $refresh = 0;
295 print Progress($count, scalar(@$data));
296 }
297 }
298 $sth->finish();
299 return $count;
300 }
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 $sifra =~ s/^(..)//;
309 my $code = $1;
310 $sifra = &ConvertString($sifra);
311 $naziv = &ConvertString($naziv);
312 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 }
335 $tmp = 0 if ($tmp < 0);
336 $count += $tmp;
337 if (++$refresh >= $refresh_timeout) {
338 $refresh = 0;
339 print Progress($count, scalar(@$data));
340 }
341 }
342 return $count;
343 }
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 print "Log left in file \"$log\".\n";
403 exit $?;

  ViewVC Help
Powered by ViewVC 1.1.26