| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package DBIx::XML::DataLoader; |
|
2
|
|
|
|
|
|
|
my $VERSION="1.0b"; |
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
|
|
5
|
1
|
|
|
1
|
|
912
|
use warnings; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
28
|
|
|
6
|
1
|
|
|
1
|
|
5
|
use strict; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
24
|
|
|
7
|
|
|
|
|
|
|
|
|
8
|
1
|
|
|
1
|
|
1243
|
use XML::XPath; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
use LWP::UserAgent; |
|
10
|
|
|
|
|
|
|
use Storable qw(dclone); |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
use DBIx::XML::DataLoader::MapIt; |
|
14
|
|
|
|
|
|
|
use DBIx::XML::DataLoader::DB; |
|
15
|
|
|
|
|
|
|
use DBIx::XML::DataLoader::IsDefined; |
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
########### |
|
18
|
|
|
|
|
|
|
sub new{ |
|
19
|
|
|
|
|
|
|
######## |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
my $class=shift; |
|
22
|
|
|
|
|
|
|
my $self={}; |
|
23
|
|
|
|
|
|
|
my %args=@_; |
|
24
|
|
|
|
|
|
|
my $map=$args{map}; |
|
25
|
|
|
|
|
|
|
#if(!$map){die "a map file is required for creating a new object\n";} |
|
26
|
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
$self->{dbmode}=$args{dbmode}||"insertupdate"; |
|
28
|
|
|
|
|
|
|
$self->{dbprint}=$args{dbprint}||undef; |
|
29
|
|
|
|
|
|
|
my $dbprint=$args{dbprint}||$self->{dbprint}||undef; |
|
30
|
|
|
|
|
|
|
my $dbmode=$args{dbmode}||$self->{dbmode}||"insertupdate"; |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
$self->{map}=$args{map}||undef; |
|
33
|
|
|
|
|
|
|
$self->{xml}=$args{xml}||undef; |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
my @classmap=DBIx::XML::DataLoader::MapIt->mapclasses($map); |
|
36
|
|
|
|
|
|
|
my @tables=@{$classmap[4]}; |
|
37
|
|
|
|
|
|
|
my $dbinfo=$classmap[1]; |
|
38
|
|
|
|
|
|
|
my $db_connections; |
|
39
|
|
|
|
|
|
|
my $db=DBIx::XML::DataLoader::DB->new(dbmode=>$dbmode, dbprint=>$dbprint); |
|
40
|
|
|
|
|
|
|
$self->{db}=$db; |
|
41
|
|
|
|
|
|
|
if($dbinfo){ |
|
42
|
|
|
|
|
|
|
for my $keys (keys %{$dbinfo}){ |
|
43
|
|
|
|
|
|
|
my $dbuser=$dbinfo->{$keys}->{dbuser}; |
|
44
|
|
|
|
|
|
|
my $dbpass=$dbinfo->{$keys}->{dbpass}; |
|
45
|
|
|
|
|
|
|
my $dbsource=$dbinfo->{$keys}->{dbsource}; |
|
46
|
|
|
|
|
|
|
my $dbh; |
|
47
|
|
|
|
|
|
|
$dbh=$db->DBConnect($dbuser,$dbpass,$dbsource); |
|
48
|
|
|
|
|
|
|
$db_connections->{$keys}=$dbh; |
|
49
|
|
|
|
|
|
|
} |
|
50
|
|
|
|
|
|
|
} |
|
51
|
|
|
|
|
|
|
$self->{db_connections}=$db_connections; |
|
52
|
|
|
|
|
|
|
$self->{classmap}=\@classmap; |
|
53
|
|
|
|
|
|
|
$self->{tables}=\@tables; |
|
54
|
|
|
|
|
|
|
bless ($self, $class); |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
############### |
|
57
|
|
|
|
|
|
|
} # end sub new |
|
58
|
|
|
|
|
|
|
####################### |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
############################# |
|
61
|
|
|
|
|
|
|
sub processxml{ |
|
62
|
|
|
|
|
|
|
################ |
|
63
|
|
|
|
|
|
|
if(scalar @_ < 3){die "failed to provide the proper arguments of xml, and map file @_\n";} |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
################## |
|
67
|
|
|
|
|
|
|
no strict 'refs'; |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
my $self=shift; |
|
70
|
|
|
|
|
|
|
my %args=@_; |
|
71
|
|
|
|
|
|
|
$XML::XPath::Namespaces=0; |
|
72
|
|
|
|
|
|
|
my $dbprint=$args{dbprint}||$self->{dbprint}||undef; |
|
73
|
|
|
|
|
|
|
my $dbmode=$args{dbmode}||$self->{dbmode}||"insertupdate"; |
|
74
|
|
|
|
|
|
|
my $file_count=$args{count}; |
|
75
|
|
|
|
|
|
|
my @classmap = @{$self->{classmap}}; |
|
76
|
|
|
|
|
|
|
my $xml=$args{xml}; |
|
77
|
|
|
|
|
|
|
if($xml){$self->{xml}=$xml;} |
|
78
|
|
|
|
|
|
|
#my $map=$args{map}||$self->{map}; |
|
79
|
|
|
|
|
|
|
my @allxmlfiles; |
|
80
|
|
|
|
|
|
|
my @allxmldocs_processed; |
|
81
|
|
|
|
|
|
|
my @everybitofdata; |
|
82
|
|
|
|
|
|
|
my @errors; |
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
my $suberrors; |
|
85
|
|
|
|
|
|
|
my $dbmessage; |
|
86
|
|
|
|
|
|
|
my $message; |
|
87
|
|
|
|
|
|
|
my @sqlload; |
|
88
|
|
|
|
|
|
|
my $dberror; |
|
89
|
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
################################################################## |
|
91
|
|
|
|
|
|
|
### here we process our map file and get the db and xml document |
|
92
|
|
|
|
|
|
|
### structure information we need to continue |
|
93
|
|
|
|
|
|
|
### |
|
94
|
|
|
|
|
|
|
my $tables=$classmap[4]; |
|
95
|
|
|
|
|
|
|
my $table_ref=$classmap[3]; |
|
96
|
|
|
|
|
|
|
my $rootelement=$classmap[2]; |
|
97
|
|
|
|
|
|
|
my $dbinfo=$classmap[1]; |
|
98
|
|
|
|
|
|
|
####### here we make all the needed database connections |
|
99
|
|
|
|
|
|
|
my $db_connections=$self->{db_connections}; |
|
100
|
|
|
|
|
|
|
my $db=$self->{db}; |
|
101
|
|
|
|
|
|
|
my $thesubs=$classmap[0]; |
|
102
|
|
|
|
|
|
|
my @tables=@{$tables}; |
|
103
|
|
|
|
|
|
|
####################################################### |
|
104
|
|
|
|
|
|
|
## here we run the pre parse subroutines |
|
105
|
|
|
|
|
|
|
{no warnings; #warnings are turned off so that we will not get complaints |
|
106
|
|
|
|
|
|
|
# if runsubs returns no value; |
|
107
|
|
|
|
|
|
|
my ($serror, undef)=_runsubs($db_connections,$thesubs, 'prexml'); |
|
108
|
|
|
|
|
|
|
$suberrors.=$serror; |
|
109
|
|
|
|
|
|
|
} |
|
110
|
|
|
|
|
|
|
################################################## |
|
111
|
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
#$XML::XPath::SafeMod; |
|
113
|
|
|
|
|
|
|
### we now start looping through our xml files |
|
114
|
|
|
|
|
|
|
###we do subroutine and db inserts one xml file at a time |
|
115
|
|
|
|
|
|
|
my $all_xml; |
|
116
|
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
my $current_xml; |
|
118
|
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
my @arrayofallinserts; |
|
120
|
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
############################################################################# |
|
123
|
|
|
|
|
|
|
## here we will check to make sure the files and directories requested |
|
124
|
|
|
|
|
|
|
## exists |
|
125
|
|
|
|
|
|
|
if(!$xml){warn "we had no xml sent in";return;} |
|
126
|
|
|
|
|
|
|
if($xml =~ /^http:/){ |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
my $ua = new LWP::UserAgent; |
|
129
|
|
|
|
|
|
|
$ua->agent("DBIx_XML_DataLoader/1.0b " . $ua->agent); |
|
130
|
|
|
|
|
|
|
my $req = new HTTP::Request(GET=>$xml); |
|
131
|
|
|
|
|
|
|
my $res = $ua->request($req); |
|
132
|
|
|
|
|
|
|
if ($res->is_success){ |
|
133
|
|
|
|
|
|
|
$xml=$res->content; |
|
134
|
|
|
|
|
|
|
} |
|
135
|
|
|
|
|
|
|
} |
|
136
|
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
if($xml =~ /^http:/){die "we did not get the remote xml map file you requested";} |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
if($xml !~ /\
|
|
142
|
|
|
|
|
|
|
my $xmltype=(stat($xml))[2]; |
|
143
|
|
|
|
|
|
|
if($xmltype=~ /^1/){die "ERROR: The file is a directory not a regular file";} |
|
144
|
|
|
|
|
|
|
if(!$xmltype){die "ERROR: The file you entered does not exist";} |
|
145
|
|
|
|
|
|
|
return unless (eval{$all_xml = XML::XPath->new(filename => $xml);}); |
|
146
|
|
|
|
|
|
|
} |
|
147
|
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
if($xml =~ /\
|
|
149
|
|
|
|
|
|
|
return unless (eval{$all_xml = XML::XPath->new(xml => $xml);}); |
|
150
|
|
|
|
|
|
|
} |
|
151
|
|
|
|
|
|
|
########################################################################################## |
|
152
|
|
|
|
|
|
|
## below we loop through each table |
|
153
|
|
|
|
|
|
|
## and loop through the input xml file looking for items that belong in this table |
|
154
|
|
|
|
|
|
|
## once we fill all the required columns in the table we execute our SQL and empty |
|
155
|
|
|
|
|
|
|
## our colection of values and try to fill the required fields again we continue |
|
156
|
|
|
|
|
|
|
## through the document until we have no more value we can use. Then we start a new table. |
|
157
|
|
|
|
|
|
|
########################################################################################### |
|
158
|
|
|
|
|
|
|
my $loopcount; |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
TABLE: for my $table (@tables){ |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
$message.= "working with table $table\n"; |
|
163
|
|
|
|
|
|
|
my @table_info=@{$table_ref->{$table}}; |
|
164
|
|
|
|
|
|
|
my $table_details=pop @table_info; |
|
165
|
|
|
|
|
|
|
my @cols=@{$table_details->{columns}}; |
|
166
|
|
|
|
|
|
|
my @hashof_thekeys=@{$table_details->{keys}}; |
|
167
|
|
|
|
|
|
|
my @thekeys; |
|
168
|
|
|
|
|
|
|
for my $hash_thekey (@hashof_thekeys){ |
|
169
|
|
|
|
|
|
|
for my $key (keys %{$hash_thekey}){push @thekeys, $hash_thekey->{$key};} |
|
170
|
|
|
|
|
|
|
} |
|
171
|
|
|
|
|
|
|
my $keyelement=$table_details->{xpath}; |
|
172
|
|
|
|
|
|
|
my $dbname=$table_details->{dbname}; |
|
173
|
|
|
|
|
|
|
my $handlers=$table_details->{handlers}; |
|
174
|
|
|
|
|
|
|
my @tabprep; |
|
175
|
|
|
|
|
|
|
my %table; |
|
176
|
|
|
|
|
|
|
my $table_ref; |
|
177
|
|
|
|
|
|
|
my @incols; |
|
178
|
|
|
|
|
|
|
&_runtablesubs($db_connections,$handlers, 'TABLE', 'prexml'); |
|
179
|
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
my $count=scalar @cols; |
|
181
|
|
|
|
|
|
|
my @insdbh; |
|
182
|
|
|
|
|
|
|
my @upddbh; |
|
183
|
|
|
|
|
|
|
my @upkeys; |
|
184
|
|
|
|
|
|
|
my $date; |
|
185
|
|
|
|
|
|
|
### we are going to try to do this looping through the map file calssmap array |
|
186
|
|
|
|
|
|
|
### looking for values that match up in the $all_xmlmap hash referance. |
|
187
|
|
|
|
|
|
|
### |
|
188
|
|
|
|
|
|
|
my @currentkeys=@thekeys; |
|
189
|
|
|
|
|
|
|
my $current_class; |
|
190
|
|
|
|
|
|
|
my $current; |
|
191
|
|
|
|
|
|
|
my @allglobals; |
|
192
|
|
|
|
|
|
|
my @allresults; |
|
193
|
|
|
|
|
|
|
my %array_count; |
|
194
|
|
|
|
|
|
|
my $section_count; |
|
195
|
|
|
|
|
|
|
my $subsection_count; |
|
196
|
|
|
|
|
|
|
my $element_count; |
|
197
|
|
|
|
|
|
|
my $nodecounter; |
|
198
|
|
|
|
|
|
|
my $newloop="yes"; |
|
199
|
|
|
|
|
|
|
if(!$rootelement){$rootelement="/*";} |
|
200
|
|
|
|
|
|
|
my @allnodes; |
|
201
|
|
|
|
|
|
|
return unless (eval{ @allnodes = $all_xml->findnodes("$rootelement");}); |
|
202
|
|
|
|
|
|
|
BASENODE: while (@allnodes){ |
|
203
|
|
|
|
|
|
|
my $thenode=pop @allnodes; |
|
204
|
|
|
|
|
|
|
my @all_tab_nodes; |
|
205
|
|
|
|
|
|
|
next unless (eval { @all_tab_nodes= $thenode->findnodes("$keyelement");}); |
|
206
|
|
|
|
|
|
|
NODES: while (@all_tab_nodes){ |
|
207
|
|
|
|
|
|
|
my $node =shift @all_tab_nodes; |
|
208
|
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
CLASSLOOP: for my $class (@table_info){ |
|
210
|
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
my $xpath=$class->{xpath}; |
|
212
|
|
|
|
|
|
|
my $default = $class->{default}; |
|
213
|
|
|
|
|
|
|
my $item=$default; |
|
214
|
|
|
|
|
|
|
my $itemvalue=$node->findvalue($xpath); |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
$itemvalue=~s/\s+/ /g; |
|
217
|
|
|
|
|
|
|
## added for testing comment out when in production |
|
218
|
|
|
|
|
|
|
#if($class->{col} eq "computer_name"){$itemvalue="Comp $file_count";} |
|
219
|
|
|
|
|
|
|
## new routine in module IsDefined.pm will check to make sure a avriable has a value |
|
220
|
|
|
|
|
|
|
if(defined DBIx::XML::DataLoader::IsDefined->verify($itemvalue)){$item = $itemvalue;} |
|
221
|
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
if($handlers->{$class->{col}}){ |
|
223
|
|
|
|
|
|
|
HANDLERS: |
|
224
|
|
|
|
|
|
|
for my $key (sort keys %{$handlers->{$class->{col}}}){ |
|
225
|
|
|
|
|
|
|
my $sub; |
|
226
|
|
|
|
|
|
|
my $handler=$handlers->{$class->{col}}->{$key}->{handler}; |
|
227
|
|
|
|
|
|
|
if($handler !~ /^sub/){ |
|
228
|
|
|
|
|
|
|
$handler=~s/>/>/; |
|
229
|
|
|
|
|
|
|
my ($package, $subroutine)=split /\-\>/, $handler; |
|
230
|
|
|
|
|
|
|
my $mod_name=$package.".pm"; |
|
231
|
|
|
|
|
|
|
&_printsuberror($mod_name, $@) unless eval {require $mod_name}; |
|
232
|
|
|
|
|
|
|
my @substuff; |
|
233
|
|
|
|
|
|
|
push @substuff, $item,$handlers->{$class->{col}}->{$key}->{args},$db_connections->{$handlers->{$class->{col}}->{$key}->{dbname}}; |
|
234
|
|
|
|
|
|
|
&_printsuberror("$package->$subroutine", $@) unless (eval{$item=$package->$subroutine($item,$handlers->{$class->{col}}->{$key}->{args},$db_connections->{$handlers->{$class->{col}}->{$key}->{dbname}})}); |
|
235
|
|
|
|
|
|
|
} |
|
236
|
|
|
|
|
|
|
if($handler=~ /^sub\{/){ |
|
237
|
|
|
|
|
|
|
$handler=~s/\&/\&/g; |
|
238
|
|
|
|
|
|
|
$handler=~s/\"/\"/g; |
|
239
|
|
|
|
|
|
|
my $subroutine=$handler; |
|
240
|
|
|
|
|
|
|
$sub=eval "$subroutine"; |
|
241
|
|
|
|
|
|
|
{ |
|
242
|
|
|
|
|
|
|
no warnings; |
|
243
|
|
|
|
|
|
|
&_printsuberror($sub, $@) unless (eval {$item= &$sub($item,$handlers->{$class->{col}}->{$key}->{args},$db_connections->{$handlers->{$class->{col}}->{$key}->{dbname}})}); |
|
244
|
|
|
|
|
|
|
} |
|
245
|
|
|
|
|
|
|
} |
|
246
|
|
|
|
|
|
|
} # end loop HANDLERS |
|
247
|
|
|
|
|
|
|
} # if handlers |
|
248
|
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
if($class->{col}=~ /^UPDATE_DTTM$|^CREATE_DTTM$/){$item="SYSDATE";} |
|
250
|
|
|
|
|
|
|
my $key; |
|
251
|
|
|
|
|
|
|
KEYS: for my $ckeys(@currentkeys){ |
|
252
|
|
|
|
|
|
|
if($ckeys eq $class->{col}){$key="yes";last KEYS;} |
|
253
|
|
|
|
|
|
|
} # end loop for keys; |
|
254
|
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
if($class->{date}){ |
|
256
|
|
|
|
|
|
|
my $conv_item=$db->sqldate($db_connections->{$dbname}, $item, $class->{date},$table); |
|
257
|
|
|
|
|
|
|
$item=$conv_item;} |
|
258
|
|
|
|
|
|
|
if(not defined $item){undef @allresults; next NODES;} |
|
259
|
|
|
|
|
|
|
#{undef @allresults; next NODES;} unless (defined $item); |
|
260
|
|
|
|
|
|
|
#print "Col: ",$class->{col}," Val: $item\n"; |
|
261
|
|
|
|
|
|
|
if(!$key){push @allresults, {val=>$item, col=>$class->{col}};} |
|
262
|
|
|
|
|
|
|
if($key){push @allresults, {val=>$item, col=>$class->{col}, key=>$key};} |
|
263
|
|
|
|
|
|
|
if((scalar @allresults) eq (scalar @cols)){ |
|
264
|
|
|
|
|
|
|
my ($tserror, $results)=_runtablesubs($db_connections,$handlers, 'TABLE', 'predb',\@allresults); |
|
265
|
|
|
|
|
|
|
if($tserror){$suberrors.=$tserror;} |
|
266
|
|
|
|
|
|
|
if($results){@allresults=@{$results};} |
|
267
|
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
push @arrayofallinserts, {results=>[@allresults], table=>$table, keys=>\@hashof_thekeys, |
|
270
|
|
|
|
|
|
|
cols=>\@cols, dbname=>$dbname}; |
|
271
|
|
|
|
|
|
|
undef @allresults; |
|
272
|
|
|
|
|
|
|
next NODES; |
|
273
|
|
|
|
|
|
|
} # end if (scalar @allresults eq scalar @thecols) and (scalar @currentkeys) <= 0) |
|
274
|
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
} # end loop CLASSLOOP |
|
276
|
|
|
|
|
|
|
} # end NODES |
|
277
|
|
|
|
|
|
|
} # end BASENODE |
|
278
|
|
|
|
|
|
|
} # end TABLE loop |
|
279
|
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
############################################################################################# |
|
282
|
|
|
|
|
|
|
## we have all of our data organized now we will prepare to run |
|
283
|
|
|
|
|
|
|
## any subs that have been passed to us from the map file and |
|
284
|
|
|
|
|
|
|
## do the database insertion or update |
|
285
|
|
|
|
|
|
|
############################################################################################ |
|
286
|
|
|
|
|
|
|
# we will do this so tah our subs have access to the db |
|
287
|
|
|
|
|
|
|
############################################################################ |
|
288
|
|
|
|
|
|
|
## here we will walk through our extra subroutines listed in the map file### |
|
289
|
|
|
|
|
|
|
############################################################################ |
|
290
|
|
|
|
|
|
|
{no warnings; #warnings are turned off so that we will not get complaints |
|
291
|
|
|
|
|
|
|
# if runsubs returns no value; |
|
292
|
|
|
|
|
|
|
my ($serror, $allinserts)=_runsubs($db_connections,$thesubs, 'predb', \@arrayofallinserts); |
|
293
|
|
|
|
|
|
|
if($allinserts =~ /^ARRAY/){ |
|
294
|
|
|
|
|
|
|
@arrayofallinserts=@{$allinserts}; |
|
295
|
|
|
|
|
|
|
} |
|
296
|
|
|
|
|
|
|
$suberrors.=$serror; |
|
297
|
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
} |
|
299
|
|
|
|
|
|
|
##################################################################### |
|
300
|
|
|
|
|
|
|
## we now run the actual database insertion/update subroutine dosql## |
|
301
|
|
|
|
|
|
|
##################################################################### |
|
302
|
|
|
|
|
|
|
if($dbinfo){ |
|
303
|
|
|
|
|
|
|
my ($response, $error,$load)=$db->DBInsertUpdate(datainfo=>\@arrayofallinserts, dbprint=>$dbprint, |
|
304
|
|
|
|
|
|
|
dbconnections=>$db_connections, dbmode=>$dbmode); |
|
305
|
|
|
|
|
|
|
if($response){$dbmessage.=$response;} |
|
306
|
|
|
|
|
|
|
if($error){ $dberror.=$error;} |
|
307
|
|
|
|
|
|
|
if($load){push @sqlload, $load;} |
|
308
|
|
|
|
|
|
|
} |
|
309
|
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
############################ All Done ############################## |
|
312
|
|
|
|
|
|
|
#&runsubs("postdb",\@subs, \@arrayofallinserts); |
|
313
|
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
#my $olddbh=pop @arrayofallinserts; |
|
315
|
|
|
|
|
|
|
push @everybitofdata, \@arrayofallinserts; |
|
316
|
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
$all_xml->cleanup(); |
|
319
|
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
{no warnings; #warnings are turned off so that we will not get complaints |
|
322
|
|
|
|
|
|
|
# if runsubs returns no value; |
|
323
|
|
|
|
|
|
|
my ($serror, $allinserts)=_runsubs($db_connections,$thesubs, 'postdb', \@everybitofdata); |
|
324
|
|
|
|
|
|
|
$suberrors.=$serror; |
|
325
|
|
|
|
|
|
|
} |
|
326
|
|
|
|
|
|
|
#"We Attempted to Process the XML Document ".(join "\n", @allxmlfiles). |
|
327
|
|
|
|
|
|
|
$message .= |
|
328
|
|
|
|
|
|
|
"\nThe Following XML Document had data suitable for insertion into our database\n". |
|
329
|
|
|
|
|
|
|
(join "\n", @allxmldocs_processed). |
|
330
|
|
|
|
|
|
|
"\n____________________________________________________________\n"; |
|
331
|
|
|
|
|
|
|
#my %stuff=(message=>$message, dbmessage=>$dbmessage, suberrors=>$suberrors,dberrors=>$dberror, sqlload=>[@sqlload]); |
|
332
|
|
|
|
|
|
|
return ($self,{message=>$message, dbmessage=>$dbmessage,suberrors=>$suberrors,dberrors=>$dberror,sqlload=>[@sqlload]}); |
|
333
|
|
|
|
|
|
|
} # end sub processxml; |
|
334
|
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
sub _printsuberror{ |
|
341
|
|
|
|
|
|
|
no warnings; # here incase we do not pass all the vars we are expecting |
|
342
|
|
|
|
|
|
|
my $package=shift; |
|
343
|
|
|
|
|
|
|
my $error=shift; |
|
344
|
|
|
|
|
|
|
my $theerrors= "We had a problem running $package, the error reported was $error\n"; |
|
345
|
|
|
|
|
|
|
return($theerrors); |
|
346
|
|
|
|
|
|
|
} |
|
347
|
|
|
|
|
|
|
|
|
348
|
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
sub _runsubs{ |
|
350
|
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
no warnings; # used to keep any subs from causing warnings. |
|
352
|
|
|
|
|
|
|
# errors actually generated by the subroutine that runsub will be calling |
|
353
|
|
|
|
|
|
|
# are returned by runsubs |
|
354
|
|
|
|
|
|
|
my $thesuberrors; |
|
355
|
|
|
|
|
|
|
#my $self=shift; |
|
356
|
|
|
|
|
|
|
my $db_connections=shift; |
|
357
|
|
|
|
|
|
|
my $insubs=shift; |
|
358
|
|
|
|
|
|
|
my $when=shift; |
|
359
|
|
|
|
|
|
|
my $data=shift; |
|
360
|
|
|
|
|
|
|
my $sub_response=$data; |
|
361
|
|
|
|
|
|
|
if(!$insubs){return;} # chnaged here; |
|
362
|
|
|
|
|
|
|
my %subs=%{$insubs->{$when}}; |
|
363
|
|
|
|
|
|
|
for my $key (sort keys %subs){ |
|
364
|
|
|
|
|
|
|
$data=$sub_response; |
|
365
|
|
|
|
|
|
|
my $handler=$subs{$key}->{name}; |
|
366
|
|
|
|
|
|
|
my $args=$subs{$key}->{args}; |
|
367
|
|
|
|
|
|
|
my $dbname=$subs{$key}->{dbname}; |
|
368
|
|
|
|
|
|
|
my $dbconnect; |
|
369
|
|
|
|
|
|
|
if($dbname){$dbconnect=$db_connections->{$dbname};} |
|
370
|
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
if($handler !~ /^sub/){ |
|
372
|
|
|
|
|
|
|
$handler=~s/>/>/; |
|
373
|
|
|
|
|
|
|
my ($package, $subroutine)=split /\-\>/, $handler; |
|
374
|
|
|
|
|
|
|
my $mod_name=$package.".pm"; |
|
375
|
|
|
|
|
|
|
|
|
376
|
|
|
|
|
|
|
$thesuberrors.=_printsuberror($mod_name, $@) |
|
377
|
|
|
|
|
|
|
unless eval {require $mod_name}; |
|
378
|
|
|
|
|
|
|
$thesuberrors.=_printsuberror("$package->$subroutine",$@) unless |
|
379
|
|
|
|
|
|
|
(eval {$sub_response=$package->$subroutine($args, $data, |
|
380
|
|
|
|
|
|
|
$dbconnect);}); |
|
381
|
|
|
|
|
|
|
} |
|
382
|
|
|
|
|
|
|
|
|
383
|
|
|
|
|
|
|
if($handler=~ /^sub\{/){ |
|
384
|
|
|
|
|
|
|
$handler=~s/\&/\&/g; |
|
385
|
|
|
|
|
|
|
$handler=~s/\"/\"/g; |
|
386
|
|
|
|
|
|
|
my $subroutine=$handler; |
|
387
|
|
|
|
|
|
|
my $sub=eval "$subroutine"; |
|
388
|
|
|
|
|
|
|
$thesuberrors.=_printsuberror($sub, $@) |
|
389
|
|
|
|
|
|
|
unless (eval {$sub_response= &$sub($args, $data, $dbconnect);}); |
|
390
|
|
|
|
|
|
|
} |
|
391
|
|
|
|
|
|
|
|
|
392
|
|
|
|
|
|
|
} |
|
393
|
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
return($thesuberrors, $sub_response); |
|
396
|
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
} |
|
398
|
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
sub _runtablesubs{ |
|
402
|
|
|
|
|
|
|
no warnings; # used to keep any subs from causing warnings. |
|
403
|
|
|
|
|
|
|
# errors actually generated by the subroutine that runtablesub will be calling |
|
404
|
|
|
|
|
|
|
# are returned by runsubs |
|
405
|
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
#my $self=shift; |
|
407
|
|
|
|
|
|
|
my $db_connections=shift; |
|
408
|
|
|
|
|
|
|
my $handlers=shift; |
|
409
|
|
|
|
|
|
|
my $place=shift; |
|
410
|
|
|
|
|
|
|
my $when=shift; |
|
411
|
|
|
|
|
|
|
my $indata=shift; |
|
412
|
|
|
|
|
|
|
my $data=$indata; |
|
413
|
|
|
|
|
|
|
my $subresponse=$data; |
|
414
|
|
|
|
|
|
|
my $suberrors; |
|
415
|
|
|
|
|
|
|
if($handlers->{$place}){ |
|
416
|
|
|
|
|
|
|
HANDLERS: |
|
417
|
|
|
|
|
|
|
for my $key (sort keys %{$handlers->{$place}->{$when}}){ |
|
418
|
|
|
|
|
|
|
if($subresponse){$data=$subresponse;} |
|
419
|
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
my $sub; |
|
421
|
|
|
|
|
|
|
my $handler=$handlers->{$place}->{$when}->{$key}->{handler}; |
|
422
|
|
|
|
|
|
|
if($handler !~ /^sub/){ |
|
423
|
|
|
|
|
|
|
$handler=~s/>/>/; |
|
424
|
|
|
|
|
|
|
my ($package, $subroutine)=split /\-\>/, $handler; |
|
425
|
|
|
|
|
|
|
my $mod_name=$package.".pm"; |
|
426
|
|
|
|
|
|
|
$suberrors.=_printsuberror($mod_name, $@) unless eval {require $mod_name}; |
|
427
|
|
|
|
|
|
|
$suberrors.=_printsuberror("$package->$subroutine", $@) unless (eval |
|
428
|
|
|
|
|
|
|
{$subresponse=$package->$subroutine($handlers->{$place}->{$when}->{$key}->{args},$db_connections->{$handlers->{$place}->{$when}->{$key}->{dbname}},$data)}); |
|
429
|
|
|
|
|
|
|
} |
|
430
|
|
|
|
|
|
|
if($handler=~ /^sub\{/){ |
|
431
|
|
|
|
|
|
|
$handler=~s/\&/\&/g; |
|
432
|
|
|
|
|
|
|
$handler=~s/\"/\"/g; |
|
433
|
|
|
|
|
|
|
my $subroutine=$handler; |
|
434
|
|
|
|
|
|
|
$sub=eval "$subroutine"; |
|
435
|
|
|
|
|
|
|
$suberrors.=_printsuberror($sub, $@) unless |
|
436
|
|
|
|
|
|
|
(eval |
|
437
|
|
|
|
|
|
|
{$subresponse=&$sub($handlers->{$place}->{$when}->{$key}->{args},$db_connections->{$handlers->{$place}->{$when}->{$key}->{dbname}},$data)}); |
|
438
|
|
|
|
|
|
|
if(!$subresponse){$subresponse=$data;} |
|
439
|
|
|
|
|
|
|
} |
|
440
|
|
|
|
|
|
|
|
|
441
|
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
} # end loop HANDLERS |
|
443
|
|
|
|
|
|
|
} # if handlers |
|
444
|
|
|
|
|
|
|
if(!$subresponse){$subresponse=$data;} |
|
445
|
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
return($suberrors,$subresponse); |
|
447
|
|
|
|
|
|
|
################# |
|
448
|
|
|
|
|
|
|
} # end sub _runtablesubs |
|
449
|
|
|
|
|
|
|
####################### |
|
450
|
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
1; |
|
452
|
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
__END__ |