/[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.2 - (show 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 #! /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]+|[\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 return $pgdbh->do($sql);
90 }
91
92 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 if (++$refresh >= $refresh_timeout) {
115 $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 if (++$refresh >= $refresh_timeout) {
153 $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 $zastupnistvo, $mjesto, $zip, $ulica_i_broj,
195 $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 if (++$refresh >= $refresh_timeout) {
203 $refresh = 0;
204 print Progress($count, scalar(@$data));
205 }
206 }
207 $sth->finish();
208 return $count;
209 }
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 $sifra =~ s/^(..)//;
218 my $code = $1;
219 $sifra = &ConvertString($sifra);
220 $naziv = &ConvertString($naziv);
221 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 }
244 $tmp = 0 if ($tmp < 0);
245 $count += $tmp;
246 if (++$refresh >= $refresh_timeout) {
247 $refresh = 0;
248 print Progress($count, scalar(@$data));
249 }
250 }
251 return $count;
252 }
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 print "Log left in file \"$log\".\n";
312 exit $?;

  ViewVC Help
Powered by ViewVC 1.1.26