| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
|
|
2
|
|
|
|
|
|
|
################################################################################### |
|
3
|
|
|
|
|
|
|
# |
|
4
|
|
|
|
|
|
|
# DBIx::Recordset - Copyright (c) 1997-2000 Gerald Richter / ECOS |
|
5
|
|
|
|
|
|
|
# |
|
6
|
|
|
|
|
|
|
# You may distribute under the terms of either the GNU General Public |
|
7
|
|
|
|
|
|
|
# License or the Artistic License, as specified in the Perl README file. |
|
8
|
|
|
|
|
|
|
# |
|
9
|
|
|
|
|
|
|
# THIS IS BETA SOFTWARE! |
|
10
|
|
|
|
|
|
|
# |
|
11
|
|
|
|
|
|
|
# THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR |
|
12
|
|
|
|
|
|
|
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
|
13
|
|
|
|
|
|
|
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
|
14
|
|
|
|
|
|
|
# |
|
15
|
|
|
|
|
|
|
# $Id: Database.pm,v 1.18 2001/07/09 19:59:48 richter Exp $ |
|
16
|
|
|
|
|
|
|
# |
|
17
|
|
|
|
|
|
|
################################################################################### |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
package DBIx::Database::Base ; |
|
21
|
|
|
|
|
|
|
|
|
22
|
1
|
|
|
1
|
|
6
|
use strict 'vars' ; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
32
|
|
|
23
|
|
|
|
|
|
|
|
|
24
|
1
|
|
|
1
|
|
5
|
use vars qw{$LastErr $LastErrstr *LastErr *LastErrstr *LastError $PreserveCase} ; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
149
|
|
|
25
|
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
*LastErr = \$DBIx::Recordset::LastErr ; |
|
27
|
|
|
|
|
|
|
*LastErrstr = \$DBIx::Recordset::LastErrstr ; |
|
28
|
|
|
|
|
|
|
*LastError = \&DBIx::Recordset::LastError ; |
|
29
|
|
|
|
|
|
|
*PreserveCase = \$DBIx::Recordset::PreserveCase; |
|
30
|
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
|
|
32
|
1
|
|
|
1
|
|
6
|
use Carp qw(confess); |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
53
|
|
|
33
|
|
|
|
|
|
|
|
|
34
|
1
|
|
|
1
|
|
5
|
use File::Spec ; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
32
|
|
|
35
|
1
|
|
|
1
|
|
6
|
use DBIx::Recordset ; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
26
|
|
|
36
|
1
|
|
|
1
|
|
927
|
use Text::ParseWords ; |
|
|
1
|
|
|
|
|
1327
|
|
|
|
1
|
|
|
|
|
2720
|
|
|
37
|
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
40
|
|
|
|
|
|
|
## |
|
41
|
|
|
|
|
|
|
## savecroak |
|
42
|
|
|
|
|
|
|
## |
|
43
|
|
|
|
|
|
|
## croaks and save error |
|
44
|
|
|
|
|
|
|
## |
|
45
|
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
sub savecroak |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
{ |
|
50
|
0
|
|
|
0
|
|
|
my ($self, $msg, $code) = @_ ; |
|
51
|
|
|
|
|
|
|
|
|
52
|
0
|
|
0
|
|
|
|
$LastErr = $self->{'*LastErr'} = $code || $dbi::err || -1 ; |
|
53
|
0
|
|
0
|
|
|
|
$LastErrstr = $self->{'*LastErrstr'} = $msg || $DBI::errstr || ("croak from " . caller) ; |
|
54
|
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
#$Carp::extra = 1 ; |
|
56
|
|
|
|
|
|
|
#Carp::croak $msg ; |
|
57
|
0
|
|
|
|
|
|
confess($msg); |
|
58
|
|
|
|
|
|
|
} |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
61
|
|
|
|
|
|
|
## |
|
62
|
|
|
|
|
|
|
## DoOnConnect |
|
63
|
|
|
|
|
|
|
## |
|
64
|
|
|
|
|
|
|
## in $cmd sql cmds |
|
65
|
|
|
|
|
|
|
## |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
sub DoOnConnect |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
{ |
|
70
|
0
|
|
|
0
|
|
|
my ($self, $cmd) = @_ ; |
|
71
|
|
|
|
|
|
|
|
|
72
|
0
|
0
|
|
|
|
|
if ($cmd) |
|
73
|
|
|
|
|
|
|
{ |
|
74
|
0
|
0
|
|
|
|
|
if (ref ($cmd) eq 'ARRAY') |
|
|
|
0
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
{ |
|
76
|
0
|
|
|
|
|
|
foreach (@$cmd) |
|
77
|
|
|
|
|
|
|
{ |
|
78
|
0
|
|
|
|
|
|
$self -> do ($_) ; |
|
79
|
|
|
|
|
|
|
} |
|
80
|
|
|
|
|
|
|
} |
|
81
|
|
|
|
|
|
|
elsif (ref ($cmd) eq 'HASH') |
|
82
|
|
|
|
|
|
|
{ |
|
83
|
0
|
|
|
|
|
|
$self -> DoOnConnect ($cmd -> {'*'}) ; |
|
84
|
0
|
|
|
|
|
|
$self -> DoOnConnect ($cmd -> {$self -> {'*Driver'}}) ; |
|
85
|
|
|
|
|
|
|
} |
|
86
|
|
|
|
|
|
|
else |
|
87
|
|
|
|
|
|
|
{ |
|
88
|
0
|
|
|
|
|
|
$self -> do ($cmd) ; |
|
89
|
|
|
|
|
|
|
} |
|
90
|
|
|
|
|
|
|
} |
|
91
|
|
|
|
|
|
|
} |
|
92
|
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
95
|
|
|
|
|
|
|
## |
|
96
|
|
|
|
|
|
|
## DBHdl |
|
97
|
|
|
|
|
|
|
## |
|
98
|
|
|
|
|
|
|
## return DBI database handle |
|
99
|
|
|
|
|
|
|
## |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
sub DBHdl ($) |
|
102
|
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
{ |
|
104
|
0
|
|
|
0
|
|
|
return $_[0] -> {'*DBHdl'} ; |
|
105
|
|
|
|
|
|
|
} |
|
106
|
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
109
|
|
|
|
|
|
|
## |
|
110
|
|
|
|
|
|
|
## do an non select statement |
|
111
|
|
|
|
|
|
|
## |
|
112
|
|
|
|
|
|
|
## $statement = statement to do |
|
113
|
|
|
|
|
|
|
## \%attr = attribs (optional) |
|
114
|
|
|
|
|
|
|
## @bind_valus= values to bind (optional) |
|
115
|
|
|
|
|
|
|
## or |
|
116
|
|
|
|
|
|
|
## \@bind_valus= values to bind (optional) |
|
117
|
|
|
|
|
|
|
## \@bind_types = data types of bind_values |
|
118
|
|
|
|
|
|
|
## |
|
119
|
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
sub do($$;$$$) |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
{ |
|
123
|
0
|
|
|
0
|
|
|
my($self, $statement, $attribs, @params) = @_; |
|
124
|
|
|
|
|
|
|
|
|
125
|
0
|
|
|
|
|
|
$self -> {'*LastSQLStatement'} = $statement ; |
|
126
|
|
|
|
|
|
|
|
|
127
|
0
|
|
|
|
|
|
my $ret ; |
|
128
|
|
|
|
|
|
|
my $bval ; |
|
129
|
0
|
|
|
|
|
|
my $btype ; |
|
130
|
0
|
|
|
|
|
|
my $dbh ; |
|
131
|
0
|
|
|
|
|
|
my $sth ; |
|
132
|
|
|
|
|
|
|
|
|
133
|
0
|
0
|
0
|
|
|
|
if (@params > 1 && ref ($bval = $params[0]) eq 'ARRAY' && ref ($btype = $params[1]) eq 'ARRAY') |
|
|
|
|
0
|
|
|
|
|
|
134
|
|
|
|
|
|
|
{ |
|
135
|
0
|
0
|
|
|
|
|
if ($self->{'*Debug'} > 1) { local $^W = 0 ; print DBIx::Recordset::LOG "DB: do '$statement' bind_values=<@$bval> bind_types=<@$btype>\n" } ; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
136
|
0
|
|
|
|
|
|
$dbh = $self->{'*DBHdl'} ; |
|
137
|
0
|
|
|
|
|
|
$sth = $dbh -> prepare ($statement, $attribs) ; |
|
138
|
0
|
|
0
|
|
|
|
my $Numeric = $self->{'*NumericTypes'} || {} ; |
|
139
|
0
|
|
|
|
|
|
local $^W = 0 ; # avoid warnings |
|
140
|
0
|
0
|
|
|
|
|
if (defined ($sth)) |
|
141
|
|
|
|
|
|
|
{ |
|
142
|
0
|
|
|
|
|
|
for (my $i = 0 ; $i < @$bval; $i++) |
|
143
|
|
|
|
|
|
|
{ |
|
144
|
0
|
0
|
0
|
|
|
|
$bval -> [$i] += 0 if (defined ($bval -> [$i]) && defined ($btype -> [$i]) && $Numeric -> {$btype -> [$i]}) ; |
|
|
|
|
0
|
|
|
|
|
|
145
|
|
|
|
|
|
|
#$sth -> bind_param ($i+1, $bval -> [$i], $btype -> [$i]) ; |
|
146
|
|
|
|
|
|
|
#$sth -> bind_param ($i+1, $bval -> [$i], $btype -> [$i] == DBI::SQL_CHAR()?DBI::SQL_CHAR():undef ) ; |
|
147
|
0
|
|
|
|
|
|
my $bt = $btype -> [$i] ; |
|
148
|
0
|
0
|
0
|
|
|
|
$sth -> bind_param ($i+1, $bval -> [$i], (defined ($bt) && $bt <= DBI::SQL_CHAR())?{TYPE=>$bt}:undef ) ; |
|
149
|
|
|
|
|
|
|
} |
|
150
|
0
|
|
|
|
|
|
$ret = $sth -> execute ; |
|
151
|
|
|
|
|
|
|
} |
|
152
|
|
|
|
|
|
|
} |
|
153
|
|
|
|
|
|
|
else |
|
154
|
|
|
|
|
|
|
{ |
|
155
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "DB: do $statement <@params>\n" if ($self->{'*Debug'} > 1) ; |
|
156
|
|
|
|
|
|
|
|
|
157
|
0
|
|
|
|
|
|
$ret = $self->{'*DBHdl'} -> do ($statement, $attribs, @params) ; |
|
158
|
|
|
|
|
|
|
} |
|
159
|
|
|
|
|
|
|
|
|
160
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "DB: do returned " . (defined ($ret)?$ret:'') . "\n" if ($self->{'*Debug'} > 2) ; |
|
|
|
0
|
|
|
|
|
|
|
161
|
0
|
0
|
0
|
|
|
|
print DBIx::Recordset::LOG "DB: ERROR $DBI::errstr\n" if (!$ret && $self->{'*Debug'}) ; |
|
162
|
0
|
0
|
0
|
|
|
|
print DBIx::Recordset::LOG "DB: in do $statement <@params>\n" if (!$ret && $self->{'*Debug'} == 1) ; |
|
163
|
|
|
|
|
|
|
|
|
164
|
0
|
|
|
|
|
|
$LastErr = $self->{'*LastErr'} = $DBI::err ; |
|
165
|
0
|
|
|
|
|
|
$LastErrstr = $self->{'*LastErrstr'} = $DBI::errstr ; |
|
166
|
|
|
|
|
|
|
|
|
167
|
0
|
|
|
|
|
|
return $ret ; |
|
168
|
|
|
|
|
|
|
} |
|
169
|
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
172
|
|
|
|
|
|
|
## |
|
173
|
|
|
|
|
|
|
## QueryMetaData |
|
174
|
|
|
|
|
|
|
## |
|
175
|
|
|
|
|
|
|
## $table = table (multiple tables must be comma separated) |
|
176
|
|
|
|
|
|
|
## |
|
177
|
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
sub QueryMetaData($$) |
|
180
|
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
{ |
|
182
|
0
|
|
|
0
|
|
|
my ($self, $table) = @_ ; |
|
183
|
|
|
|
|
|
|
|
|
184
|
0
|
0
|
|
|
|
|
$table = lc($table) if (!$PreserveCase) ; |
|
185
|
|
|
|
|
|
|
|
|
186
|
0
|
|
|
|
|
|
my $meta ; |
|
187
|
0
|
|
|
|
|
|
my $metakey = "$self->{'*DataSource'}//" . $table ; |
|
188
|
|
|
|
|
|
|
|
|
189
|
0
|
0
|
|
|
|
|
if (defined ($meta = $DBIx::Recordset::Metadata{$metakey})) |
|
190
|
|
|
|
|
|
|
{ |
|
191
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "DB: use cached meta data for $table\n" if ($self->{'*Debug'} > 2) ; |
|
192
|
0
|
|
|
|
|
|
return $meta |
|
193
|
|
|
|
|
|
|
} |
|
194
|
|
|
|
|
|
|
|
|
195
|
0
|
|
|
|
|
|
my $hdl = $self->{'*DBHdl'} ; |
|
196
|
0
|
|
|
|
|
|
my $drv = $self->{'*Driver'} ; |
|
197
|
0
|
|
|
|
|
|
my $sth ; |
|
198
|
|
|
|
|
|
|
|
|
199
|
0
|
|
|
|
|
|
my $ListFields = DBIx::Compat::GetItem ($drv, 'ListFields') ; |
|
200
|
0
|
|
|
|
|
|
my $QuoteTypes = DBIx::Compat::GetItem ($drv, 'QuoteTypes') ; |
|
201
|
0
|
|
|
|
|
|
my $NumericTypes = DBIx::Compat::GetItem ($drv, 'NumericTypes') ; |
|
202
|
0
|
|
|
|
|
|
my $HaveTypes = DBIx::Compat::GetItem ($drv, 'HaveTypes') ; |
|
203
|
|
|
|
|
|
|
#my @tabs = split (/\s*\,\s*/, $table) ; |
|
204
|
0
|
|
|
|
|
|
my @tabs = quotewords ('\s*,\s*', 1, $table) ; |
|
205
|
0
|
|
|
|
|
|
my $tab ; |
|
206
|
|
|
|
|
|
|
my $ltab ; |
|
207
|
0
|
|
|
|
|
|
my %Quote ; |
|
208
|
0
|
|
|
|
|
|
my %Numeric ; |
|
209
|
0
|
|
|
|
|
|
my @Names ; |
|
210
|
0
|
|
|
|
|
|
my @Types ; |
|
211
|
0
|
|
|
|
|
|
my @FullNames ; |
|
212
|
0
|
|
|
|
|
|
my %Table4Field ; |
|
213
|
0
|
|
|
|
|
|
my %Type4Field ; |
|
214
|
0
|
|
|
|
|
|
my $i ; |
|
215
|
|
|
|
|
|
|
|
|
216
|
0
|
|
|
|
|
|
foreach $tab (@tabs) |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
{ |
|
219
|
0
|
0
|
|
|
|
|
next if ($tab =~ /^\s*$/) ; |
|
220
|
|
|
|
|
|
|
|
|
221
|
0
|
|
|
|
|
|
eval { |
|
222
|
0
|
0
|
|
|
|
|
$sth = &{$ListFields}($hdl, $tab) or carp ("Cannot list fields for $tab ($DBI::errstr)") ; |
|
|
0
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
} ; |
|
224
|
0
|
0
|
|
|
|
|
next if ($@) ; # ignore any table for which we can't get fields |
|
225
|
|
|
|
|
|
|
|
|
226
|
0
|
0
|
|
|
|
|
if ($tab =~ /^"(.*?)"$/) |
|
227
|
0
|
|
|
|
|
|
{ $ltab = $1 ; } |
|
228
|
|
|
|
|
|
|
else |
|
229
|
0
|
|
|
|
|
|
{ $ltab = $tab ; } |
|
230
|
|
|
|
|
|
|
|
|
231
|
0
|
|
|
|
|
|
my $types ; |
|
232
|
0
|
0
|
|
|
|
|
my $fields = $sth?$sth -> FETCH ($PreserveCase?'NAME':'NAME_lc'):[] ; |
|
|
|
0
|
|
|
|
|
|
|
233
|
0
|
|
|
|
|
|
my $num = $#{$fields} + 1 ; |
|
|
0
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
|
|
235
|
0
|
0
|
0
|
|
|
|
if ($HaveTypes && $sth) |
|
236
|
|
|
|
|
|
|
{ |
|
237
|
|
|
|
|
|
|
#print DBIx::Recordset::LOG "DB: Have Types for driver\n" ; |
|
238
|
0
|
|
|
|
|
|
$types = $sth -> FETCH ('TYPE') ; |
|
239
|
|
|
|
|
|
|
} |
|
240
|
|
|
|
|
|
|
else |
|
241
|
|
|
|
|
|
|
{ |
|
242
|
|
|
|
|
|
|
#print DBIx::Recordset::LOG "DB: No Types for driver\n" ; |
|
243
|
|
|
|
|
|
|
# Drivers does not have fields types -> give him SQL_VARCHAR |
|
244
|
0
|
|
|
|
|
|
$types = [] ; |
|
245
|
0
|
|
|
|
|
|
for ($i = 0; $i < $num; $i++) |
|
246
|
0
|
|
|
|
|
|
{ push @$types, DBI::SQL_VARCHAR (); } |
|
247
|
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
# Setup quoting for SQL_VARCHAR |
|
249
|
0
|
|
|
|
|
|
$QuoteTypes = { DBI::SQL_VARCHAR() => 1 } ; |
|
250
|
0
|
|
|
|
|
|
$NumericTypes = { } ; |
|
251
|
|
|
|
|
|
|
} |
|
252
|
|
|
|
|
|
|
|
|
253
|
0
|
|
|
|
|
|
push @Names, @$fields ; |
|
254
|
0
|
|
|
|
|
|
push @Types, @$types ; |
|
255
|
0
|
|
|
|
|
|
$i = 0 ; |
|
256
|
0
|
|
|
|
|
|
foreach (@$fields) |
|
257
|
|
|
|
|
|
|
{ |
|
258
|
0
|
|
|
|
|
|
$Table4Field{$_} = $ltab ; |
|
259
|
0
|
|
|
|
|
|
$Table4Field{"$ltab.$_"} = $ltab ; |
|
260
|
0
|
|
|
|
|
|
$Type4Field{"$_"} = $types -> [$i] ; |
|
261
|
0
|
|
|
|
|
|
$Type4Field{"$ltab.$_"} = $types -> [$i++] ; |
|
262
|
0
|
|
|
|
|
|
push @FullNames, "$ltab.$_" ; |
|
263
|
|
|
|
|
|
|
} |
|
264
|
|
|
|
|
|
|
|
|
265
|
0
|
0
|
|
|
|
|
$sth -> finish if ($sth) ; |
|
266
|
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
# Set up a hash which tells us which fields to quote and which not |
|
268
|
|
|
|
|
|
|
# We setup two versions, one with tablename and one without |
|
269
|
0
|
|
|
|
|
|
my $col ; |
|
270
|
|
|
|
|
|
|
my $fieldname ; |
|
271
|
0
|
|
|
|
|
|
for ($col = 0; $col < $num; $col++ ) |
|
272
|
|
|
|
|
|
|
{ |
|
273
|
0
|
0
|
|
|
|
|
if ($self->{'*Debug'} > 2) |
|
274
|
|
|
|
|
|
|
{ |
|
275
|
0
|
|
|
|
|
|
my $n = $$fields[$col] ; |
|
276
|
0
|
|
|
|
|
|
my $t = $$types[$col] ; |
|
277
|
0
|
|
|
|
|
|
print DBIx::Recordset::LOG "DB: TAB = $tab, COL = $col, NAME = $n, TYPE = $t" ; |
|
278
|
|
|
|
|
|
|
} |
|
279
|
0
|
|
|
|
|
|
$fieldname = $$fields[$col] ; |
|
280
|
0
|
0
|
|
|
|
|
if ($$QuoteTypes{$$types[$col]}) |
|
281
|
|
|
|
|
|
|
{ |
|
282
|
|
|
|
|
|
|
#print DBIx::Recordset::LOG " -> quote\n" if ($self->{'*Debug'} > 2) ; |
|
283
|
0
|
|
|
|
|
|
$Quote {"$tab.$fieldname"} = 1 ; |
|
284
|
0
|
|
|
|
|
|
$Quote {"$fieldname"} = 1 ; |
|
285
|
|
|
|
|
|
|
} |
|
286
|
|
|
|
|
|
|
else |
|
287
|
|
|
|
|
|
|
{ |
|
288
|
|
|
|
|
|
|
#print DBIx::Recordset::LOG "\n" if ($self->{'*Debug'} > 2) ; |
|
289
|
0
|
|
|
|
|
|
$Quote {"$tab.$fieldname"} = 0 ; |
|
290
|
0
|
|
|
|
|
|
$Quote {"$fieldname"} = 0 ; |
|
291
|
|
|
|
|
|
|
} |
|
292
|
0
|
0
|
|
|
|
|
if ($$NumericTypes{$$types[$col]}) |
|
293
|
|
|
|
|
|
|
{ |
|
294
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG " -> numeric\n" if ($self->{'*Debug'} > 2) ; |
|
295
|
0
|
|
|
|
|
|
$Numeric {"$tab.$fieldname"} = 1 ; |
|
296
|
0
|
|
|
|
|
|
$Numeric {"$fieldname"} = 1 ; |
|
297
|
|
|
|
|
|
|
} |
|
298
|
|
|
|
|
|
|
else |
|
299
|
|
|
|
|
|
|
{ |
|
300
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "\n" if ($self->{'*Debug'} > 2) ; |
|
301
|
0
|
|
|
|
|
|
$Numeric {"$tab.$fieldname"} = 0 ; |
|
302
|
0
|
|
|
|
|
|
$Numeric {"$fieldname"} = 0 ; |
|
303
|
|
|
|
|
|
|
} |
|
304
|
|
|
|
|
|
|
} |
|
305
|
0
|
0
|
0
|
|
|
|
print DBIx::Recordset::LOG "No Fields found for $tab\n" if ($num == 0 && $self->{'*Debug'} > 1) ; |
|
306
|
|
|
|
|
|
|
} |
|
307
|
|
|
|
|
|
|
|
|
308
|
0
|
0
|
0
|
|
|
|
print DBIx::Recordset::LOG "No Tables specified\n" if ($#tabs < 0 && $self->{'*Debug'} > 1) ; |
|
309
|
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
|
|
311
|
0
|
|
|
|
|
|
$meta = {} ; |
|
312
|
0
|
|
|
|
|
|
$meta->{'*Table4Field'} = \%Table4Field ; |
|
313
|
0
|
|
|
|
|
|
$meta->{'*Type4Field'} = \%Type4Field ; |
|
314
|
0
|
|
|
|
|
|
$meta->{'*FullNames'} = \@FullNames ; |
|
315
|
0
|
|
|
|
|
|
$meta->{'*Names'} = \@Names ; |
|
316
|
0
|
|
|
|
|
|
$meta->{'*Types'} = \@Types ; |
|
317
|
0
|
|
|
|
|
|
$meta->{'*Quote'} = \%Quote ; |
|
318
|
0
|
|
|
|
|
|
$meta->{'*Numeric'} = \%Numeric ; |
|
319
|
0
|
|
|
|
|
|
$meta->{'*NumericTypes'} = $NumericTypes ; |
|
320
|
|
|
|
|
|
|
|
|
321
|
0
|
|
|
|
|
|
$DBIx::Recordset::Metadata{$metakey} = $meta ; |
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
|
|
324
|
0
|
0
|
|
|
|
|
if (!exists ($meta -> {'*Links'})) |
|
325
|
|
|
|
|
|
|
{ |
|
326
|
0
|
|
|
|
|
|
my $ltab ; |
|
327
|
|
|
|
|
|
|
my $lfield ; |
|
328
|
0
|
|
|
|
|
|
my $metakey ; |
|
329
|
0
|
|
|
|
|
|
my $subnames ; |
|
330
|
0
|
|
|
|
|
|
my $n ; |
|
331
|
|
|
|
|
|
|
|
|
332
|
0
|
|
|
|
|
|
$meta -> {'*Links'} = {} ; |
|
333
|
|
|
|
|
|
|
|
|
334
|
0
|
|
|
|
|
|
my $metakeydsn = "$self->{'*DataSource'}//-" ; |
|
335
|
0
|
|
0
|
|
|
|
my $metakeydsntf = "$self->{'*DataSource'}//-" . ($self->{'*TableFilter'}||''); |
|
336
|
0
|
|
0
|
|
|
|
my $metadsn = $DBIx::Recordset::Metadata{$metakeydsn} || {} ; |
|
337
|
0
|
|
0
|
|
|
|
my $tabmetadsn = $DBIx::Recordset::Metadata{$metakeydsntf} || {} ; |
|
338
|
0
|
|
|
|
|
|
my $tables = $tabmetadsn -> {'*Tables'} ; |
|
339
|
|
|
|
|
|
|
|
|
340
|
0
|
0
|
|
|
|
|
if (!$tables) |
|
341
|
|
|
|
|
|
|
{ # Query the driver, which tables are available |
|
342
|
0
|
|
|
|
|
|
my $ListTables = DBIx::Compat::GetItem ($drv, 'ListTables') ; |
|
343
|
|
|
|
|
|
|
|
|
344
|
0
|
0
|
|
|
|
|
if ($ListTables) |
|
345
|
|
|
|
|
|
|
{ |
|
346
|
0
|
0
|
|
|
|
|
my @tabs = &{$ListTables}($hdl) or $self -> savecroak ("Cannot list tables for $self->{'*DataSource'} ($DBI::errstr)") ; |
|
|
0
|
|
|
|
|
|
|
|
347
|
0
|
|
|
|
|
|
my @stab ; |
|
348
|
|
|
|
|
|
|
my $stab ; |
|
349
|
0
|
|
0
|
|
|
|
my $tabfilter = $self -> {'*TableFilter'} || '.' ; |
|
350
|
0
|
|
|
|
|
|
foreach (@tabs) |
|
351
|
|
|
|
|
|
|
{ |
|
352
|
0
|
|
|
|
|
|
s/^[^a-zA-Z0-9_.]// ; |
|
353
|
0
|
|
|
|
|
|
s/[^a-zA-Z0-9_.]$// ; |
|
354
|
0
|
0
|
|
|
|
|
if ($_ =~ /(^|\.)$tabfilter/i) |
|
355
|
|
|
|
|
|
|
{ |
|
356
|
0
|
|
|
|
|
|
@stab = split (/\./); |
|
357
|
0
|
0
|
|
|
|
|
$stab = $PreserveCase?(pop @stab):lc (pop @stab) ; |
|
358
|
0
|
|
|
|
|
|
$tables -> {$stab} = $_ ; |
|
359
|
|
|
|
|
|
|
} |
|
360
|
|
|
|
|
|
|
} |
|
361
|
0
|
|
|
|
|
|
$tabmetadsn -> {'*Tables'} = $tables ; |
|
362
|
0
|
0
|
|
|
|
|
if ($self->{'*Debug'} > 3) |
|
363
|
|
|
|
|
|
|
{ |
|
364
|
0
|
|
|
|
|
|
my $t ; |
|
365
|
0
|
|
|
|
|
|
foreach $t (keys %$tables) |
|
366
|
0
|
|
|
|
|
|
{ print DBIx::Recordset::LOG "DB: Found table $t => $tables->{$t}\n" ; } |
|
367
|
|
|
|
|
|
|
} |
|
368
|
|
|
|
|
|
|
} |
|
369
|
|
|
|
|
|
|
else |
|
370
|
|
|
|
|
|
|
{ |
|
371
|
0
|
|
|
|
|
|
$tabmetadsn -> {'*Tables'} = {} ; |
|
372
|
|
|
|
|
|
|
} |
|
373
|
|
|
|
|
|
|
|
|
374
|
0
|
|
|
|
|
|
$DBIx::Recordset::Metadata{$metakeydsn} = $metadsn ; |
|
375
|
0
|
0
|
|
|
|
|
$DBIx::Recordset::Metadata{"$metakeydsn$self->{'*TableFilter'}"} = $tabmetadsn if ($self->{'*TableFilter'}) ; |
|
376
|
|
|
|
|
|
|
} |
|
377
|
|
|
|
|
|
|
|
|
378
|
0
|
0
|
|
|
|
|
if ($#tabs <= 0) |
|
379
|
|
|
|
|
|
|
{ |
|
380
|
0
|
|
|
|
|
|
my $fullname ; |
|
381
|
0
|
|
|
|
|
|
my $tabfilter = $self -> {'*TableFilter'} ; |
|
382
|
0
|
|
|
|
|
|
my $fullltab ; |
|
383
|
0
|
|
|
|
|
|
my $tableshort = $table ; |
|
384
|
0
|
0
|
0
|
|
|
|
if ($tabfilter && ($table =~ /^$tabfilter(.*?)$/)) |
|
385
|
|
|
|
|
|
|
{ |
|
386
|
0
|
|
|
|
|
|
$tableshort = $1 ; |
|
387
|
|
|
|
|
|
|
} |
|
388
|
0
|
|
|
|
|
|
foreach $fullname (@FullNames) |
|
389
|
|
|
|
|
|
|
{ |
|
390
|
0
|
|
|
|
|
|
my ($ntab, $n) = split (/\./, $fullname) ; |
|
391
|
0
|
|
|
|
|
|
my $prefix = '' ; |
|
392
|
0
|
|
|
|
|
|
my $fullntab = $ntab ; |
|
393
|
|
|
|
|
|
|
|
|
394
|
0
|
0
|
0
|
|
|
|
if ($tabfilter && ($ntab =~ /^$tabfilter(.*?)$/)) |
|
395
|
|
|
|
|
|
|
{ |
|
396
|
0
|
|
|
|
|
|
$ntab = $1 ; |
|
397
|
|
|
|
|
|
|
} |
|
398
|
|
|
|
|
|
|
|
|
399
|
0
|
0
|
|
|
|
|
if ($n =~ /^(.*?)__(.*?)$/) |
|
400
|
|
|
|
|
|
|
{ |
|
401
|
0
|
|
|
|
|
|
$prefix = "$1__" ; |
|
402
|
0
|
|
|
|
|
|
$n = $2 ; |
|
403
|
|
|
|
|
|
|
} |
|
404
|
|
|
|
|
|
|
|
|
405
|
0
|
|
|
|
|
|
my @part = split (/_/, $n) ; |
|
406
|
0
|
|
0
|
|
|
|
my $tf = $tabfilter || '' ; |
|
407
|
0
|
|
|
|
|
|
for (my $i = 0; $i < $#part; $i++) |
|
408
|
|
|
|
|
|
|
{ |
|
409
|
0
|
|
|
|
|
|
$ltab = join ('_', @part[0..$i]) ; |
|
410
|
0
|
|
|
|
|
|
$lfield = join ('_', @part[$i + 1..$#part]) ; |
|
411
|
|
|
|
|
|
|
|
|
412
|
0
|
0
|
|
|
|
|
next if (!$ltab) ; |
|
413
|
|
|
|
|
|
|
|
|
414
|
0
|
0
|
0
|
|
|
|
if (!$tables -> {$ltab} && $tables -> {"$tf$ltab"}) |
|
415
|
0
|
|
|
|
|
|
{ $fullltab = "$tabfilter$ltab" } |
|
416
|
|
|
|
|
|
|
else |
|
417
|
0
|
|
|
|
|
|
{ $fullltab = $ltab } |
|
418
|
|
|
|
|
|
|
|
|
419
|
0
|
0
|
|
|
|
|
if ($tables -> {$fullltab}) |
|
420
|
|
|
|
|
|
|
{ |
|
421
|
0
|
|
|
|
|
|
$metakey = $self -> QueryMetaData ($fullltab) ; |
|
422
|
0
|
|
|
|
|
|
$subnames = $metakey -> {'*Names'} ; |
|
423
|
0
|
0
|
|
|
|
|
if (grep (/^$lfield$/i, @$subnames)) |
|
424
|
|
|
|
|
|
|
{ # setup link |
|
425
|
0
|
|
|
|
|
|
$meta -> {'*Links'}{"-$prefix$ltab"} = {'!Table' => $fullltab, '!LinkedField' => $lfield, '!MainField' => "$prefix$n", '!MainTable' => $fullntab} ; |
|
426
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "Link found for $ntab.$prefix$n to $ltab.$lfield\n" if ($self->{'*Debug'} > 2) ; |
|
427
|
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
#my $metakeyby = "$self->{'*DataSource'}//$ltab" ; |
|
429
|
|
|
|
|
|
|
#my $linkedby = $DBIx::Recordset::Metadata{$metakeyby} -> {'*Links'} ; |
|
430
|
0
|
|
|
|
|
|
my $linkedby = $metakey -> {'*Links'} ; |
|
431
|
0
|
|
|
|
|
|
my $linkedbyname = "\*$prefix$tableshort" ; |
|
432
|
0
|
|
|
|
|
|
$linkedby -> {$linkedbyname} = {'!Table' => $fullntab, '!MainField' => $lfield, '!LinkedField' => "$prefix$n", '!LinkedBy' => $fullltab, '!MainTable' => $fullltab} ; |
|
433
|
|
|
|
|
|
|
#$linkedby -> {"-$tableshort"} = $linkedby -> {$linkedbyname} if (!exists ($linkedby -> {"-$tableshort"})) ; |
|
434
|
|
|
|
|
|
|
} |
|
435
|
0
|
|
|
|
|
|
last ; |
|
436
|
|
|
|
|
|
|
} |
|
437
|
|
|
|
|
|
|
} |
|
438
|
|
|
|
|
|
|
} |
|
439
|
|
|
|
|
|
|
} |
|
440
|
|
|
|
|
|
|
else |
|
441
|
|
|
|
|
|
|
{ |
|
442
|
0
|
|
|
|
|
|
foreach $ltab (@tabs) |
|
443
|
|
|
|
|
|
|
{ |
|
444
|
0
|
0
|
|
|
|
|
next if (!$ltab) ; |
|
445
|
0
|
|
|
|
|
|
$metakey = $self -> QueryMetaData ($ltab) ; |
|
446
|
|
|
|
|
|
|
|
|
447
|
0
|
|
|
|
|
|
my $k ; |
|
448
|
|
|
|
|
|
|
my $v ; |
|
449
|
0
|
|
|
|
|
|
my $lbtab ; |
|
450
|
0
|
|
|
|
|
|
my $links = $metakey -> {'*Links'} ; |
|
451
|
0
|
|
|
|
|
|
while (($k, $v) = each (%$links)) |
|
452
|
|
|
|
|
|
|
{ |
|
453
|
0
|
0
|
|
|
|
|
if (!$meta -> {'*Links'}{$k}) |
|
454
|
|
|
|
|
|
|
{ |
|
455
|
0
|
|
|
|
|
|
$meta -> {'*Links'}{$k} = { %$v } ; |
|
456
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "Link copied: $k\n" if ($self->{'*Debug'} > 2) ; |
|
457
|
|
|
|
|
|
|
} |
|
458
|
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
} |
|
460
|
|
|
|
|
|
|
} |
|
461
|
|
|
|
|
|
|
} |
|
462
|
|
|
|
|
|
|
|
|
463
|
|
|
|
|
|
|
} |
|
464
|
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
|
|
466
|
0
|
|
|
|
|
|
return $meta ; |
|
467
|
|
|
|
|
|
|
} |
|
468
|
|
|
|
|
|
|
|
|
469
|
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
################################################################################### |
|
471
|
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
package DBIx::Database ; |
|
473
|
|
|
|
|
|
|
|
|
474
|
1
|
|
|
1
|
|
7
|
use strict 'vars' ; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
56
|
|
|
475
|
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
use vars ( |
|
477
|
1
|
|
|
|
|
142
|
'%DBDefault', # DB Shema default für alle Tabellen |
|
478
|
|
|
|
|
|
|
'@DBSchema', # DB Shema definition |
|
479
|
|
|
|
|
|
|
'$LastErr', |
|
480
|
|
|
|
|
|
|
'$LastErrstr', |
|
481
|
|
|
|
|
|
|
'*LastErr', |
|
482
|
|
|
|
|
|
|
'*LastErrstr', |
|
483
|
|
|
|
|
|
|
'*LastError', |
|
484
|
|
|
|
|
|
|
'$PreserveCase', |
|
485
|
1
|
|
|
1
|
|
5
|
'@ISA') ; |
|
|
1
|
|
|
|
|
2
|
|
|
486
|
|
|
|
|
|
|
|
|
487
|
|
|
|
|
|
|
@ISA = ('DBIx::Database::Base') ; |
|
488
|
|
|
|
|
|
|
|
|
489
|
|
|
|
|
|
|
*LastErr = \$DBIx::Recordset::LastErr ; |
|
490
|
|
|
|
|
|
|
*LastErrstr = \$DBIx::Recordset::LastErrstr ; |
|
491
|
|
|
|
|
|
|
*LastError = \&DBIx::Recordset::LastError ; |
|
492
|
|
|
|
|
|
|
*PreserveCase = \$DBIx::Recordset::PreserveCase; |
|
493
|
|
|
|
|
|
|
|
|
494
|
|
|
|
|
|
|
|
|
495
|
1
|
|
|
1
|
|
4
|
use Carp ; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
5872
|
|
|
496
|
|
|
|
|
|
|
|
|
497
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
498
|
|
|
|
|
|
|
## |
|
499
|
|
|
|
|
|
|
## connect |
|
500
|
|
|
|
|
|
|
## |
|
501
|
|
|
|
|
|
|
|
|
502
|
|
|
|
|
|
|
sub connect |
|
503
|
|
|
|
|
|
|
|
|
504
|
|
|
|
|
|
|
{ |
|
505
|
0
|
|
|
0
|
0
|
|
my ($self, $password) = @_ ; |
|
506
|
|
|
|
|
|
|
|
|
507
|
0
|
0
|
|
|
|
|
my $hdl = $self->{'*DBHdl'} = DBI->connect($self->{'*DataSource'}, $self->{'*Username'}, $password, $self->{'*DBIAttr'}) or $self -> savecroak ("Cannot connect to $self->{'*DataSource'} ($DBI::errstr)") ; |
|
508
|
|
|
|
|
|
|
|
|
509
|
0
|
|
|
|
|
|
$LastErr = $self->{'*LastErr'} = $DBI::err ; |
|
510
|
0
|
|
|
|
|
|
$LastErrstr = $self->{'*LastErrstr'} = $DBI::errstr ; |
|
511
|
|
|
|
|
|
|
|
|
512
|
0
|
|
|
|
|
|
$self->{'*MainHdl'} = 1 ; |
|
513
|
0
|
|
|
|
|
|
$self->{'*Driver'} = $hdl->{Driver}->{Name} ; |
|
514
|
0
|
0
|
|
|
|
|
if ($self->{'*Driver'} eq 'Proxy') |
|
515
|
|
|
|
|
|
|
{ |
|
516
|
0
|
|
|
|
|
|
$self->{'*DataSource'} =~ /dsn\s*=\s*dbi:(.*?):/i ; |
|
517
|
0
|
|
|
|
|
|
$self->{'*Driver'} = $1 ; |
|
518
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "DB: Found DBD::Proxy, take compability entrys for driver $self->{'*Driver'}\n" if ($self->{'*Debug'} > 1) ; |
|
519
|
|
|
|
|
|
|
} |
|
520
|
|
|
|
|
|
|
|
|
521
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "DB: Successfull connect to $self->{'*DataSource'} \n" if ($self->{'*Debug'} > 1) ; |
|
522
|
|
|
|
|
|
|
|
|
523
|
0
|
|
|
|
|
|
my $cmd ; |
|
524
|
0
|
0
|
0
|
|
|
|
if ($hdl && ($cmd = $self -> {'*DoOnConnect'})) |
|
525
|
|
|
|
|
|
|
{ |
|
526
|
0
|
|
|
|
|
|
$self -> DoOnConnect ($cmd) ; |
|
527
|
|
|
|
|
|
|
} |
|
528
|
|
|
|
|
|
|
|
|
529
|
0
|
|
|
|
|
|
return $hdl ; |
|
530
|
|
|
|
|
|
|
} |
|
531
|
|
|
|
|
|
|
|
|
532
|
|
|
|
|
|
|
|
|
533
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
534
|
|
|
|
|
|
|
## |
|
535
|
|
|
|
|
|
|
## new |
|
536
|
|
|
|
|
|
|
## |
|
537
|
|
|
|
|
|
|
## creates a new DBIx::Database object. This object fetches all necessary |
|
538
|
|
|
|
|
|
|
## meta information from the database for later use by DBIx::Recordset objects. |
|
539
|
|
|
|
|
|
|
## Also it builds a list of links between the tables. |
|
540
|
|
|
|
|
|
|
## |
|
541
|
|
|
|
|
|
|
## |
|
542
|
|
|
|
|
|
|
## $data_source = Driver/DB/Host |
|
543
|
|
|
|
|
|
|
## $username = Username (optional) |
|
544
|
|
|
|
|
|
|
## $password = Password (optional) |
|
545
|
|
|
|
|
|
|
## \%attr = Attributes (optional) |
|
546
|
|
|
|
|
|
|
## $saveas = Name for this DBIx::Database object to save |
|
547
|
|
|
|
|
|
|
## The name can be used in Get, or as !DataSource for DBIx::Recordset |
|
548
|
|
|
|
|
|
|
## $keepopen = keep connection open to use in further DBIx::Recordset setups |
|
549
|
|
|
|
|
|
|
## $tabfilter = regex which tables should be used |
|
550
|
|
|
|
|
|
|
## |
|
551
|
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
sub new |
|
553
|
|
|
|
|
|
|
|
|
554
|
|
|
|
|
|
|
{ |
|
555
|
0
|
|
|
0
|
0
|
|
my ($class, $data_source, $username, $password, $attr, $saveas, $keepopen, $tabfilter, $doonconnect, $reconnect) = @_ ; |
|
556
|
|
|
|
|
|
|
|
|
557
|
0
|
0
|
|
|
|
|
if (ref ($data_source) eq 'HASH') |
|
558
|
|
|
|
|
|
|
{ |
|
559
|
0
|
|
|
|
|
|
my $p = $data_source ; |
|
560
|
0
|
|
|
|
|
|
($data_source, $username, $password, $attr, $saveas, $keepopen, $tabfilter, $doonconnect, $reconnect) = |
|
561
|
|
|
|
|
|
|
@$p{('!DataSource', '!Username', '!Password', '!DBIAttr', '!SaveAs', '!KeepOpen', '!TableFilter', '!DoOnConnect', '!Reconnect')} ; |
|
562
|
|
|
|
|
|
|
} |
|
563
|
|
|
|
|
|
|
|
|
564
|
0
|
|
|
|
|
|
$LastErr = undef ; |
|
565
|
0
|
|
|
|
|
|
$LastErrstr = undef ; |
|
566
|
|
|
|
|
|
|
|
|
567
|
0
|
|
|
|
|
|
my $metakey ; |
|
568
|
|
|
|
|
|
|
my $self ; |
|
569
|
|
|
|
|
|
|
|
|
570
|
|
|
|
|
|
|
|
|
571
|
|
|
|
|
|
|
|
|
572
|
0
|
0
|
|
|
|
|
if (!($data_source =~ /^dbi:/i)) |
|
573
|
|
|
|
|
|
|
{ |
|
574
|
0
|
|
|
|
|
|
$metakey = "-DATABASE//$1" ; |
|
575
|
0
|
|
|
|
|
|
$self = $DBIx::Recordset::Metadata{$metakey} ; |
|
576
|
0
|
0
|
|
|
|
|
$self->{'*DBHdl'} = undef if ($reconnect) ; |
|
577
|
0
|
0
|
0
|
|
|
|
$self -> connect ($password) if ($keepopen && !defined ($self->{'*DBHdl'})) ; |
|
578
|
0
|
|
|
|
|
|
return $self ; |
|
579
|
|
|
|
|
|
|
} |
|
580
|
|
|
|
|
|
|
|
|
581
|
0
|
0
|
|
|
|
|
if ($saveas) |
|
582
|
|
|
|
|
|
|
{ |
|
583
|
0
|
|
|
|
|
|
$metakey = "-DATABASE//$saveas" ; |
|
584
|
0
|
0
|
|
|
|
|
if (defined ($self = $DBIx::Recordset::Metadata{$metakey})) |
|
585
|
|
|
|
|
|
|
{ |
|
586
|
0
|
0
|
|
|
|
|
$self->{'*DBHdl'} = undef if ($reconnect) ; |
|
587
|
0
|
0
|
0
|
|
|
|
$self -> connect ($password) if ($keepopen && !defined ($self->{'*DBHdl'})) ; |
|
588
|
0
|
|
|
|
|
|
return $self ; |
|
589
|
|
|
|
|
|
|
} |
|
590
|
|
|
|
|
|
|
} |
|
591
|
|
|
|
|
|
|
|
|
592
|
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
$self = { |
|
594
|
0
|
|
|
|
|
|
'*Debug' => $DBIx::Recordset::Debug, |
|
595
|
|
|
|
|
|
|
'*DataSource' => $data_source, |
|
596
|
|
|
|
|
|
|
'*DBIAttr' => $attr, |
|
597
|
|
|
|
|
|
|
'*Username' => $username, |
|
598
|
|
|
|
|
|
|
'*TableFilter' => $tabfilter, |
|
599
|
|
|
|
|
|
|
'*DoOnConnect' => $doonconnect, |
|
600
|
|
|
|
|
|
|
} ; |
|
601
|
|
|
|
|
|
|
|
|
602
|
0
|
|
|
|
|
|
bless ($self, $class) ; |
|
603
|
|
|
|
|
|
|
|
|
604
|
0
|
|
|
|
|
|
my $hdl ; |
|
605
|
0
|
0
|
|
|
|
|
$self->{'*DBHdl'} = undef if ($reconnect) ; |
|
606
|
|
|
|
|
|
|
|
|
607
|
|
|
|
|
|
|
|
|
608
|
0
|
0
|
0
|
|
|
|
if (ref ($data_source) and eval { $data_source->isa('DBI::db') } ) |
|
|
0
|
|
|
|
|
|
|
|
609
|
|
|
|
|
|
|
{ |
|
610
|
|
|
|
|
|
|
|
|
611
|
0
|
|
|
|
|
|
$self->{'*DBHdl'} = $data_source; |
|
612
|
|
|
|
|
|
|
} |
|
613
|
|
|
|
|
|
|
else |
|
614
|
|
|
|
|
|
|
{ |
|
615
|
|
|
|
|
|
|
|
|
616
|
|
|
|
|
|
|
} |
|
617
|
|
|
|
|
|
|
|
|
618
|
0
|
0
|
|
|
|
|
if (!defined ($self->{'*DBHdl'})) |
|
619
|
|
|
|
|
|
|
{ |
|
620
|
0
|
|
|
|
|
|
$hdl = $self->connect ($password) ; |
|
621
|
|
|
|
|
|
|
} |
|
622
|
|
|
|
|
|
|
else |
|
623
|
|
|
|
|
|
|
{ |
|
624
|
0
|
|
|
|
|
|
$LastErr = $self->{'*LastErr'} = undef ; |
|
625
|
0
|
|
|
|
|
|
$LastErrstr = $self->{'*LastErrstr'} = undef ; |
|
626
|
|
|
|
|
|
|
|
|
627
|
0
|
|
|
|
|
|
$hdl = $self->{'*DBHdl'} ; |
|
628
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "DB: Use already open dbh for $self->{'*DataSource'}\n" if ($self->{'*Debug'} > 1) ; |
|
629
|
|
|
|
|
|
|
} |
|
630
|
|
|
|
|
|
|
|
|
631
|
0
|
|
0
|
|
|
|
$DBIx::Recordset::Metadata{"$self->{'*DataSource'}//*"} ||= {} ; # make sure default table is defined |
|
632
|
|
|
|
|
|
|
|
|
633
|
0
|
|
|
|
|
|
my $drv = $self->{'*Driver'} ; |
|
634
|
0
|
|
|
|
|
|
my $metakeydsn = "$self->{'*DataSource'}//-" ; |
|
635
|
0
|
|
0
|
|
|
|
my $metakeydsntf = "$self->{'*DataSource'}//-" . ($self->{'*TableFilter'}||''); |
|
636
|
0
|
|
0
|
|
|
|
my $metadsn = $DBIx::Recordset::Metadata{$metakeydsn} || {} ; |
|
637
|
0
|
|
0
|
|
|
|
my $tabmetadsn = $DBIx::Recordset::Metadata{$metakeydsntf} || {} ; |
|
638
|
0
|
|
|
|
|
|
my $tables = $tabmetadsn -> {'*Tables'} ; |
|
639
|
|
|
|
|
|
|
|
|
640
|
0
|
0
|
|
|
|
|
if (!$tables) |
|
641
|
|
|
|
|
|
|
{ # Query the driver, which tables are available |
|
642
|
0
|
|
|
|
|
|
my $ListTables = DBIx::Compat::GetItem ($drv, 'ListTables') ; |
|
643
|
|
|
|
|
|
|
|
|
644
|
|
|
|
|
|
|
|
|
645
|
0
|
0
|
|
|
|
|
if ($ListTables) |
|
646
|
|
|
|
|
|
|
{ |
|
647
|
0
|
|
|
|
|
|
my @tabs = &{$ListTables}($hdl) ; # or $self -> savecroak ("Cannot list tables for $self->{'*DataSource'} ($DBI::errstr)") ; |
|
|
0
|
|
|
|
|
|
|
|
648
|
0
|
|
|
|
|
|
my @stab ; |
|
649
|
|
|
|
|
|
|
my $stab ; |
|
650
|
|
|
|
|
|
|
|
|
651
|
0
|
|
0
|
|
|
|
$tabfilter ||= '.' ; |
|
652
|
0
|
|
|
|
|
|
foreach (@tabs) |
|
653
|
|
|
|
|
|
|
{ |
|
654
|
0
|
|
|
|
|
|
s/^[^a-zA-Z0-9_.]// ; |
|
655
|
0
|
|
|
|
|
|
s/[^a-zA-Z0-9_.]$// ; |
|
656
|
0
|
0
|
|
|
|
|
if ($_ =~ /(^|\.)$tabfilter/i) |
|
657
|
|
|
|
|
|
|
{ |
|
658
|
0
|
|
|
|
|
|
@stab = split (/\./); |
|
659
|
0
|
0
|
|
|
|
|
$stab = $PreserveCase?(pop @stab):lc (pop @stab) ; |
|
660
|
0
|
|
|
|
|
|
$tables -> {$stab} = $_ ; |
|
661
|
|
|
|
|
|
|
} |
|
662
|
|
|
|
|
|
|
} |
|
663
|
|
|
|
|
|
|
|
|
664
|
0
|
|
|
|
|
|
$tabmetadsn -> {'*Tables'} = $tables ; |
|
665
|
0
|
0
|
|
|
|
|
if ($self->{'*Debug'} > 2) |
|
666
|
|
|
|
|
|
|
{ |
|
667
|
0
|
|
|
|
|
|
my $t ; |
|
668
|
0
|
|
|
|
|
|
foreach $t (keys %$tables) |
|
669
|
0
|
|
|
|
|
|
{ print DBIx::Recordset::LOG "DB: Found table $t => $tables->{$t}\n" ; } |
|
670
|
|
|
|
|
|
|
} |
|
671
|
|
|
|
|
|
|
} |
|
672
|
|
|
|
|
|
|
else |
|
673
|
|
|
|
|
|
|
{ |
|
674
|
0
|
|
|
|
|
|
$tabmetadsn -> {'*Tables'} = {} ; |
|
675
|
|
|
|
|
|
|
} |
|
676
|
|
|
|
|
|
|
|
|
677
|
0
|
|
|
|
|
|
$DBIx::Recordset::Metadata{$metakeydsn} = $metadsn ; |
|
678
|
0
|
|
|
|
|
|
$DBIx::Recordset::Metadata{$metakeydsntf} = $tabmetadsn ; |
|
679
|
|
|
|
|
|
|
} |
|
680
|
|
|
|
|
|
|
|
|
681
|
0
|
|
|
|
|
|
my $tab ; |
|
682
|
|
|
|
|
|
|
my $x ; |
|
683
|
|
|
|
|
|
|
|
|
684
|
0
|
|
|
|
|
|
while (($tab, $x) = each (%{$tables})) |
|
|
0
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
{ |
|
686
|
0
|
|
|
|
|
|
$self -> QueryMetaData ($tab) ; |
|
687
|
|
|
|
|
|
|
} |
|
688
|
|
|
|
|
|
|
|
|
689
|
|
|
|
|
|
|
|
|
690
|
0
|
0
|
|
|
|
|
$DBIx::Recordset::Metadata{$metakey} = $self if ($metakey) ; |
|
691
|
|
|
|
|
|
|
|
|
692
|
|
|
|
|
|
|
# disconnect in case we are running in a Apache/mod_perl startup file |
|
693
|
|
|
|
|
|
|
|
|
694
|
0
|
0
|
0
|
|
|
|
if (defined ($self->{'*DBHdl'}) && !$keepopen) |
|
695
|
|
|
|
|
|
|
{ |
|
696
|
0
|
|
|
|
|
|
$self->{'*DBHdl'} -> disconnect () ; |
|
697
|
0
|
|
|
|
|
|
undef $self->{'*DBHdl'} ; |
|
698
|
0
|
0
|
|
|
|
|
print DBIx::Recordset::LOG "DB: Disconnect from $self->{'*DataSource'} \n" if ($self->{'*Debug'} > 1) ; |
|
699
|
|
|
|
|
|
|
} |
|
700
|
|
|
|
|
|
|
|
|
701
|
0
|
|
|
|
|
|
return $self ; |
|
702
|
|
|
|
|
|
|
} |
|
703
|
|
|
|
|
|
|
|
|
704
|
|
|
|
|
|
|
|
|
705
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
706
|
|
|
|
|
|
|
## |
|
707
|
|
|
|
|
|
|
## Get |
|
708
|
|
|
|
|
|
|
## |
|
709
|
|
|
|
|
|
|
## $name = Name of DBIx::Database obecjt you what to get |
|
710
|
|
|
|
|
|
|
## |
|
711
|
|
|
|
|
|
|
|
|
712
|
|
|
|
|
|
|
sub Get |
|
713
|
|
|
|
|
|
|
|
|
714
|
|
|
|
|
|
|
{ |
|
715
|
0
|
|
|
0
|
0
|
|
my ($class, $saveas) = @_ ; |
|
716
|
|
|
|
|
|
|
|
|
717
|
0
|
|
|
|
|
|
my $metakey ; |
|
718
|
|
|
|
|
|
|
|
|
719
|
0
|
|
|
|
|
|
$metakey = "-DATABASE//$saveas" ; |
|
720
|
0
|
|
|
|
|
|
return $DBIx::Recordset::Metadata{$metakey} ; |
|
721
|
|
|
|
|
|
|
} |
|
722
|
|
|
|
|
|
|
|
|
723
|
|
|
|
|
|
|
|
|
724
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
725
|
|
|
|
|
|
|
## |
|
726
|
|
|
|
|
|
|
## TableAttr |
|
727
|
|
|
|
|
|
|
## |
|
728
|
|
|
|
|
|
|
## get and/or set and attribute for an specfic table |
|
729
|
|
|
|
|
|
|
## |
|
730
|
|
|
|
|
|
|
## $table = Name of table(s) |
|
731
|
|
|
|
|
|
|
## $key = key |
|
732
|
|
|
|
|
|
|
## $value = value |
|
733
|
|
|
|
|
|
|
## |
|
734
|
|
|
|
|
|
|
|
|
735
|
|
|
|
|
|
|
sub TableAttr |
|
736
|
|
|
|
|
|
|
|
|
737
|
|
|
|
|
|
|
{ |
|
738
|
0
|
|
|
0
|
0
|
|
my ($self, $table, $key, $value) = @_ ; |
|
739
|
|
|
|
|
|
|
|
|
740
|
0
|
0
|
|
|
|
|
$table = lc($table) if (!$PreserveCase) ; |
|
741
|
|
|
|
|
|
|
|
|
742
|
0
|
|
|
|
|
|
my $meta ; |
|
743
|
0
|
|
|
|
|
|
my $metakey = "$self->{'*DataSource'}//$table" ; |
|
744
|
|
|
|
|
|
|
|
|
745
|
0
|
0
|
|
|
|
|
if (!defined ($meta = $DBIx::Recordset::Metadata{$metakey})) |
|
746
|
|
|
|
|
|
|
{ |
|
747
|
0
|
|
|
|
|
|
$self -> savecroak ("Unknown table $table in $self->{'*DataSource'}") ; |
|
748
|
|
|
|
|
|
|
} |
|
749
|
|
|
|
|
|
|
|
|
750
|
|
|
|
|
|
|
# set new value if wanted |
|
751
|
0
|
0
|
|
|
|
|
return $meta -> {$key} = $value if (defined ($value)) ; |
|
752
|
|
|
|
|
|
|
|
|
753
|
|
|
|
|
|
|
# only return value |
|
754
|
0
|
0
|
|
|
|
|
return $meta -> {$key} if (exists ($meta -> {$key})) ; |
|
755
|
|
|
|
|
|
|
|
|
756
|
|
|
|
|
|
|
# check if there is a default value |
|
757
|
0
|
|
|
|
|
|
$metakey = "$self->{'*DataSource'}//*" ; |
|
758
|
|
|
|
|
|
|
|
|
759
|
0
|
0
|
|
|
|
|
return undef if (!defined ($meta = $DBIx::Recordset::Metadata{$metakey})) ; |
|
760
|
|
|
|
|
|
|
|
|
761
|
0
|
|
|
|
|
|
return $meta -> {$key} ; |
|
762
|
|
|
|
|
|
|
} |
|
763
|
|
|
|
|
|
|
|
|
764
|
|
|
|
|
|
|
|
|
765
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
766
|
|
|
|
|
|
|
## |
|
767
|
|
|
|
|
|
|
## TableLink |
|
768
|
|
|
|
|
|
|
## |
|
769
|
|
|
|
|
|
|
## get and/or set an link description for an table |
|
770
|
|
|
|
|
|
|
## |
|
771
|
|
|
|
|
|
|
## $table = Name of table(s) |
|
772
|
|
|
|
|
|
|
## $key = linkname |
|
773
|
|
|
|
|
|
|
## $value = ref to hash with link description |
|
774
|
|
|
|
|
|
|
## |
|
775
|
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
|
|
777
|
|
|
|
|
|
|
sub TableLink |
|
778
|
|
|
|
|
|
|
|
|
779
|
|
|
|
|
|
|
{ |
|
780
|
0
|
|
|
0
|
0
|
|
my ($self, $table, $key, $value) = @_ ; |
|
781
|
|
|
|
|
|
|
|
|
782
|
0
|
0
|
|
|
|
|
$table = lc($table) if (!$PreserveCase) ; |
|
783
|
|
|
|
|
|
|
|
|
784
|
0
|
|
|
|
|
|
my $meta ; |
|
785
|
0
|
|
|
|
|
|
my $metakey = "$self->{'*DataSource'}//$table" ; |
|
786
|
|
|
|
|
|
|
|
|
787
|
0
|
0
|
|
|
|
|
if (!defined ($meta = $DBIx::Recordset::Metadata{$metakey})) |
|
788
|
|
|
|
|
|
|
{ |
|
789
|
0
|
|
|
|
|
|
$self -> savecroak ("Unknown table $table in $self->{'*DataSource'}") ; |
|
790
|
|
|
|
|
|
|
} |
|
791
|
|
|
|
|
|
|
|
|
792
|
0
|
0
|
|
|
|
|
return $meta -> {'*Links'} if (!defined ($key)) ; |
|
793
|
|
|
|
|
|
|
|
|
794
|
0
|
0
|
|
|
|
|
return $meta -> {'*Links'} -> {$key} = $value if (defined ($value)) ; |
|
795
|
|
|
|
|
|
|
|
|
796
|
0
|
|
|
|
|
|
return $meta -> {'*Links'} -> {$key} ; |
|
797
|
|
|
|
|
|
|
} |
|
798
|
|
|
|
|
|
|
|
|
799
|
|
|
|
|
|
|
|
|
800
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
801
|
|
|
|
|
|
|
## |
|
802
|
|
|
|
|
|
|
## MetaData |
|
803
|
|
|
|
|
|
|
## |
|
804
|
|
|
|
|
|
|
## get/set metadata for a given table |
|
805
|
|
|
|
|
|
|
## |
|
806
|
|
|
|
|
|
|
## $table = Name of table |
|
807
|
|
|
|
|
|
|
## $metadata = meta data to set |
|
808
|
|
|
|
|
|
|
## |
|
809
|
|
|
|
|
|
|
|
|
810
|
|
|
|
|
|
|
|
|
811
|
|
|
|
|
|
|
sub MetaData |
|
812
|
|
|
|
|
|
|
|
|
813
|
|
|
|
|
|
|
{ |
|
814
|
0
|
|
|
0
|
0
|
|
my ($self, $table, $metadata, $clear) = @_ ; |
|
815
|
|
|
|
|
|
|
|
|
816
|
0
|
0
|
|
|
|
|
$table = lc($table) if (!$PreserveCase) ; |
|
817
|
|
|
|
|
|
|
|
|
818
|
0
|
|
|
|
|
|
my $meta ; |
|
819
|
0
|
|
|
|
|
|
my $metakey = "$self->{'*DataSource'}//$table" ; |
|
820
|
|
|
|
|
|
|
|
|
821
|
0
|
0
|
|
|
|
|
if (!defined ($meta = $DBIx::Recordset::Metadata{$metakey})) |
|
822
|
|
|
|
|
|
|
{ |
|
823
|
0
|
|
|
|
|
|
$self -> savecroak ("Unknown table $table in $self->{'*DataSource'}") ; |
|
824
|
|
|
|
|
|
|
} |
|
825
|
|
|
|
|
|
|
|
|
826
|
0
|
0
|
0
|
|
|
|
return $meta if (!defined ($metadata) && !$clear) ; |
|
827
|
|
|
|
|
|
|
|
|
828
|
0
|
|
|
|
|
|
return $DBIx::Recordset::Metadata{$metakey} = $metadata ; |
|
829
|
|
|
|
|
|
|
} |
|
830
|
|
|
|
|
|
|
|
|
831
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
832
|
|
|
|
|
|
|
## |
|
833
|
|
|
|
|
|
|
## AllTables |
|
834
|
|
|
|
|
|
|
## |
|
835
|
|
|
|
|
|
|
## return reference to hash which keys contains all tables of that datasource |
|
836
|
|
|
|
|
|
|
## |
|
837
|
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
sub AllTables |
|
839
|
|
|
|
|
|
|
|
|
840
|
|
|
|
|
|
|
{ |
|
841
|
0
|
|
|
0
|
0
|
|
my $self = shift ; |
|
842
|
0
|
|
0
|
|
|
|
my $metakeydsn = "$self->{'*DataSource'}//-" . ($self->{'*TableFilter'} || '') ; |
|
843
|
0
|
|
0
|
|
|
|
my $metadsn = $DBIx::Recordset::Metadata{$metakeydsn} || {} ; |
|
844
|
0
|
|
|
|
|
|
return $metadsn -> {'*Tables'} ; |
|
845
|
|
|
|
|
|
|
} |
|
846
|
|
|
|
|
|
|
|
|
847
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
848
|
|
|
|
|
|
|
## |
|
849
|
|
|
|
|
|
|
## AllNames |
|
850
|
|
|
|
|
|
|
## |
|
851
|
|
|
|
|
|
|
## return reference to array of all names in all tables |
|
852
|
|
|
|
|
|
|
## |
|
853
|
|
|
|
|
|
|
## $table = Name of table |
|
854
|
|
|
|
|
|
|
## |
|
855
|
|
|
|
|
|
|
|
|
856
|
|
|
|
|
|
|
sub AllNames |
|
857
|
|
|
|
|
|
|
|
|
858
|
|
|
|
|
|
|
{ |
|
859
|
0
|
|
|
0
|
0
|
|
my ($self, $table) = @_ ; |
|
860
|
|
|
|
|
|
|
|
|
861
|
0
|
0
|
|
|
|
|
$table = lc($table) if (!$PreserveCase) ; |
|
862
|
|
|
|
|
|
|
|
|
863
|
0
|
|
|
|
|
|
my $meta ; |
|
864
|
0
|
|
|
|
|
|
my $metakey = "$self->{'*DataSource'}//$table" ; |
|
865
|
|
|
|
|
|
|
|
|
866
|
0
|
0
|
|
|
|
|
if (!defined ($meta = $DBIx::Recordset::Metadata{$metakey})) |
|
867
|
|
|
|
|
|
|
{ |
|
868
|
0
|
|
|
|
|
|
$self -> savecroak ("Unknown table $table in $self->{'*DataSource'}") ; |
|
869
|
|
|
|
|
|
|
} |
|
870
|
|
|
|
|
|
|
|
|
871
|
0
|
|
|
|
|
|
return $meta -> {'*Names'} ; |
|
872
|
|
|
|
|
|
|
} |
|
873
|
|
|
|
|
|
|
|
|
874
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
875
|
|
|
|
|
|
|
## |
|
876
|
|
|
|
|
|
|
## AllTypes |
|
877
|
|
|
|
|
|
|
## |
|
878
|
|
|
|
|
|
|
## return reference to array of all types in all tables |
|
879
|
|
|
|
|
|
|
## |
|
880
|
|
|
|
|
|
|
## $table = Name of table |
|
881
|
|
|
|
|
|
|
## |
|
882
|
|
|
|
|
|
|
|
|
883
|
|
|
|
|
|
|
sub AllTypes |
|
884
|
|
|
|
|
|
|
|
|
885
|
|
|
|
|
|
|
{ |
|
886
|
0
|
|
|
0
|
0
|
|
my ($self, $table) = @_ ; |
|
887
|
|
|
|
|
|
|
|
|
888
|
0
|
0
|
|
|
|
|
$table = lc($table) if (!$PreserveCase) ; |
|
889
|
|
|
|
|
|
|
|
|
890
|
0
|
|
|
|
|
|
my $meta ; |
|
891
|
0
|
|
|
|
|
|
my $metakey = "$self->{'*DataSource'}//$table" ; |
|
892
|
|
|
|
|
|
|
|
|
893
|
0
|
0
|
|
|
|
|
if (!defined ($meta = $DBIx::Recordset::Metadata{$metakey})) |
|
894
|
|
|
|
|
|
|
{ |
|
895
|
0
|
|
|
|
|
|
$self -> savecroak ("Unknown table $table in $self->{'*DataSource'}") ; |
|
896
|
|
|
|
|
|
|
} |
|
897
|
|
|
|
|
|
|
|
|
898
|
0
|
|
|
|
|
|
return $meta -> {'*Types'} ; |
|
899
|
|
|
|
|
|
|
} |
|
900
|
|
|
|
|
|
|
|
|
901
|
|
|
|
|
|
|
|
|
902
|
|
|
|
|
|
|
|
|
903
|
|
|
|
|
|
|
## ---------------------------------------------------------------------------- |
|
904
|
|
|
|
|
|
|
## |
|
905
|
|
|
|
|
|
|
## DESTROY |
|
906
|
|
|
|
|
|
|
## |
|
907
|
|
|
|
|
|
|
## do cleanup |
|
908
|
|
|
|
|
|
|
## |
|
909
|
|
|
|
|
|
|
|
|
910
|
|
|
|
|
|
|
|
|
911
|
|
|
|
|
|
|
sub DESTROY |
|
912
|
|
|
|
|
|
|
|
|
913
|
|
|
|
|
|
|
{ |
|
914
|
0
|
|
|
0
|
|
|
my $self = shift ; |
|
915
|
0
|
|
|
|
|
|
my $orgerr = $@ ; |
|
916
|
0
|
|
|
|
|
|
local $@ ; |
|
917
|
|
|
|
|
|
|
|
|
918
|
|
|
|
|
|
|
eval |
|
919
|
0
|
|
|
|
|
|
{ |
|
920
|
0
|
0
|
|
|
|
|
if (defined ($self->{'*DBHdl'})) |
|
921
|
|
|
|
|
|
|
{ |
|
922
|
0
|
|
|
|
|
|
$self->{'*DBHdl'} -> disconnect () ; |
|
923
|
0
|
|
|
|
|
|
undef $self->{'*DBHdl'} ; |
|
924
|
|
|
|
|
|
|
} |
|
925
|
|
|
|
|
|
|
} ; |
|
926
|
0
|
0
|
0
|
|
|
|
$self -> savecroak ($@) if (!$orgerr && $@) ; |
|
927
|
0
|
0
|
0
|
|
|
|
warn $@ if ($orgerr && $@) ; |
|
928
|
|
|
|
|
|
|
} |
|
929
|
|
|
|
|
|
|
|
|
930
|
|
|
|
|
|
|
|
|
931
|
|
|
|
|
|
|
## --------------------------------------------------------------------------------- |
|
932
|
|
|
|
|
|
|
## |
|
933
|
|
|
|
|
|
|
## Datenbank Erzeugen |
|
934
|
|
|
|
|
|
|
## |
|
935
|
|
|
|
|
|
|
## in $dbschema Schema file or ARRAY ref |
|
936
|
|
|
|
|
|
|
## in $shema schema name (Oracle) |
|
937
|
|
|
|
|
|
|
## in $user user to grant rights to |
|
938
|
|
|
|
|
|
|
## in $setpriv resetup privileges |
|
939
|
|
|
|
|
|
|
## in $alterconstraints resetup constraints (-1 to drop containts) |
|
940
|
|
|
|
|
|
|
## |
|
941
|
|
|
|
|
|
|
|
|
942
|
|
|
|
|
|
|
|
|
943
|
|
|
|
|
|
|
sub CreateTables |
|
944
|
|
|
|
|
|
|
|
|
945
|
|
|
|
|
|
|
{ |
|
946
|
|
|
|
|
|
|
#my $DataSource = shift ; |
|
947
|
|
|
|
|
|
|
#my $setupuser = shift ; |
|
948
|
|
|
|
|
|
|
#my $setuppass = shift ; |
|
949
|
|
|
|
|
|
|
#my $tabprefix = shift ; |
|
950
|
0
|
|
|
0
|
0
|
|
my $db = shift ; |
|
951
|
0
|
|
|
|
|
|
my $dbschema = shift ; |
|
952
|
0
|
|
|
|
|
|
my $shema = shift ; |
|
953
|
0
|
|
|
|
|
|
my $user = shift ; |
|
954
|
0
|
|
|
|
|
|
my $setpriv = shift ; |
|
955
|
0
|
|
|
|
|
|
my $alterconstraints = shift ; |
|
956
|
|
|
|
|
|
|
|
|
957
|
0
|
|
|
|
|
|
my $DBSchemaRef ; |
|
958
|
|
|
|
|
|
|
|
|
959
|
0
|
|
|
|
|
|
print "\nDatenbanktabellen anlegen/aktualisierien:\n" ; |
|
960
|
|
|
|
|
|
|
|
|
961
|
0
|
0
|
|
|
|
|
if (ref ($dbschema) eq 'ARRAY') |
|
962
|
|
|
|
|
|
|
{ |
|
963
|
0
|
|
|
|
|
|
$DBSchemaRef = $dbschema ; |
|
964
|
|
|
|
|
|
|
} |
|
965
|
|
|
|
|
|
|
else |
|
966
|
|
|
|
|
|
|
{ |
|
967
|
0
|
0
|
|
|
|
|
open FH, $dbschema or die "Schema nicht gefunden ($dbschema) ($!)" ; |
|
968
|
|
|
|
|
|
|
{ |
|
969
|
0
|
|
|
|
|
|
local $/ = undef ; |
|
|
0
|
|
|
|
|
|
|
|
970
|
0
|
|
|
|
|
|
my $shema = ; |
|
971
|
0
|
|
|
|
|
|
$shema =~ /^(.*)$/s ; # untaint |
|
972
|
0
|
|
|
|
|
|
$shema = $1 ; |
|
973
|
0
|
|
|
|
|
|
eval $shema ; |
|
974
|
0
|
0
|
|
|
|
|
die "Fehler in $dbschema: $@" if ($@) ; |
|
975
|
|
|
|
|
|
|
} |
|
976
|
0
|
|
|
|
|
|
close FH ; |
|
977
|
0
|
|
|
|
|
|
$DBSchemaRef = \@DBSchema ; |
|
978
|
|
|
|
|
|
|
} |
|
979
|
|
|
|
|
|
|
|
|
980
|
|
|
|
|
|
|
|
|
981
|
|
|
|
|
|
|
#my $db = DBIx::Database -> new ({'!DataSource' => "$DataSource", |
|
982
|
|
|
|
|
|
|
# '!Username' => $setupuser, |
|
983
|
|
|
|
|
|
|
# '!Password' => $setuppass, |
|
984
|
|
|
|
|
|
|
# '!KeepOpen' => 1, |
|
985
|
|
|
|
|
|
|
# '!TableFilter' => $tabprefix}) ; |
|
986
|
|
|
|
|
|
|
# |
|
987
|
|
|
|
|
|
|
#die DBIx::Database->LastError . "; Datenbank muß bereits bestehen" if (DBIx::Database->LastError) ; |
|
988
|
|
|
|
|
|
|
# |
|
989
|
|
|
|
|
|
|
|
|
990
|
0
|
|
|
|
|
|
my $dbh = $db -> DBHdl ; |
|
991
|
0
|
|
|
|
|
|
local $dbh -> {RaiseError} = 0 ; |
|
992
|
0
|
|
|
|
|
|
local $dbh -> {PrintError} = 0 ; |
|
993
|
|
|
|
|
|
|
|
|
994
|
0
|
|
|
|
|
|
my $tables = $db -> AllTables ; |
|
995
|
|
|
|
|
|
|
|
|
996
|
|
|
|
|
|
|
|
|
997
|
0
|
|
|
|
|
|
my $tab ; |
|
998
|
|
|
|
|
|
|
my $tabname ; |
|
999
|
0
|
|
|
|
|
|
my $type ; |
|
1000
|
0
|
|
|
|
|
|
my $typespec ; |
|
1001
|
0
|
|
|
|
|
|
my $size ; |
|
1002
|
|
|
|
|
|
|
|
|
1003
|
0
|
|
0
|
|
|
|
my $public = defined ($user) && $db -> {'*Username'} ne $user ; |
|
1004
|
0
|
|
|
|
|
|
my $drv = $db->{'*Driver'} ; |
|
1005
|
0
|
|
|
|
|
|
my $tabprefix = $db -> {'*TableFilter'} ; |
|
1006
|
0
|
|
|
|
|
|
my $trans = DBIx::Compat::GetItem ($drv, 'CreateTypes') ; |
|
1007
|
0
|
0
|
|
|
|
|
$trans = {} if (!$trans) ; |
|
1008
|
0
|
|
|
|
|
|
my $createseq = DBIx::Compat::GetItem ($drv, 'CreateSeq') ; |
|
1009
|
0
|
|
0
|
|
|
|
my $createpublic = $public && DBIx::Compat::GetItem ($drv, 'CreatePublic') ; |
|
1010
|
0
|
|
|
|
|
|
my $candropcolumn = DBIx::Compat::GetItem ($drv, 'CanDropColumn') ; |
|
1011
|
0
|
|
|
|
|
|
my $i ; |
|
1012
|
|
|
|
|
|
|
my $field ; |
|
1013
|
0
|
|
|
|
|
|
my $cmd ; |
|
1014
|
|
|
|
|
|
|
|
|
1015
|
|
|
|
|
|
|
|
|
1016
|
0
|
|
|
|
|
|
foreach $tab (@$DBSchemaRef) |
|
1017
|
|
|
|
|
|
|
{ |
|
1018
|
0
|
|
|
|
|
|
my $newtab = 0 ; |
|
1019
|
0
|
|
|
|
|
|
my $newseq = 0 ; |
|
1020
|
0
|
|
|
|
|
|
my $hasseq = 0 ; |
|
1021
|
0
|
0
|
|
|
|
|
my %tabdef = (%DBDefault, %$tab, %{$tab -> {'!For'} -> {$drv} || {}}) ; |
|
|
0
|
|
|
|
|
|
|
|
1022
|
0
|
|
|
|
|
|
$tabname = "$tabprefix$tabdef{'!Table'}" ; |
|
1023
|
0
|
|
|
|
|
|
my $init = $tabdef{'!Init'} ; |
|
1024
|
0
|
0
|
0
|
|
|
|
my $grant = (defined ($user) && $db -> {'*Username'} ne $user)?$tabdef{'!Grant'}:undef ; |
|
1025
|
0
|
|
|
|
|
|
my $constraint ; |
|
1026
|
0
|
|
|
|
|
|
my $constraints = $tabdef{'!Constraints'} ; |
|
1027
|
0
|
|
|
|
|
|
my $default = $tabdef{'!Default'} ; |
|
1028
|
0
|
|
|
|
|
|
my $pk = $tabdef{'!PrimKey'} ; |
|
1029
|
0
|
|
|
|
|
|
my $index= $tabdef{'!Index'} ; |
|
1030
|
0
|
|
|
|
|
|
my $c ; |
|
1031
|
|
|
|
|
|
|
my $ccmd ; |
|
1032
|
0
|
|
|
|
|
|
my $cname ; |
|
1033
|
0
|
|
|
|
|
|
my $cval ; |
|
1034
|
0
|
|
|
|
|
|
my $ncnt ; |
|
1035
|
0
|
0
|
|
|
|
|
if ($tables -> {$tabname}) |
|
1036
|
|
|
|
|
|
|
{ |
|
1037
|
0
|
|
|
|
|
|
printl ("$tabname", LL, "vorhanden\n") ; |
|
1038
|
|
|
|
|
|
|
|
|
1039
|
0
|
|
|
|
|
|
my $fields = $tabdef{'!Fields'} ; |
|
1040
|
0
|
|
|
|
|
|
my $dbfields = $db -> AllNames ($tabname) ; |
|
1041
|
0
|
|
|
|
|
|
my %dbfields = map { $_ => 1 } @$dbfields ; |
|
|
0
|
|
|
|
|
|
|
|
1042
|
0
|
|
|
|
|
|
my $lastfield ; |
|
1043
|
0
|
|
|
|
|
|
for ($i = 0; $i <= $#$fields; $i+= 2) |
|
1044
|
|
|
|
|
|
|
{ |
|
1045
|
0
|
|
|
|
|
|
$field = lc ($fields -> [$i]) ; |
|
1046
|
0
|
|
|
|
|
|
$typespec = $fields -> [$i+1] ; |
|
1047
|
0
|
0
|
0
|
|
|
|
$hasseq = 1 if ($createseq && $typespec eq 'counter') ; |
|
1048
|
|
|
|
|
|
|
|
|
1049
|
0
|
|
|
|
|
|
$ccmd = '' ; |
|
1050
|
0
|
|
|
|
|
|
$ncnt = 0 ; |
|
1051
|
0
|
0
|
0
|
|
|
|
if ($constraints && ($constraint = $constraints -> {$field})) |
|
1052
|
|
|
|
|
|
|
{ |
|
1053
|
0
|
|
|
|
|
|
$cname = "${tabname}_$field" ; |
|
1054
|
0
|
|
|
|
|
|
for ($c = 0 ; $c < $#$constraint; $c+=2) |
|
1055
|
|
|
|
|
|
|
{ |
|
1056
|
0
|
0
|
|
|
|
|
if ($constraint -> [$c] eq '!Name') |
|
1057
|
|
|
|
|
|
|
{ |
|
1058
|
0
|
|
|
|
|
|
$cname = $tabprefix . $constraint -> [$c+1] ; |
|
1059
|
0
|
|
|
|
|
|
$ncnt = 0 ; |
|
1060
|
0
|
|
|
|
|
|
next ; |
|
1061
|
|
|
|
|
|
|
} |
|
1062
|
0
|
|
|
|
|
|
$ncnt++ ; |
|
1063
|
0
|
|
0
|
|
|
|
$cval = $constraint -> [$c+1] || $constraint -> [$c] ; |
|
1064
|
0
|
|
|
|
|
|
$cval =~ s#REFERENCES\s+(.*?)\s*\(#REFERENCES $tabprefix$1 (#i ; |
|
1065
|
0
|
0
|
|
|
|
|
$ccmd .= " CONSTRAINT $cname" . ( $ncnt >1?$ncnt:'') . " $cval" ; |
|
1066
|
|
|
|
|
|
|
} |
|
1067
|
|
|
|
|
|
|
} |
|
1068
|
|
|
|
|
|
|
|
|
1069
|
|
|
|
|
|
|
|
|
1070
|
0
|
0
|
0
|
|
|
|
if (!$dbfields{$field}) |
|
|
|
0
|
|
|
|
|
|
|
1071
|
|
|
|
|
|
|
{ |
|
1072
|
0
|
|
|
|
|
|
printl (" Add $field", LL) ; |
|
1073
|
0
|
0
|
0
|
|
|
|
$newseq = 1 if ($createseq && $typespec eq 'counter') ; |
|
1074
|
|
|
|
|
|
|
|
|
1075
|
0
|
0
|
|
|
|
|
if ($typespec =~ /^(.*?)\s*\((.*?)\)(.*?)$/) |
|
1076
|
|
|
|
|
|
|
{ |
|
1077
|
0
|
0
|
|
|
|
|
$type = $trans->{$1}?$trans->{$1}:$1 . "($2) $3" ; |
|
1078
|
|
|
|
|
|
|
} |
|
1079
|
|
|
|
|
|
|
else |
|
1080
|
|
|
|
|
|
|
{ |
|
1081
|
0
|
|
|
|
|
|
$type = $typespec ; |
|
1082
|
0
|
0
|
|
|
|
|
$type = $trans -> {$typespec} if ($trans -> {$typespec}) ; |
|
1083
|
|
|
|
|
|
|
} |
|
1084
|
0
|
0
|
|
|
|
|
$cmd = "ALTER TABLE $tabname ADD $field $type $ccmd" . ($lastfield?" AFTER $lastfield":'') ; |
|
1085
|
|
|
|
|
|
|
|
|
1086
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1087
|
|
|
|
|
|
|
|
|
1088
|
0
|
0
|
|
|
|
|
die "Fehler beim Erstellen des Feldes $tabname.$field:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1089
|
|
|
|
|
|
|
|
|
1090
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1091
|
|
|
|
|
|
|
|
|
1092
|
0
|
0
|
0
|
|
|
|
if ($init || $default) |
|
1093
|
|
|
|
|
|
|
{ |
|
1094
|
0
|
|
|
|
|
|
printl (" $field initialisieren", LL) ; |
|
1095
|
|
|
|
|
|
|
|
|
1096
|
0
|
|
|
|
|
|
$db -> MetaData ($tabname, undef, 1) ; |
|
1097
|
|
|
|
|
|
|
|
|
1098
|
0
|
|
|
|
|
|
my $rs = DBIx::Recordset -> Setup ({'!DataSource' => $db, '!Table' => $tabname, '!PrimKey' => $tabdef{'!PrimKey'}}) ; |
|
1099
|
0
|
0
|
|
|
|
|
die "Fehler beim Setup von Tabelle $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1100
|
|
|
|
|
|
|
|
|
1101
|
0
|
|
|
|
|
|
my $rec ; |
|
1102
|
0
|
0
|
0
|
|
|
|
if ($default && defined ($default -> {$field})) |
|
1103
|
|
|
|
|
|
|
{ |
|
1104
|
0
|
|
|
|
|
|
$$rs -> Update ({$field, $default -> {$field}}, "$field is null") ; |
|
1105
|
0
|
0
|
|
|
|
|
die "Fehler beim Update in Tabelle $tabname:\n" . $$rs -> LastSQLStatement . "\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1106
|
|
|
|
|
|
|
} |
|
1107
|
|
|
|
|
|
|
|
|
1108
|
0
|
0
|
|
|
|
|
if ($init) |
|
1109
|
|
|
|
|
|
|
{ |
|
1110
|
0
|
|
|
|
|
|
foreach $rec (@$init) |
|
1111
|
|
|
|
|
|
|
{ |
|
1112
|
0
|
|
|
|
|
|
$$rs -> Update ({$field, $rec -> {$field}}, {$pk => $rec -> {$pk}}) ; |
|
1113
|
0
|
0
|
|
|
|
|
die "Fehler beim Update in Tabelle $tabname:\n" . $$rs -> LastSQLStatement . "\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1114
|
|
|
|
|
|
|
} |
|
1115
|
|
|
|
|
|
|
} |
|
1116
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1117
|
|
|
|
|
|
|
} |
|
1118
|
|
|
|
|
|
|
} |
|
1119
|
|
|
|
|
|
|
elsif ($alterconstraints && $ccmd) |
|
1120
|
|
|
|
|
|
|
{ |
|
1121
|
0
|
|
|
|
|
|
printl (" Alter Constraint $field", LL) ; |
|
1122
|
|
|
|
|
|
|
|
|
1123
|
0
|
|
|
|
|
|
$ccmd = '' ; |
|
1124
|
0
|
|
|
|
|
|
$ncnt = 0 ; |
|
1125
|
0
|
0
|
0
|
|
|
|
if ($constraints && ($constraint = $constraints -> {$field})) |
|
1126
|
|
|
|
|
|
|
{ |
|
1127
|
0
|
|
|
|
|
|
$cname = "${tabname}_$field" ; |
|
1128
|
0
|
|
|
|
|
|
for ($c = 0 ; $c < $#$constraint; $c+=2) |
|
1129
|
|
|
|
|
|
|
{ |
|
1130
|
0
|
0
|
|
|
|
|
if ($constraint -> [$c] eq '!Name') |
|
1131
|
|
|
|
|
|
|
{ |
|
1132
|
0
|
|
|
|
|
|
$cname = $tabprefix . $constraint -> [$c+1] ; |
|
1133
|
0
|
|
|
|
|
|
$ncnt = 0 ; |
|
1134
|
0
|
|
|
|
|
|
next ; |
|
1135
|
|
|
|
|
|
|
} |
|
1136
|
0
|
|
|
|
|
|
$ncnt++ ; |
|
1137
|
0
|
0
|
|
|
|
|
$ccmd = " CONSTRAINT $cname" . ( $ncnt>1?$ncnt:'') ; |
|
1138
|
0
|
|
|
|
|
|
$cmd = "ALTER TABLE $tabname DROP $ccmd" ; |
|
1139
|
|
|
|
|
|
|
|
|
1140
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1141
|
|
|
|
|
|
|
|
|
1142
|
|
|
|
|
|
|
#die "Fehler beim Erstellen des Feldes $tabname.$field:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1143
|
|
|
|
|
|
|
|
|
1144
|
0
|
0
|
|
|
|
|
if ($alterconstraints > 0) |
|
1145
|
|
|
|
|
|
|
{ |
|
1146
|
0
|
|
|
|
|
|
$cval = $constraint -> [$c] ; |
|
1147
|
0
|
0
|
0
|
|
|
|
if (lc ($cval) eq 'null' || lc ($cval) eq 'not null') |
|
1148
|
|
|
|
|
|
|
{ |
|
1149
|
0
|
|
|
|
|
|
$cmd = "ALTER TABLE $tabname MODIFY $field $ccmd $cval" ; |
|
1150
|
|
|
|
|
|
|
} |
|
1151
|
|
|
|
|
|
|
else |
|
1152
|
|
|
|
|
|
|
{ |
|
1153
|
0
|
|
|
|
|
|
$cval .= " ($field) " . $constraint -> [$c+1] ; |
|
1154
|
0
|
|
|
|
|
|
$cval =~ s#REFERENCES\s+(.*?)\s*\(#REFERENCES $tabprefix$1 (#i ; |
|
1155
|
|
|
|
|
|
|
|
|
1156
|
0
|
|
|
|
|
|
$cmd = "ALTER TABLE $tabname ADD $ccmd $cval" ; |
|
1157
|
|
|
|
|
|
|
} |
|
1158
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1159
|
0
|
0
|
|
|
|
|
die "Fehler beim Ändern des Constraints des Feldes $tabname.$field:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1160
|
|
|
|
|
|
|
} |
|
1161
|
|
|
|
|
|
|
} |
|
1162
|
|
|
|
|
|
|
} |
|
1163
|
|
|
|
|
|
|
|
|
1164
|
|
|
|
|
|
|
|
|
1165
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1166
|
|
|
|
|
|
|
} |
|
1167
|
|
|
|
|
|
|
|
|
1168
|
0
|
|
|
|
|
|
$dbfields{$field} = 2 ; |
|
1169
|
|
|
|
|
|
|
} |
|
1170
|
0
|
0
|
|
|
|
|
if ($candropcolumn) |
|
1171
|
|
|
|
|
|
|
{ |
|
1172
|
0
|
|
|
|
|
|
while (($field, $i) = each (%dbfields)) |
|
1173
|
|
|
|
|
|
|
{ |
|
1174
|
0
|
0
|
|
|
|
|
if ($i == 1) |
|
1175
|
|
|
|
|
|
|
{ |
|
1176
|
0
|
|
|
|
|
|
printl (" Drop $field", LL) ; |
|
1177
|
|
|
|
|
|
|
|
|
1178
|
0
|
|
|
|
|
|
$cmd = "ALTER TABLE $tabname DROP $field" ; |
|
1179
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1180
|
|
|
|
|
|
|
|
|
1181
|
0
|
0
|
|
|
|
|
die "Fehler beim Entfernen des Feldes $tabname.$field:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1182
|
|
|
|
|
|
|
|
|
1183
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1184
|
|
|
|
|
|
|
} |
|
1185
|
|
|
|
|
|
|
} |
|
1186
|
|
|
|
|
|
|
} |
|
1187
|
|
|
|
|
|
|
} |
|
1188
|
|
|
|
|
|
|
else |
|
1189
|
|
|
|
|
|
|
{ |
|
1190
|
0
|
|
|
|
|
|
printl ("$tabname erstellen", LL) ; |
|
1191
|
|
|
|
|
|
|
|
|
1192
|
0
|
|
|
|
|
|
my $cmd = "CREATE TABLE $tabname (" ; |
|
1193
|
0
|
|
|
|
|
|
$newtab = 1 ; |
|
1194
|
|
|
|
|
|
|
|
|
1195
|
0
|
|
|
|
|
|
my $fields = $tabdef{'!Fields'} ; |
|
1196
|
0
|
|
|
|
|
|
for ($i = 0; $i <= $#$fields; $i+= 2) |
|
1197
|
|
|
|
|
|
|
{ |
|
1198
|
0
|
|
|
|
|
|
$field = lc($fields -> [$i]) ; |
|
1199
|
0
|
|
|
|
|
|
$typespec = $fields -> [$i+1] ; |
|
1200
|
0
|
0
|
0
|
|
|
|
$hasseq = $newseq = 1 if ($createseq && $typespec eq 'counter') ; |
|
1201
|
|
|
|
|
|
|
|
|
1202
|
0
|
0
|
|
|
|
|
if ($typespec =~ /^(.*?)\s*\((.*?)\)(.*?)$/) |
|
1203
|
|
|
|
|
|
|
{ |
|
1204
|
0
|
0
|
|
|
|
|
$type = $trans -> {$1}?$trans -> {$1}:$1 . "($2) $3" ; |
|
1205
|
|
|
|
|
|
|
} |
|
1206
|
|
|
|
|
|
|
else |
|
1207
|
|
|
|
|
|
|
{ |
|
1208
|
0
|
|
|
|
|
|
$type = $typespec ; |
|
1209
|
0
|
0
|
|
|
|
|
$type = $trans -> {$typespec} if ($trans -> {$typespec}) ; |
|
1210
|
|
|
|
|
|
|
} |
|
1211
|
|
|
|
|
|
|
|
|
1212
|
0
|
|
|
|
|
|
$ccmd = '' ; |
|
1213
|
0
|
|
|
|
|
|
$ncnt = 0 ; |
|
1214
|
0
|
0
|
0
|
|
|
|
if ($constraints && ($constraint = $constraints -> {$field})) |
|
1215
|
|
|
|
|
|
|
{ |
|
1216
|
0
|
|
|
|
|
|
$cname = "${tabname}_$field" ; |
|
1217
|
0
|
|
|
|
|
|
for ($c = 0 ; $c < $#$constraint; $c+=2) |
|
1218
|
|
|
|
|
|
|
{ |
|
1219
|
0
|
0
|
|
|
|
|
if ($constraint -> [$c] eq '!Name') |
|
1220
|
|
|
|
|
|
|
{ |
|
1221
|
0
|
|
|
|
|
|
$cname = $tabprefix . $constraint -> [$c+1] ; |
|
1222
|
0
|
|
|
|
|
|
$ncnt = 0 ; |
|
1223
|
0
|
|
|
|
|
|
next ; |
|
1224
|
|
|
|
|
|
|
} |
|
1225
|
0
|
|
|
|
|
|
$ncnt++ ; |
|
1226
|
0
|
|
0
|
|
|
|
$cval = $constraint -> [$c+1] || $constraint -> [$c] ; |
|
1227
|
0
|
|
|
|
|
|
$cval =~ s#REFERENCES\s+(.*?)\s*\(#REFERENCES $tabprefix$1 (#i ; |
|
1228
|
0
|
0
|
|
|
|
|
$ccmd .= " CONSTRAINT $cname" . ( $ncnt >1?$ncnt:'') . " $cval" ; |
|
1229
|
|
|
|
|
|
|
} |
|
1230
|
|
|
|
|
|
|
} |
|
1231
|
|
|
|
|
|
|
|
|
1232
|
|
|
|
|
|
|
|
|
1233
|
0
|
|
|
|
|
|
$cmd .= "$field $type $ccmd" ; |
|
1234
|
0
|
0
|
|
|
|
|
$cmd .= ($i == $#$fields - 1?' ':', ') ; |
|
1235
|
|
|
|
|
|
|
} |
|
1236
|
|
|
|
|
|
|
|
|
1237
|
0
|
0
|
|
|
|
|
$cmd .= ", PRIMARY KEY ($tabdef{'!PrimKey'})" if ($tabdef{'!PrimKey'}) ; |
|
1238
|
0
|
|
|
|
|
|
$cmd .= ')' ; |
|
1239
|
|
|
|
|
|
|
|
|
1240
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1241
|
|
|
|
|
|
|
|
|
1242
|
0
|
0
|
|
|
|
|
die "Fehler beim Erstellen der Tabelle $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1243
|
|
|
|
|
|
|
|
|
1244
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1245
|
|
|
|
|
|
|
|
|
1246
|
0
|
0
|
|
|
|
|
if ($init) |
|
1247
|
|
|
|
|
|
|
{ |
|
1248
|
0
|
|
|
|
|
|
printl ("$tabname initialisieren", LL) ; |
|
1249
|
|
|
|
|
|
|
|
|
1250
|
0
|
|
|
|
|
|
my $rs = DBIx::Recordset -> Setup ({'!DataSource' => $db, '!Table' => $tabname, '!PrimKey' => $tabdef{'!PrimKey'}}) ; |
|
1251
|
0
|
0
|
|
|
|
|
die "Fehler beim Setup von Tabelle $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1252
|
|
|
|
|
|
|
|
|
1253
|
0
|
|
|
|
|
|
my $rec ; |
|
1254
|
0
|
|
|
|
|
|
foreach $rec (@$init) |
|
1255
|
|
|
|
|
|
|
{ |
|
1256
|
0
|
|
|
|
|
|
my %dat ; |
|
1257
|
0
|
0
|
|
|
|
|
if ($default) |
|
1258
|
|
|
|
|
|
|
{ |
|
1259
|
0
|
|
|
|
|
|
%dat = (%$default, %$rec) ; |
|
1260
|
|
|
|
|
|
|
} |
|
1261
|
|
|
|
|
|
|
else |
|
1262
|
|
|
|
|
|
|
{ |
|
1263
|
0
|
|
|
|
|
|
%dat = %$rec ; |
|
1264
|
|
|
|
|
|
|
} |
|
1265
|
|
|
|
|
|
|
|
|
1266
|
0
|
|
|
|
|
|
$$rs -> Insert (\%dat) ; |
|
1267
|
0
|
0
|
|
|
|
|
die "Fehler beim Insert in Tabelle $tabname:\n" . $$rs -> LastSQLStatement . "\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1268
|
|
|
|
|
|
|
} |
|
1269
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1270
|
|
|
|
|
|
|
} |
|
1271
|
|
|
|
|
|
|
} |
|
1272
|
|
|
|
|
|
|
|
|
1273
|
|
|
|
|
|
|
|
|
1274
|
0
|
0
|
|
|
|
|
if ($index) |
|
1275
|
|
|
|
|
|
|
{ |
|
1276
|
0
|
|
|
|
|
|
printl ("$tabname index erstellen", LL) ; |
|
1277
|
|
|
|
|
|
|
|
|
1278
|
0
|
|
|
|
|
|
my $i ; |
|
1279
|
0
|
|
|
|
|
|
for ($i = 0; $i <= $#$index; $i+= 2) |
|
1280
|
|
|
|
|
|
|
{ |
|
1281
|
0
|
|
|
|
|
|
my $field = lc($index -> [$i]) ; |
|
1282
|
0
|
|
|
|
|
|
my $name = "${tabname}_${field}_ndx" ; |
|
1283
|
0
|
|
|
|
|
|
my $attr = $index -> [$i+1] ; |
|
1284
|
0
|
0
|
|
|
|
|
if (ref($attr) eq 'HASH') |
|
1285
|
|
|
|
|
|
|
{ |
|
1286
|
0
|
|
|
|
|
|
$name = "$tabprefix$attr->{Name}" ; |
|
1287
|
0
|
|
|
|
|
|
$attr = $attr -> {Attr} ; |
|
1288
|
|
|
|
|
|
|
} |
|
1289
|
|
|
|
|
|
|
|
|
1290
|
0
|
|
|
|
|
|
my $cmd = "CREATE $attr INDEX $name ON $tabname ($field)" ; |
|
1291
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1292
|
0
|
0
|
0
|
|
|
|
die "Fehler beim Erstellen des Indexes für $field:\n$cmd\n" . DBIx::Database->LastError if ($newtab && DBIx::Database->LastError) ; |
|
1293
|
|
|
|
|
|
|
} |
|
1294
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1295
|
|
|
|
|
|
|
} |
|
1296
|
|
|
|
|
|
|
|
|
1297
|
|
|
|
|
|
|
|
|
1298
|
0
|
0
|
0
|
|
|
|
if ($grant && ($newtab || $setpriv)) |
|
|
|
|
0
|
|
|
|
|
|
1299
|
|
|
|
|
|
|
{ |
|
1300
|
0
|
0
|
|
|
|
|
if ($createpublic) |
|
1301
|
|
|
|
|
|
|
|
|
1302
|
|
|
|
|
|
|
{ |
|
1303
|
0
|
|
|
|
|
|
printl ("public synonym für $tabname erstellen", LL) ; |
|
1304
|
|
|
|
|
|
|
|
|
1305
|
0
|
0
|
0
|
|
|
|
if ($setpriv && !$newtab) |
|
1306
|
|
|
|
|
|
|
{ |
|
1307
|
0
|
|
|
|
|
|
my $cmd = "DROP PUBLIC SYNONYM $tabname " ; |
|
1308
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1309
|
|
|
|
|
|
|
} |
|
1310
|
|
|
|
|
|
|
|
|
1311
|
0
|
|
|
|
|
|
my $cmd = "CREATE PUBLIC SYNONYM $tabname FOR $shema.$tabname" ; |
|
1312
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1313
|
0
|
0
|
0
|
|
|
|
die "Fehler beim Erstellen von public Synonym $tabname:\n$cmd\n" . DBIx::Database->LastError if ($newtab && DBIx::Database->LastError) ; |
|
1314
|
|
|
|
|
|
|
|
|
1315
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1316
|
|
|
|
|
|
|
} |
|
1317
|
0
|
|
|
|
|
|
printl ("$tabname Berechtigungen setzen", LL) ; |
|
1318
|
|
|
|
|
|
|
|
|
1319
|
0
|
0
|
0
|
|
|
|
if ($setpriv && !$newtab) |
|
1320
|
|
|
|
|
|
|
{ |
|
1321
|
0
|
|
|
|
|
|
my $cmd = "REVOKE all ON $tabname FROM $user" ; |
|
1322
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1323
|
0
|
0
|
|
|
|
|
warn "Fehler beim Entziehen der Berechtigungen für Tabelle $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1324
|
|
|
|
|
|
|
} |
|
1325
|
|
|
|
|
|
|
|
|
1326
|
0
|
|
|
|
|
|
$cmd = 'GRANT ' . join (',', @$grant) . " ON $tabname TO $user" ; |
|
1327
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1328
|
0
|
0
|
|
|
|
|
die "Fehler beim Setzen der Berechtigungen für Tabelle $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1329
|
|
|
|
|
|
|
|
|
1330
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1331
|
|
|
|
|
|
|
} |
|
1332
|
|
|
|
|
|
|
|
|
1333
|
0
|
0
|
|
|
|
|
if ($hasseq) |
|
1334
|
|
|
|
|
|
|
{ |
|
1335
|
0
|
|
|
|
|
|
$tabname = "${tabname}_seq" ; |
|
1336
|
|
|
|
|
|
|
|
|
1337
|
0
|
0
|
|
|
|
|
if ($newseq) |
|
1338
|
|
|
|
|
|
|
{ |
|
1339
|
0
|
|
|
|
|
|
printl ("$tabname erstellen", LL) ; |
|
1340
|
|
|
|
|
|
|
|
|
1341
|
0
|
|
|
|
|
|
my $cmd = "CREATE SEQUENCE $tabname " ; |
|
1342
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1343
|
|
|
|
|
|
|
|
|
1344
|
0
|
0
|
|
|
|
|
die "Fehler beim Erstellen von Sequenz $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1345
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1346
|
|
|
|
|
|
|
} |
|
1347
|
|
|
|
|
|
|
|
|
1348
|
0
|
0
|
0
|
|
|
|
if ($grant && ($newseq || $setpriv)) |
|
|
|
|
0
|
|
|
|
|
|
1349
|
|
|
|
|
|
|
{ |
|
1350
|
0
|
0
|
|
|
|
|
if ($createpublic) |
|
1351
|
|
|
|
|
|
|
|
|
1352
|
|
|
|
|
|
|
{ |
|
1353
|
0
|
|
|
|
|
|
printl ("public synonym für $tabname erstellen", LL) ; |
|
1354
|
|
|
|
|
|
|
|
|
1355
|
0
|
0
|
0
|
|
|
|
if ($setpriv && !$newseq) |
|
1356
|
|
|
|
|
|
|
{ |
|
1357
|
0
|
|
|
|
|
|
my $cmd = "DROP PUBLIC SYNONYM $tabname " ; |
|
1358
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1359
|
|
|
|
|
|
|
} |
|
1360
|
|
|
|
|
|
|
|
|
1361
|
0
|
|
|
|
|
|
my $cmd = "CREATE PUBLIC SYNONYM $tabname FOR $shema.$tabname" ; |
|
1362
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1363
|
|
|
|
|
|
|
|
|
1364
|
0
|
0
|
0
|
|
|
|
die "Fehler beim Erstellen von public Synonym $tabname:\n$cmd\n" . DBIx::Database->LastError if ($newseq && DBIx::Database->LastError) ; |
|
1365
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1366
|
|
|
|
|
|
|
} |
|
1367
|
|
|
|
|
|
|
|
|
1368
|
0
|
|
|
|
|
|
printl ("$tabname Berechtigungen setzen", LL) ; |
|
1369
|
|
|
|
|
|
|
|
|
1370
|
0
|
0
|
0
|
|
|
|
if ($setpriv && !$newseq) |
|
1371
|
|
|
|
|
|
|
{ |
|
1372
|
0
|
|
|
|
|
|
my $cmd = "REVOKE all ON $tabname FROM $user" ; |
|
1373
|
|
|
|
|
|
|
|
|
1374
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1375
|
0
|
0
|
|
|
|
|
warn "Fehler beim Entziehen der Berechtigungen für Tabelle $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1376
|
|
|
|
|
|
|
} |
|
1377
|
|
|
|
|
|
|
|
|
1378
|
0
|
|
|
|
|
|
$cmd = "GRANT select ON $tabname TO $user" ; |
|
1379
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1380
|
0
|
0
|
|
|
|
|
die "Fehler beim Setzen der Berechtigungen für Tabelle $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1381
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1382
|
|
|
|
|
|
|
|
|
1383
|
|
|
|
|
|
|
} |
|
1384
|
|
|
|
|
|
|
} |
|
1385
|
|
|
|
|
|
|
} |
|
1386
|
|
|
|
|
|
|
} |
|
1387
|
|
|
|
|
|
|
|
|
1388
|
|
|
|
|
|
|
## --------------------------------------------------------------------------------- |
|
1389
|
|
|
|
|
|
|
## |
|
1390
|
|
|
|
|
|
|
## Datenbank Tabellen entfernen |
|
1391
|
|
|
|
|
|
|
## |
|
1392
|
|
|
|
|
|
|
## in $shema schema name (Oracle) |
|
1393
|
|
|
|
|
|
|
## in $user user to revoke rights from |
|
1394
|
|
|
|
|
|
|
## |
|
1395
|
|
|
|
|
|
|
|
|
1396
|
|
|
|
|
|
|
|
|
1397
|
|
|
|
|
|
|
sub DropTables |
|
1398
|
|
|
|
|
|
|
|
|
1399
|
|
|
|
|
|
|
{ |
|
1400
|
|
|
|
|
|
|
#my $DataSource = shift ; |
|
1401
|
|
|
|
|
|
|
#my $setupuser = shift ; |
|
1402
|
|
|
|
|
|
|
#my $setuppass = shift ; |
|
1403
|
|
|
|
|
|
|
#my $tabprefix = shift ; |
|
1404
|
0
|
|
|
0
|
0
|
|
my $db = shift ; |
|
1405
|
0
|
|
|
|
|
|
my $shema = shift ; |
|
1406
|
0
|
|
|
|
|
|
my $user = shift ; |
|
1407
|
|
|
|
|
|
|
|
|
1408
|
0
|
|
|
|
|
|
print "\nDatenbank Tabellen entfernen:\n" ; |
|
1409
|
|
|
|
|
|
|
|
|
1410
|
|
|
|
|
|
|
#my $db = DBIx::Database -> new ({'!DataSource' => "$DataSource", |
|
1411
|
|
|
|
|
|
|
# '!Username' => $setupuser, |
|
1412
|
|
|
|
|
|
|
# '!Password' => $setuppass, |
|
1413
|
|
|
|
|
|
|
# '!KeepOpen' => 1, |
|
1414
|
|
|
|
|
|
|
# '!TableFilter' => $tabprefix}) ; |
|
1415
|
|
|
|
|
|
|
# |
|
1416
|
|
|
|
|
|
|
#die DBIx::Database->LastError . "; Datenbank muß bereits bestehen" if (DBIx::Database->LastError) ; |
|
1417
|
|
|
|
|
|
|
|
|
1418
|
0
|
|
|
|
|
|
my $tables = $db -> AllTables ; |
|
1419
|
|
|
|
|
|
|
|
|
1420
|
|
|
|
|
|
|
|
|
1421
|
0
|
|
|
|
|
|
my $tab ; |
|
1422
|
|
|
|
|
|
|
my $tabname ; |
|
1423
|
0
|
|
|
|
|
|
my @seq ; |
|
1424
|
0
|
|
|
|
|
|
my $cmd ; |
|
1425
|
|
|
|
|
|
|
|
|
1426
|
0
|
|
0
|
|
|
|
my $public = defined ($user) && $db -> {'*Username'} ne $user ; |
|
1427
|
|
|
|
|
|
|
|
|
1428
|
0
|
|
|
|
|
|
my $drv = $db->{'*Driver'} ; |
|
1429
|
0
|
|
|
|
|
|
my $tabprefix = $db -> {'*TableFilter'} ; |
|
1430
|
0
|
|
|
|
|
|
my $createseq = DBIx::Compat::GetItem ($drv, 'CreateSeq') ; |
|
1431
|
0
|
|
0
|
|
|
|
my $createpublic = $public && DBIx::Compat::GetItem ($drv, 'CreatePublic') ; |
|
1432
|
|
|
|
|
|
|
|
|
1433
|
0
|
|
|
|
|
|
foreach $tabname (keys %$tables) |
|
1434
|
|
|
|
|
|
|
{ |
|
1435
|
0
|
|
|
|
|
|
printl ("$tabname entfernen", LL) ; |
|
1436
|
|
|
|
|
|
|
|
|
1437
|
0
|
0
|
|
|
|
|
if ($createpublic) |
|
1438
|
|
|
|
|
|
|
{ |
|
1439
|
0
|
|
|
|
|
|
my $cmd = "DROP PUBLIC SYNONYM $tabname " ; |
|
1440
|
|
|
|
|
|
|
|
|
1441
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1442
|
|
|
|
|
|
|
} |
|
1443
|
|
|
|
|
|
|
|
|
1444
|
|
|
|
|
|
|
#push @seq, $tabname if ($createseq && $typespec eq 'counter') ; |
|
1445
|
|
|
|
|
|
|
|
|
1446
|
0
|
|
|
|
|
|
$cmd = "DROP TABLE $tabname" ; |
|
1447
|
|
|
|
|
|
|
|
|
1448
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1449
|
|
|
|
|
|
|
|
|
1450
|
0
|
|
|
|
|
|
$db -> MetaData ($tabname, undef, 1) ; |
|
1451
|
0
|
|
|
|
|
|
$tables -> {$tabname} = 0 ; |
|
1452
|
|
|
|
|
|
|
|
|
1453
|
0
|
0
|
|
|
|
|
die "Fehler beim Entfernen der Tabelle $tabname:\n$cmd\n" . DBIx::Database->LastError if (DBIx::Database->LastError) ; |
|
1454
|
|
|
|
|
|
|
|
|
1455
|
0
|
|
|
|
|
|
print "ok\n" ; |
|
1456
|
|
|
|
|
|
|
|
|
1457
|
0
|
0
|
|
|
|
|
if ($createseq) |
|
1458
|
|
|
|
|
|
|
{ |
|
1459
|
0
|
|
|
|
|
|
$tabname = "${tabname}_seq" ; |
|
1460
|
|
|
|
|
|
|
|
|
1461
|
|
|
|
|
|
|
#printl ("$tabname erstellen", LL) ; |
|
1462
|
|
|
|
|
|
|
|
|
1463
|
0
|
|
|
|
|
|
my $cmd = "DROP SEQUENCE $tabname " ; |
|
1464
|
|
|
|
|
|
|
|
|
1465
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1466
|
|
|
|
|
|
|
|
|
1467
|
0
|
0
|
|
|
|
|
if ($createpublic) |
|
1468
|
|
|
|
|
|
|
{ |
|
1469
|
0
|
|
|
|
|
|
my $cmd = "DROP PUBLIC SYNONYM $tabname " ; |
|
1470
|
|
|
|
|
|
|
|
|
1471
|
0
|
|
|
|
|
|
$db -> do ($cmd) ; |
|
1472
|
|
|
|
|
|
|
} |
|
1473
|
|
|
|
|
|
|
} |
|
1474
|
|
|
|
|
|
|
} |
|
1475
|
|
|
|
|
|
|
} |
|
1476
|
|
|
|
|
|
|
|
|
1477
|
|
|
|
|
|
|
## --------------------------------------------------------------------------------- |
|
1478
|
|
|
|
|
|
|
## |
|
1479
|
|
|
|
|
|
|
## Output with fixed length |
|
1480
|
|
|
|
|
|
|
## |
|
1481
|
|
|
|
|
|
|
## in $txt Text |
|
1482
|
|
|
|
|
|
|
## in $length Length |
|
1483
|
|
|
|
|
|
|
## in $txt2 Weiterer Text |
|
1484
|
|
|
|
|
|
|
## |
|
1485
|
|
|
|
|
|
|
|
|
1486
|
|
|
|
|
|
|
|
|
1487
|
|
|
|
|
|
|
sub printl |
|
1488
|
|
|
|
|
|
|
|
|
1489
|
|
|
|
|
|
|
{ |
|
1490
|
0
|
|
|
0
|
0
|
|
my ($txt, $length, $txt2) = @_ ; |
|
1491
|
|
|
|
|
|
|
|
|
1492
|
0
|
|
|
|
|
|
print $txt, ' ' x ($length - length($txt)), ' ', $txt2 ; |
|
1493
|
|
|
|
|
|
|
} ; |
|
1494
|
|
|
|
|
|
|
|
|
1495
|
|
|
|
|
|
|
|
|
1496
|
|
|
|
|
|
|
################################################################################### |
|
1497
|
|
|
|
|
|
|
|
|
1498
|
|
|
|
|
|
|
1; |
|
1499
|
|
|
|
|
|
|
__END__ |