| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | ##@@JCL.pm,dbixlib | 
| 2 |  |  |  |  |  |  | ##$$Job Control Library for Data Management Tasks | 
| 3 |  |  |  |  |  |  | ##author:Brad Adkins | 
| 4 |  |  |  |  |  |  | ##format:codehtml | 
| 5 |  |  |  |  |  |  | ##outfile:JCL.html | 
| 6 |  |  |  |  |  |  | ##title:Job Control Library | 
| 7 |  |  |  |  |  |  | ##toc:yes | 
| 8 |  |  |  |  |  |  | ##header: DBIx-JCL | 
| 9 |  |  |  |  |  |  |  | 
| 10 |  |  |  |  |  |  | =head1 NAME | 
| 11 |  |  |  |  |  |  |  | 
| 12 |  |  |  |  |  |  | DBIx::JCL - Job Control Library for database load tasks. | 
| 13 |  |  |  |  |  |  |  | 
| 14 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 15 |  |  |  |  |  |  |  | 
| 16 |  |  |  |  |  |  | # file: test_job.pl | 
| 17 |  |  |  |  |  |  | use strict; | 
| 18 |  |  |  |  |  |  | use warnings; | 
| 19 |  |  |  |  |  |  | use DBIx::JCL qw( :all ); | 
| 20 |  |  |  |  |  |  |  | 
| 21 |  |  |  |  |  |  | my $jobname = 'name_of_job'; | 
| 22 |  |  |  |  |  |  | sys_init( $jobname ); | 
| 23 |  |  |  |  |  |  |  | 
| 24 |  |  |  |  |  |  | # perform database tasks calling DBIx-JCL functions | 
| 25 |  |  |  |  |  |  | # ... | 
| 26 |  |  |  |  |  |  |  | 
| 27 |  |  |  |  |  |  | sys_end(); | 
| 28 |  |  |  |  |  |  | exit sys_get_errorlevel(); | 
| 29 |  |  |  |  |  |  |  | 
| 30 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 31 |  |  |  |  |  |  |  | 
| 32 |  |  |  |  |  |  | This documentation describes the perl module DBIx-JCL.pm and the use of | 
| 33 |  |  |  |  |  |  | standardized perl scripts which together provide a common job execution | 
| 34 |  |  |  |  |  |  | environment to support database backend load and maintenance tasks. | 
| 35 |  |  |  |  |  |  |  | 
| 36 |  |  |  |  |  |  | =head1 RATIONALE | 
| 37 |  |  |  |  |  |  |  | 
| 38 |  |  |  |  |  |  | Provide a suite of standard functions that can be shared across all batch | 
| 39 |  |  |  |  |  |  | job scripts used to support database back end tasks. Provide a standardized | 
| 40 |  |  |  |  |  |  | approach for the development of all back end database job scripts. | 
| 41 |  |  |  |  |  |  | Centralize the administration and access to configuration data. Enforce | 
| 42 |  |  |  |  |  |  | coding standards and documentation. Abstract the sql used to support back | 
| 43 |  |  |  |  |  |  | end processes from the task processing logic, by placing all sqlinto an sql | 
| 44 |  |  |  |  |  |  | library. This will make maintenance of back end sql a trivial task. Provide | 
| 45 |  |  |  |  |  |  | generalized logging, notification, and system information functions. | 
| 46 |  |  |  |  |  |  |  | 
| 47 |  |  |  |  |  |  | If you want to write a robust database extract and load job with complete | 
| 48 |  |  |  |  |  |  | support for logging and error notification, and do it in 25 lines of code, | 
| 49 |  |  |  |  |  |  | read on. | 
| 50 |  |  |  |  |  |  |  | 
| 51 |  |  |  |  |  |  | =head1 OPTIONS | 
| 52 |  |  |  |  |  |  |  | 
| 53 |  |  |  |  |  |  | Database maintenance and load jobs written using DBIx-JCL support the following | 
| 54 |  |  |  |  |  |  | options out-of-the-box, with no additional work required on your part. | 
| 55 |  |  |  |  |  |  |  | 
| 56 |  |  |  |  |  |  | Job Options: | 
| 57 |  |  |  |  |  |  |  | 
| 58 |  |  |  |  |  |  | | -r   | Run job | 
| 59 |  |  |  |  |  |  | | -rb  | Run job in the background | 
| 60 |  |  |  |  |  |  | | -rs  | Run job at requested start time | 
| 61 |  |  |  |  |  |  | | -rr  | Restart job after failure | 
| 62 |  |  |  |  |  |  | | -rde | Run using specified DE number | 
| 63 |  |  |  |  |  |  | | -x   | Pass extra parameters to job script | 
| 64 |  |  |  |  |  |  | | -c   | Specify database connections | 
| 65 |  |  |  |  |  |  | | -v   | Verbose | 
| 66 |  |  |  |  |  |  | | -vv  | Very Verbose | 
| 67 |  |  |  |  |  |  | | -ng  | No greeting | 
| 68 |  |  |  |  |  |  | | -tc  | Test database connections | 
| 69 |  |  |  |  |  |  |  | 
| 70 |  |  |  |  |  |  | Logging Options: | 
| 71 |  |  |  |  |  |  |  | 
| 72 |  |  |  |  |  |  | | -lf  | Log filename | 
| 73 |  |  |  |  |  |  | | -lg  | Log generations | 
| 74 |  |  |  |  |  |  | | -ll  | Log log levels | 
| 75 |  |  |  |  |  |  | | -lp  | Log file prefix | 
| 76 |  |  |  |  |  |  | | -lr  | Log archive file radix | 
| 77 |  |  |  |  |  |  | | -cl  | Log console levels | 
| 78 |  |  |  |  |  |  |  | 
| 79 |  |  |  |  |  |  | Notificaiton Options: | 
| 80 |  |  |  |  |  |  |  | 
| 81 |  |  |  |  |  |  | | -ne  | Notify email on completion | 
| 82 |  |  |  |  |  |  | | -np  | Notify pager on completion | 
| 83 |  |  |  |  |  |  | | -et  | Email notification to list | 
| 84 |  |  |  |  |  |  | | -el  | Email notification levels | 
| 85 |  |  |  |  |  |  | | -pt  | Pager notification to list | 
| 86 |  |  |  |  |  |  | | -pl  | Pager notification levels | 
| 87 |  |  |  |  |  |  |  | 
| 88 |  |  |  |  |  |  | Information Options: | 
| 89 |  |  |  |  |  |  |  | 
| 90 |  |  |  |  |  |  | | -dp  | Display job parameters | 
| 91 |  |  |  |  |  |  | | -dq  | Display job querys | 
| 92 |  |  |  |  |  |  | | -dd  | Display job documentation | 
| 93 |  |  |  |  |  |  | | -dl  | Display last log file | 
| 94 |  |  |  |  |  |  | | -da  | Display archived log files | 
| 95 |  |  |  |  |  |  | | -dj  | Display a list of job scripts | 
| 96 |  |  |  |  |  |  | | -dja | Diaplay jobs active in the system | 
| 97 |  |  |  |  |  |  |  | 
| 98 |  |  |  |  |  |  | Utility Options: | 
| 99 |  |  |  |  |  |  |  | 
| 100 |  |  |  |  |  |  | | -se  | Send email message | 
| 101 |  |  |  |  |  |  | | -sp  | Send pager message | 
| 102 |  |  |  |  |  |  | | -um  | Util no move files | 
| 103 |  |  |  |  |  |  | | -h   | Help | 
| 104 |  |  |  |  |  |  | | -ha  | Help on option arguments | 
| 105 |  |  |  |  |  |  |  | 
| 106 |  |  |  |  |  |  | Please see L below. | 
| 107 |  |  |  |  |  |  |  | 
| 108 |  |  |  |  |  |  | =head1 CAPABILITIES | 
| 109 |  |  |  |  |  |  |  | 
| 110 |  |  |  |  |  |  | The DBIx-JCL modules provides many capabilities commonly needed in support of | 
| 111 |  |  |  |  |  |  | database maintenance jobs designed to run in a production environment. Below | 
| 112 |  |  |  |  |  |  | is a summary list of features and the types of functions provided to support | 
| 113 |  |  |  |  |  |  | those features. | 
| 114 |  |  |  |  |  |  |  | 
| 115 |  |  |  |  |  |  | =head2 Features | 
| 116 |  |  |  |  |  |  |  | 
| 117 |  |  |  |  |  |  | The following features have been designed in to the DBIx-JCL module: | 
| 118 |  |  |  |  |  |  |  | 
| 119 |  |  |  |  |  |  | =over 4 | 
| 120 |  |  |  |  |  |  |  | 
| 121 |  |  |  |  |  |  | =item * Logging support with log file rotation | 
| 122 |  |  |  |  |  |  |  | 
| 123 |  |  |  |  |  |  | =item * Notification support | 
| 124 |  |  |  |  |  |  |  | 
| 125 |  |  |  |  |  |  | =item * Simplified DBI interface | 
| 126 |  |  |  |  |  |  |  | 
| 127 |  |  |  |  |  |  | =item * Configuration data stored externally | 
| 128 |  |  |  |  |  |  |  | 
| 129 |  |  |  |  |  |  | =item * High level functions not available in the DBI | 
| 130 |  |  |  |  |  |  |  | 
| 131 |  |  |  |  |  |  | =item * SQL stored in "SQL books" | 
| 132 |  |  |  |  |  |  |  | 
| 133 |  |  |  |  |  |  | =item * Job documentation enforced | 
| 134 |  |  |  |  |  |  |  | 
| 135 |  |  |  |  |  |  | =item * Job control functions | 
| 136 |  |  |  |  |  |  |  | 
| 137 |  |  |  |  |  |  | =item * Plugin support | 
| 138 |  |  |  |  |  |  |  | 
| 139 |  |  |  |  |  |  | =back | 
| 140 |  |  |  |  |  |  |  | 
| 141 |  |  |  |  |  |  | =head2 Implementation | 
| 142 |  |  |  |  |  |  |  | 
| 143 |  |  |  |  |  |  | The features listed above have been implemented by providing [many] functions | 
| 144 |  |  |  |  |  |  | for use by your database mantenance jobs: | 
| 145 |  |  |  |  |  |  |  | 
| 146 |  |  |  |  |  |  | =over 4 | 
| 147 |  |  |  |  |  |  |  | 
| 148 |  |  |  |  |  |  | =item * Functions for command line interaction | 
| 149 |  |  |  |  |  |  |  | 
| 150 |  |  |  |  |  |  | =item * Functions for initialization, monitoring, and control | 
| 151 |  |  |  |  |  |  |  | 
| 152 |  |  |  |  |  |  | =item * Functions for database interaction | 
| 153 |  |  |  |  |  |  |  | 
| 154 |  |  |  |  |  |  | =item * Functions for log file access and maintenance | 
| 155 |  |  |  |  |  |  |  | 
| 156 |  |  |  |  |  |  | =item * Functions for file manipulation | 
| 157 |  |  |  |  |  |  |  | 
| 158 |  |  |  |  |  |  | =back | 
| 159 |  |  |  |  |  |  |  | 
| 160 |  |  |  |  |  |  | Please see L below. | 
| 161 |  |  |  |  |  |  |  | 
| 162 |  |  |  |  |  |  | =head1 EXAMPLE JOB | 
| 163 |  |  |  |  |  |  |  | 
| 164 |  |  |  |  |  |  | Shown below is the standard approach to writing job scripts. | 
| 165 |  |  |  |  |  |  |  | 
| 166 |  |  |  |  |  |  | ##@@name_of_script.pl,bin | 
| 167 |  |  |  |  |  |  | ##$$Description of this job | 
| 168 |  |  |  |  |  |  |  | 
| 169 |  |  |  |  |  |  | use strict; | 
| 170 |  |  |  |  |  |  | use warnings; | 
| 171 |  |  |  |  |  |  | use DBIx::JCL qw( :all ); | 
| 172 |  |  |  |  |  |  |  | 
| 173 |  |  |  |  |  |  | # initialize | 
| 174 |  |  |  |  |  |  | # ------------------------------------------------------------------------- | 
| 175 |  |  |  |  |  |  |  | 
| 176 |  |  |  |  |  |  | my $jobname = 'name_of_script'; | 
| 177 |  |  |  |  |  |  | sys_init( $jobname ); | 
| 178 |  |  |  |  |  |  |  | 
| 179 |  |  |  |  |  |  | my $dbenv1 = 'mydb1'; | 
| 180 |  |  |  |  |  |  | my $mysql1 = sys_get_sql( 'query_number_1' ); | 
| 181 |  |  |  |  |  |  |  | 
| 182 |  |  |  |  |  |  | # main | 
| 183 |  |  |  |  |  |  | # ------------------------------------------------------------------------- | 
| 184 |  |  |  |  |  |  |  | 
| 185 |  |  |  |  |  |  | log_info( sys_get_dbdescr( $dbenv1 ) ); | 
| 186 |  |  |  |  |  |  | db_connect( $dbenv1 ); | 
| 187 |  |  |  |  |  |  |  | 
| 188 |  |  |  |  |  |  | # do more db stuff here | 
| 189 |  |  |  |  |  |  |  | 
| 190 |  |  |  |  |  |  | # end | 
| 191 |  |  |  |  |  |  | # ------------------------------------------------------------------------- | 
| 192 |  |  |  |  |  |  |  | 
| 193 |  |  |  |  |  |  | =begin wiki | 
| 194 |  |  |  |  |  |  |  | 
| 195 |  |  |  |  |  |  | !1 NAME | 
| 196 |  |  |  |  |  |  |  | 
| 197 |  |  |  |  |  |  | Name of script | 
| 198 |  |  |  |  |  |  |  | 
| 199 |  |  |  |  |  |  | ---- | 
| 200 |  |  |  |  |  |  |  | 
| 201 |  |  |  |  |  |  | !1 DESCRIPTION | 
| 202 |  |  |  |  |  |  |  | 
| 203 |  |  |  |  |  |  | Describe the job script here. | 
| 204 |  |  |  |  |  |  |  | 
| 205 |  |  |  |  |  |  | ---- | 
| 206 |  |  |  |  |  |  |  | 
| 207 |  |  |  |  |  |  | !1 RECOVERY NOTES | 
| 208 |  |  |  |  |  |  |  | 
| 209 |  |  |  |  |  |  | Document recovery notes here. | 
| 210 |  |  |  |  |  |  |  | 
| 211 |  |  |  |  |  |  | ---- | 
| 212 |  |  |  |  |  |  |  | 
| 213 |  |  |  |  |  |  | !1 DEPENDENCIES | 
| 214 |  |  |  |  |  |  |  | 
| 215 |  |  |  |  |  |  | Document dependencies here. | 
| 216 |  |  |  |  |  |  |  | 
| 217 |  |  |  |  |  |  | =cut | 
| 218 |  |  |  |  |  |  |  | 
| 219 |  |  |  |  |  |  | __END__ | 
| 220 |  |  |  |  |  |  |  | 
| 221 |  |  |  |  |  |  | Please see L below. | 
| 222 |  |  |  |  |  |  |  | 
| 223 |  |  |  |  |  |  | =head1 ADDITIONAL INFORMATION | 
| 224 |  |  |  |  |  |  |  | 
| 225 |  |  |  |  |  |  | Please see the documentation embedded in this source file for [LOTS!] of | 
| 226 |  |  |  |  |  |  | additional details on how to use JCL.pm. You can view this documentation using | 
| 227 |  |  |  |  |  |  | WikiText.pm module to format the WikiText content in this file. Hint: download | 
| 228 |  |  |  |  |  |  | and install WikiText.pm. | 
| 229 |  |  |  |  |  |  |  | 
| 230 |  |  |  |  |  |  | Thank you! | 
| 231 |  |  |  |  |  |  |  | 
| 232 |  |  |  |  |  |  | =head1 COPYRIGHT | 
| 233 |  |  |  |  |  |  |  | 
| 234 |  |  |  |  |  |  | Copyright 2008 Brad Adkins . | 
| 235 |  |  |  |  |  |  |  | 
| 236 |  |  |  |  |  |  | Permission is granted to copy, distribute and/or modify this document under the | 
| 237 |  |  |  |  |  |  | terms of the GNU Free Documentation License, published by the Free Software | 
| 238 |  |  |  |  |  |  | Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no | 
| 239 |  |  |  |  |  |  | Back-Cover Texts. | 
| 240 |  |  |  |  |  |  |  | 
| 241 |  |  |  |  |  |  | =head1 AUTHOR | 
| 242 |  |  |  |  |  |  |  | 
| 243 |  |  |  |  |  |  | Brad Adkins, dbijcl@gmail.com | 
| 244 |  |  |  |  |  |  |  | 
| 245 |  |  |  |  |  |  | =cut | 
| 246 |  |  |  |  |  |  |  | 
| 247 |  |  |  |  |  |  | =begin wiki | 
| 248 |  |  |  |  |  |  |  | 
| 249 |  |  |  |  |  |  | !1 Name | 
| 250 |  |  |  |  |  |  |  | 
| 251 |  |  |  |  |  |  | DBIx-JCL - Job Control Library for database load tasks. | 
| 252 |  |  |  |  |  |  |  | 
| 253 |  |  |  |  |  |  | ---- | 
| 254 |  |  |  |  |  |  |  | 
| 255 |  |  |  |  |  |  | !1 Description | 
| 256 |  |  |  |  |  |  |  | 
| 257 |  |  |  |  |  |  | This documentation describes the perl module DBIx::JCL.pm and the use of \ | 
| 258 |  |  |  |  |  |  | standardized perl scripts which together provide a common job execution \ | 
| 259 |  |  |  |  |  |  | environment to support database backend maintenance. | 
| 260 |  |  |  |  |  |  |  | 
| 261 |  |  |  |  |  |  | ---- | 
| 262 |  |  |  |  |  |  |  | 
| 263 |  |  |  |  |  |  | !1 Synopsis | 
| 264 |  |  |  |  |  |  |  | 
| 265 |  |  |  |  |  |  | % language=Perl | 
| 266 |  |  |  |  |  |  | % # file: test_job.pl | 
| 267 |  |  |  |  |  |  | % use strict; | 
| 268 |  |  |  |  |  |  | % use warnings; | 
| 269 |  |  |  |  |  |  | % use DBIx::JCL qw( :all ); | 
| 270 |  |  |  |  |  |  | % | 
| 271 |  |  |  |  |  |  | % my $jobname = 'name_of_job'; | 
| 272 |  |  |  |  |  |  | % sys_init( $jobname ); | 
| 273 |  |  |  |  |  |  | % | 
| 274 |  |  |  |  |  |  | % # perform database tasks | 
| 275 |  |  |  |  |  |  | % | 
| 276 |  |  |  |  |  |  | % sys_end(); | 
| 277 |  |  |  |  |  |  | % exit sys_get_errorlevel(); | 
| 278 |  |  |  |  |  |  | %% | 
| 279 |  |  |  |  |  |  |  | 
| 280 |  |  |  |  |  |  | For a file named %test_job.pl% the %$jobname% would normally be simply \ | 
| 281 |  |  |  |  |  |  | %test_job%. | 
| 282 |  |  |  |  |  |  |  | 
| 283 |  |  |  |  |  |  | ---- | 
| 284 |  |  |  |  |  |  |  | 
| 285 |  |  |  |  |  |  | !1 Options | 
| 286 |  |  |  |  |  |  |  | 
| 287 |  |  |  |  |  |  | Job Options: | 
| 288 |  |  |  |  |  |  |  | 
| 289 |  |  |  |  |  |  | | -r   | Run job| | 
| 290 |  |  |  |  |  |  | | -rb  | Run job in the background| | 
| 291 |  |  |  |  |  |  | | -rs  | Run job at requested start time| | 
| 292 |  |  |  |  |  |  | | -rr  | Restart job after failure| | 
| 293 |  |  |  |  |  |  | | -rde | Run using specified DE number| | 
| 294 |  |  |  |  |  |  | | -x   | Pass extra parameters to job script| | 
| 295 |  |  |  |  |  |  | | -c   | Specify database connections| | 
| 296 |  |  |  |  |  |  | | -v   | Verbose| | 
| 297 |  |  |  |  |  |  | | -vv  | Very Verbose| | 
| 298 |  |  |  |  |  |  | | -ng  | No greeting| | 
| 299 |  |  |  |  |  |  | | -tc  | Test database connections| | 
| 300 |  |  |  |  |  |  |  | 
| 301 |  |  |  |  |  |  | Logging Options: | 
| 302 |  |  |  |  |  |  |  | 
| 303 |  |  |  |  |  |  | | -lf  | Log filename| | 
| 304 |  |  |  |  |  |  | | -lg  | Log generations| | 
| 305 |  |  |  |  |  |  | | -ll  | Log log levels| | 
| 306 |  |  |  |  |  |  | | -lp  | Log file prefix| | 
| 307 |  |  |  |  |  |  | | -lr  | Log archive file radix| | 
| 308 |  |  |  |  |  |  | | -cl  | Log console levels| | 
| 309 |  |  |  |  |  |  |  | 
| 310 |  |  |  |  |  |  | Notificaiton Options: | 
| 311 |  |  |  |  |  |  |  | 
| 312 |  |  |  |  |  |  | | -ne  | Notify email on completion| | 
| 313 |  |  |  |  |  |  | | -np  | Notify pager on completion| | 
| 314 |  |  |  |  |  |  | | -et  | Email notification to list| | 
| 315 |  |  |  |  |  |  | | -el  | Email notification levels| | 
| 316 |  |  |  |  |  |  | | -pt  | Pager notification to list| | 
| 317 |  |  |  |  |  |  | | -pl  | Pager notification levels| | 
| 318 |  |  |  |  |  |  |  | 
| 319 |  |  |  |  |  |  | Information Options: | 
| 320 |  |  |  |  |  |  |  | 
| 321 |  |  |  |  |  |  | | -dp  | Display job parameters| | 
| 322 |  |  |  |  |  |  | | -dq  | Display job querys| | 
| 323 |  |  |  |  |  |  | | -dd  | Display job documentation| | 
| 324 |  |  |  |  |  |  | | -dl  | Display last log file| | 
| 325 |  |  |  |  |  |  | | -da  | Display archived log files| | 
| 326 |  |  |  |  |  |  | | -dj  | Display a list of job scripts| | 
| 327 |  |  |  |  |  |  | | -dja | Diaplay jobs active in the system| | 
| 328 |  |  |  |  |  |  |  | 
| 329 |  |  |  |  |  |  | Utility Options: | 
| 330 |  |  |  |  |  |  |  | 
| 331 |  |  |  |  |  |  | | -se  | Send email message| | 
| 332 |  |  |  |  |  |  | | -sp  | Send pager message| | 
| 333 |  |  |  |  |  |  | | -um  | Util no move files| | 
| 334 |  |  |  |  |  |  | | -h   | Help| | 
| 335 |  |  |  |  |  |  | | -ha  | Help on option arguments| | 
| 336 |  |  |  |  |  |  |  | 
| 337 |  |  |  |  |  |  | ---- | 
| 338 |  |  |  |  |  |  |  | 
| 339 |  |  |  |  |  |  | !1 Arguments | 
| 340 |  |  |  |  |  |  |  | 
| 341 |  |  |  |  |  |  | Job Params: | 
| 342 |  |  |  |  |  |  |  | 
| 343 |  |  |  |  |  |  | | -r   | (on/off)| | 
| 344 |  |  |  |  |  |  | | -rb  | (on/off)| | 
| 345 |  |  |  |  |  |  | | -rs  | starttime    Example: 17:30| | 
| 346 |  |  |  |  |  |  | | -rr  | jobstep      Example: 3| | 
| 347 |  |  |  |  |  |  | | -rde | denumber     Example: 64753| | 
| 348 |  |  |  |  |  |  | | -x   | extra params Example: -x="a=1 b=2 c=3"| | 
| 349 |  |  |  |  |  |  | | -c   | connectdef   Example: mydb:myinst| | 
| 350 |  |  |  |  |  |  | | -v   | (on/off)| | 
| 351 |  |  |  |  |  |  | | -vv  | (on/off)| | 
| 352 |  |  |  |  |  |  | | -ng  | (on/off)| | 
| 353 |  |  |  |  |  |  | | -tc  | connectdef   Example: mydb:myinst| | 
| 354 |  |  |  |  |  |  |  | 
| 355 |  |  |  |  |  |  | Logging Params: | 
| 356 |  |  |  |  |  |  |  | 
| 357 |  |  |  |  |  |  | | -lf  | filename     Example: mylog.log| | 
| 358 |  |  |  |  |  |  | | -lg  | numgdg       Example: 10| | 
| 359 |  |  |  |  |  |  | | -ll  | loglevels    Example: FATAL,ERROR,WARN or WARN| | 
| 360 |  |  |  |  |  |  | | -lp  | logprefix    Example: pre_| | 
| 361 |  |  |  |  |  |  | | -lr  | logradix     Example: 3| | 
| 362 |  |  |  |  |  |  | | -cl  | loglevels    Example: FATAL,ERROR,WARN,INFO,DEBUG or DEBUG| | 
| 363 |  |  |  |  |  |  |  | 
| 364 |  |  |  |  |  |  | Notificaiton Params: | 
| 365 |  |  |  |  |  |  |  | 
| 366 |  |  |  |  |  |  | | -ne  | (on/off)| | 
| 367 |  |  |  |  |  |  | | -np  | (on/off)| | 
| 368 |  |  |  |  |  |  | | -et  | addrlist       Example: me@myhost.com,you@myhost.com| | 
| 369 |  |  |  |  |  |  | | -el  | levels         Example: FATAL,ERROR,WARN| | 
| 370 |  |  |  |  |  |  | | -pt  | addrlist       Example: me@myhost.com,you@myhost.com| | 
| 371 |  |  |  |  |  |  | | -pl  | levels         Example: FATAL,ERROR,WARN| | 
| 372 |  |  |  |  |  |  |  | 
| 373 |  |  |  |  |  |  | Information Params: | 
| 374 |  |  |  |  |  |  |  | 
| 375 |  |  |  |  |  |  | | -dp  | (on/off)| | 
| 376 |  |  |  |  |  |  | | -dq  | (on/off)| | 
| 377 |  |  |  |  |  |  | | -dd  | (on/off)| | 
| 378 |  |  |  |  |  |  | | -dl  | (on/off)| | 
| 379 |  |  |  |  |  |  | | -da  | (on/off)| | 
| 380 |  |  |  |  |  |  | | -dj  | (on/off)| | 
| 381 |  |  |  |  |  |  | | -dja | (on/off)| | 
| 382 |  |  |  |  |  |  |  | 
| 383 |  |  |  |  |  |  | Utility Params: | 
| 384 |  |  |  |  |  |  |  | 
| 385 |  |  |  |  |  |  | | -se  | addrlist:msg   Example: "me@myhost.com~Message text"| | 
| 386 |  |  |  |  |  |  | | -sp  | addrlist:msg   Example: "me@myhost.com~Message text"| | 
| 387 |  |  |  |  |  |  | | -um  | (on/off)| | 
| 388 |  |  |  |  |  |  | | -h   | (on/off)| | 
| 389 |  |  |  |  |  |  | | -ha  | (on/off)| | 
| 390 |  |  |  |  |  |  |  | 
| 391 |  |  |  |  |  |  | ---- | 
| 392 |  |  |  |  |  |  |  | 
| 393 |  |  |  |  |  |  | !1 Rationale | 
| 394 |  |  |  |  |  |  |  | 
| 395 |  |  |  |  |  |  | Provide a suite of standard functions that can be shared across all batch \ | 
| 396 |  |  |  |  |  |  | job scripts used to support database back end tasks. Provide a standardized \ | 
| 397 |  |  |  |  |  |  | approach for the development of all back end database job scripts. \ | 
| 398 |  |  |  |  |  |  | Centralize the administration and access to configuration data. Enforce \ | 
| 399 |  |  |  |  |  |  | coding standards and documentation. Abstract the sql used to support back \ | 
| 400 |  |  |  |  |  |  | end processes from the task processing logic, by placing all sqlinto an sql \ | 
| 401 |  |  |  |  |  |  | library. This will make maintenance of back end sql a trivial task. Provide \ | 
| 402 |  |  |  |  |  |  | generalized logging, notification, and system information functions. | 
| 403 |  |  |  |  |  |  |  | 
| 404 |  |  |  |  |  |  | If you want to write a robust database extract and load job with complete \ | 
| 405 |  |  |  |  |  |  | support for logging and error notification, and do it in 25 lines of code, \ | 
| 406 |  |  |  |  |  |  | read on. | 
| 407 |  |  |  |  |  |  |  | 
| 408 |  |  |  |  |  |  | ---- | 
| 409 |  |  |  |  |  |  |  | 
| 410 |  |  |  |  |  |  | !1 Capabilities | 
| 411 |  |  |  |  |  |  |  | 
| 412 |  |  |  |  |  |  | Some of the capabilities provided by DBIx-JCL are: System initialization, \ | 
| 413 |  |  |  |  |  |  | variables for system-wide use, configuration file interface support, \ | 
| 414 |  |  |  |  |  |  | command line processing support, command line help interface, sql library \ | 
| 415 |  |  |  |  |  |  | interface, system documentation in pod form, handy information display \ | 
| 416 |  |  |  |  |  |  | routines, source filtering for quality control, database connection and \ | 
| 417 |  |  |  |  |  |  | sql processing, log file access and managment, email and pager notification, \ | 
| 418 |  |  |  |  |  |  | general file access routines, and a generic plugin interface. | 
| 419 |  |  |  |  |  |  |  | 
| 420 |  |  |  |  |  |  | ---- | 
| 421 |  |  |  |  |  |  |  | 
| 422 |  |  |  |  |  |  | !1 Configuration And Environment | 
| 423 |  |  |  |  |  |  |  | 
| 424 |  |  |  |  |  |  | Configuration is provided using an enhanced version of ini style \ | 
| 425 |  |  |  |  |  |  | configuration files. The big difference between the conf files used and \ | 
| 426 |  |  |  |  |  |  | ini files is that the conf files support here document syntax. This makes \ | 
| 427 |  |  |  |  |  |  | storing sql querys a trivial task. Several configuration files are used, \ | 
| 428 |  |  |  |  |  |  | these are described individually below. | 
| 429 |  |  |  |  |  |  |  | 
| 430 |  |  |  |  |  |  | !2 Environments | 
| 431 |  |  |  |  |  |  |  | 
| 432 |  |  |  |  |  |  | DBIx-JCL can support multiple database environments over multiple file \ | 
| 433 |  |  |  |  |  |  | systems, with attachments to any number of remote databases. An environment \ | 
| 434 |  |  |  |  |  |  | is actually a combination of file system and database instance. Remote \ | 
| 435 |  |  |  |  |  |  | databases and local databases can also be specified on the command line. \ | 
| 436 |  |  |  |  |  |  | The example conf files define the database environments shown in the \ | 
| 437 |  |  |  |  |  |  | diagram below. | 
| 438 |  |  |  |  |  |  |  | 
| 439 |  |  |  |  |  |  | On each local server, the default combination of database/instance is \ | 
| 440 |  |  |  |  |  |  | identified by an environment variable (shown in square brackets). The name \ | 
| 441 |  |  |  |  |  |  | of the environment variable is stored in the C file. | 
| 442 |  |  |  |  |  |  |  | 
| 443 |  |  |  |  |  |  | % language=Ini_Files | 
| 444 |  |  |  |  |  |  | % (-------------------------------------+------------------------------------) | 
| 445 |  |  |  |  |  |  | %                 LOCAL                 |               REMOTE | 
| 446 |  |  |  |  |  |  | % (-------------------------------------+------------------------------------) | 
| 447 |  |  |  |  |  |  | %                                       | | 
| 448 |  |  |  |  |  |  | %   .------------.     .------------.   |       .------------. | 
| 449 |  |  |  |  |  |  | %   | Server 1   |--.--| mydb2/dev1 |-->|   .-->| mydb1/frz  | | 
| 450 |  |  |  |  |  |  | %   '------------'  |  `------------'   |   |   '------------' | 
| 451 |  |  |  |  |  |  | %                   |     [mydev1]      |   | | 
| 452 |  |  |  |  |  |  | %                   |                   |   | | 
| 453 |  |  |  |  |  |  | %                   |  .------------.   |   |   .------------. | 
| 454 |  |  |  |  |  |  | %                   |--| mydb2/dev2 |-->|   +-->| mydb1/prd  | | 
| 455 |  |  |  |  |  |  | %                   |  '------------'   |   |   '------------' | 
| 456 |  |  |  |  |  |  | %                   |     [mydev2]      |   | | 
| 457 |  |  |  |  |  |  | %                   |                   |   | | 
| 458 |  |  |  |  |  |  | %                   |  .------------.   |   |   .------------. | 
| 459 |  |  |  |  |  |  | %                   +--| mydb2/int  |-->|   +-->| mydb3/dev  | | 
| 460 |  |  |  |  |  |  | %                      '------------'   |   |   '------------' | 
| 461 |  |  |  |  |  |  | %                         [myint]       |---+ | 
| 462 |  |  |  |  |  |  | %                                       |   | | 
| 463 |  |  |  |  |  |  | %   .------------.     .------------.   |   |   .------------. | 
| 464 |  |  |  |  |  |  | %   | Server 2   |-----| mydb2/frz  |-->|   +-->| mydb3/int  | | 
| 465 |  |  |  |  |  |  | %   '------------'     '------------'   |   |   '------------' | 
| 466 |  |  |  |  |  |  | %                         [myfrz]       |   | | 
| 467 |  |  |  |  |  |  | %                                       |   | | 
| 468 |  |  |  |  |  |  | %   .------------.     .------------.   |   |   .------------. | 
| 469 |  |  |  |  |  |  | %   | Server 3   |-----| mydb2/prd  |-->|   +-->| mydb3/sys  | | 
| 470 |  |  |  |  |  |  | %   '------------'     '------------'   |   |   '------------' | 
| 471 |  |  |  |  |  |  | %                         [myprd]       |   | | 
| 472 |  |  |  |  |  |  | %                                       |   | | 
| 473 |  |  |  |  |  |  | %                                       |   |   +------------. | 
| 474 |  |  |  |  |  |  | %                                       |   +-->| mydb3/prd  | | 
| 475 |  |  |  |  |  |  | %                                       |       '------------' | 
| 476 |  |  |  |  |  |  | %    Key                                | | 
| 477 |  |  |  |  |  |  | %   (-----------------------------)     | | 
| 478 |  |  |  |  |  |  | %    dev  - development region          | | 
| 479 |  |  |  |  |  |  | %    dev1 - development region          | | 
| 480 |  |  |  |  |  |  | %    dev2 - development region          | | 
| 481 |  |  |  |  |  |  | %    int  - integration test region     | | 
| 482 |  |  |  |  |  |  | %    frz  - system test region          | | 
| 483 |  |  |  |  |  |  | %    sys  - system test region          | | 
| 484 |  |  |  |  |  |  | %    prd  - production region           | | 
| 485 |  |  |  |  |  |  | %   (-----------------------------)     | | 
| 486 |  |  |  |  |  |  | %                                       | | 
| 487 |  |  |  |  |  |  | % (-------------------------------------+------------------------------------) | 
| 488 |  |  |  |  |  |  | %% | 
| 489 |  |  |  |  |  |  |  | 
| 490 |  |  |  |  |  |  | !2 System Configuration | 
| 491 |  |  |  |  |  |  |  | 
| 492 |  |  |  |  |  |  | The /system.conf/ stores information about your installation environment. \ | 
| 493 |  |  |  |  |  |  | The default database environment related to this file system, a list of \ | 
| 494 |  |  |  |  |  |  | database environments, and a list of valid job acronyms: | 
| 495 |  |  |  |  |  |  |  | 
| 496 |  |  |  |  |  |  | % language=Ini_Files | 
| 497 |  |  |  |  |  |  | % [system] | 
| 498 |  |  |  |  |  |  | % | 
| 499 |  |  |  |  |  |  | % envvar    = mydbenv1 | 
| 500 |  |  |  |  |  |  | % dat_envrs = mydbenv1,mydbenv2,mydbenv3,mydbenv4 | 
| 501 |  |  |  |  |  |  | % job_acros = load_,extr_,merg_,vend_,job_,util_,test_,temp_ | 
| 502 |  |  |  |  |  |  | %% | 
| 503 |  |  |  |  |  |  |  | 
| 504 |  |  |  |  |  |  | Following this section are the directory sections, There is one directory \ | 
| 505 |  |  |  |  |  |  | section for each type of directory used: bin, lib, log, load, extr, and \ | 
| 506 |  |  |  |  |  |  | plugin. Each directory section is named as using the form \ | 
| 507 |  |  |  |  |  |  | %[directory ]%. Directory specifications for the the bin \ | 
| 508 |  |  |  |  |  |  | directory are shown below. For each database environment, you would have \ | 
| 509 |  |  |  |  |  |  | a directory entry for that particular environment. So for the bin directory, \ | 
| 510 |  |  |  |  |  |  | the entry would be something like the following: | 
| 511 |  |  |  |  |  |  |  | 
| 512 |  |  |  |  |  |  | % language=Ini_Files | 
| 513 |  |  |  |  |  |  | % [directory bin] | 
| 514 |  |  |  |  |  |  | % | 
| 515 |  |  |  |  |  |  | % mydbenv1 = /home/account/bin/ | 
| 516 |  |  |  |  |  |  | % mydbenv2 = /home/account/bin/ | 
| 517 |  |  |  |  |  |  | % mydbenv3 = /home/account/bin/ | 
| 518 |  |  |  |  |  |  | % mydbenv4 = /home/account/bin/ | 
| 519 |  |  |  |  |  |  | %% | 
| 520 |  |  |  |  |  |  |  | 
| 521 |  |  |  |  |  |  | The trailing slashes on the directory entries are required. | 
| 522 |  |  |  |  |  |  |  | 
| 523 |  |  |  |  |  |  | The last section in the C file is the restart section. This \ | 
| 524 |  |  |  |  |  |  | stores the last job step attempted. This is set immediately before a job \ | 
| 525 |  |  |  |  |  |  | is restarted. The example below shows a job restart step of 3. | 
| 526 |  |  |  |  |  |  |  | 
| 527 |  |  |  |  |  |  | % language=Ini_Files | 
| 528 |  |  |  |  |  |  | % [restart] | 
| 529 |  |  |  |  |  |  | % | 
| 530 |  |  |  |  |  |  | % restart=3 | 
| 531 |  |  |  |  |  |  | %% | 
| 532 |  |  |  |  |  |  |  | 
| 533 |  |  |  |  |  |  | !2 Job Configuration | 
| 534 |  |  |  |  |  |  |  | 
| 535 |  |  |  |  |  |  | The /job.conf/ file stores information about specific jobs. The key entry \ | 
| 536 |  |  |  |  |  |  | is the logfile entry. This entry provides a name to use for this job's log \ | 
| 537 |  |  |  |  |  |  | file. The entry is placed in a section named after the jobname used in the \ | 
| 538 |  |  |  |  |  |  | script. If your script uses: | 
| 539 |  |  |  |  |  |  |  | 
| 540 |  |  |  |  |  |  | % language=Perl | 
| 541 |  |  |  |  |  |  | % my $jobname = 'job_number_1'; | 
| 542 |  |  |  |  |  |  | % sys_init( $jobname ); | 
| 543 |  |  |  |  |  |  | %% | 
| 544 |  |  |  |  |  |  |  | 
| 545 |  |  |  |  |  |  | Then the job section for that script would be: | 
| 546 |  |  |  |  |  |  |  | 
| 547 |  |  |  |  |  |  | % language=Ini_Files | 
| 548 |  |  |  |  |  |  | % | 
| 549 |  |  |  |  |  |  | % [job_number_1] | 
| 550 |  |  |  |  |  |  | % logfile=epdw_contractor.log | 
| 551 |  |  |  |  |  |  | %% | 
| 552 |  |  |  |  |  |  |  | 
| 553 |  |  |  |  |  |  | There are also several optional entries that can be made for a given job. \ | 
| 554 |  |  |  |  |  |  | These will be permanent overrides for that particular job. All of these are \ | 
| 555 |  |  |  |  |  |  | also available as command line options. | 
| 556 |  |  |  |  |  |  |  | 
| 557 |  |  |  |  |  |  | % language=Ini_Files | 
| 558 |  |  |  |  |  |  | % logging_levels= | 
| 559 |  |  |  |  |  |  | % gdg= | 
| 560 |  |  |  |  |  |  | % emailto= | 
| 561 |  |  |  |  |  |  | % pagerto= | 
| 562 |  |  |  |  |  |  | % email_levels= | 
| 563 |  |  |  |  |  |  | % pager_levels= | 
| 564 |  |  |  |  |  |  | %% | 
| 565 |  |  |  |  |  |  |  | 
| 566 |  |  |  |  |  |  | This gives you the ability to set up logging and notifications differently \ | 
| 567 |  |  |  |  |  |  | for every job if you want to (probably not a good idea). | 
| 568 |  |  |  |  |  |  |  | 
| 569 |  |  |  |  |  |  | !2 Data Configuration | 
| 570 |  |  |  |  |  |  |  | 
| 571 |  |  |  |  |  |  | The /data.conf/ file is possibly the most complex file. This file is used \ | 
| 572 |  |  |  |  |  |  | to map your databases and database instances, both local and remote, and \ | 
| 573 |  |  |  |  |  |  | provides a default instance for each database. | 
| 574 |  |  |  |  |  |  |  | 
| 575 |  |  |  |  |  |  | Here is a sample /data.conf/ file. In the example below, the C<[instances]> \ | 
| 576 |  |  |  |  |  |  | section maps the available database instances for each database. The default \ | 
| 577 |  |  |  |  |  |  | sections %[default ] | 
| 578 |  |  |  |  |  |  | instance to connect to for each supported database, based on the current \ | 
| 579 |  |  |  |  |  |  | database environment variable. The last set of sections provide the \ | 
| 580 |  |  |  |  |  |  | connection parameters for each database/instance combination. (Only one of \ | 
| 581 |  |  |  |  |  |  | these is shown below.) | 
| 582 |  |  |  |  |  |  |  | 
| 583 |  |  |  |  |  |  | Keep in mind when trying to decipher the example below, that database mydb2 \ | 
| 584 |  |  |  |  |  |  | is in all cases the "local" database (attached to a file system where the \ | 
| 585 |  |  |  |  |  |  | DBIx-JCL are running. The databases mydb1 and mydb2 are remote databases. | 
| 586 |  |  |  |  |  |  |  | 
| 587 |  |  |  |  |  |  | % language=Ini_Files | 
| 588 |  |  |  |  |  |  | % [databases] | 
| 589 |  |  |  |  |  |  | % databases = mydb1,mydb2,mydb3 | 
| 590 |  |  |  |  |  |  | % | 
| 591 |  |  |  |  |  |  | % [names] | 
| 592 |  |  |  |  |  |  | % mydb1 = A Long Name for mydb1 | 
| 593 |  |  |  |  |  |  | % mydb2 = A Long Name for mydb2 | 
| 594 |  |  |  |  |  |  | % mydb3 = A Long Name for mydb3 | 
| 595 |  |  |  |  |  |  | % | 
| 596 |  |  |  |  |  |  | % [instances] | 
| 597 |  |  |  |  |  |  | % mydb1 = prd,frz | 
| 598 |  |  |  |  |  |  | % mydb2 = prd,frz,int,dev1,dev2 | 
| 599 |  |  |  |  |  |  | % mydb3 = prd,sys,int,dev | 
| 600 |  |  |  |  |  |  | % | 
| 601 |  |  |  |  |  |  | % [default db2dev1] | 
| 602 |  |  |  |  |  |  | % mydb1 = frz | 
| 603 |  |  |  |  |  |  | % mydb2 = dev1 | 
| 604 |  |  |  |  |  |  | % mydb3 = dev | 
| 605 |  |  |  |  |  |  | % | 
| 606 |  |  |  |  |  |  | % [default db2dev2] | 
| 607 |  |  |  |  |  |  | % mydb1 = frz | 
| 608 |  |  |  |  |  |  | % mydb2 = dev2 | 
| 609 |  |  |  |  |  |  | % mydb3 = dev | 
| 610 |  |  |  |  |  |  | % | 
| 611 |  |  |  |  |  |  | % default db2int] | 
| 612 |  |  |  |  |  |  | % mydb1 = frz | 
| 613 |  |  |  |  |  |  | % mydb2 = int | 
| 614 |  |  |  |  |  |  | % mydb3 = int | 
| 615 |  |  |  |  |  |  | % | 
| 616 |  |  |  |  |  |  | % [default db2frz] | 
| 617 |  |  |  |  |  |  | % mydb1 = prd | 
| 618 |  |  |  |  |  |  | % mydb2 = frz | 
| 619 |  |  |  |  |  |  | % mydb3 = sys | 
| 620 |  |  |  |  |  |  | % | 
| 621 |  |  |  |  |  |  | % [default db2prd] | 
| 622 |  |  |  |  |  |  | % mydb1 = prd | 
| 623 |  |  |  |  |  |  | % mydb2 = prd | 
| 624 |  |  |  |  |  |  | % mydb3 = prd | 
| 625 |  |  |  |  |  |  | % | 
| 626 |  |  |  |  |  |  | % [mydb2 int] | 
| 627 |  |  |  |  |  |  | % database=dbi:Oracle:db2int | 
| 628 |  |  |  |  |  |  | % username=myaccount | 
| 629 |  |  |  |  |  |  | % password=12345678 | 
| 630 |  |  |  |  |  |  | %% | 
| 631 |  |  |  |  |  |  |  | 
| 632 |  |  |  |  |  |  | !2 Mail Configuration | 
| 633 |  |  |  |  |  |  |  | 
| 634 |  |  |  |  |  |  | The /mail.conf/ file stores settings used when sending email and pager \ | 
| 635 |  |  |  |  |  |  | notifications. The entries are placed in a section named mail. | 
| 636 |  |  |  |  |  |  |  | 
| 637 |  |  |  |  |  |  | % language=Ini_Files | 
| 638 |  |  |  |  |  |  | % [mail] | 
| 639 |  |  |  |  |  |  | % server=mail.server.com | 
| 640 |  |  |  |  |  |  | % from=me@mycompany.com | 
| 641 |  |  |  |  |  |  | % emailto=me@mycompany.com,you@mycompany.com | 
| 642 |  |  |  |  |  |  | % pagerto=1234567890@somepager.com,0987654321@somepager.com | 
| 643 |  |  |  |  |  |  | % email_levels=FATAL,ERROR,WARN | 
| 644 |  |  |  |  |  |  | % pager_levels=FATAL,ERROR | 
| 645 |  |  |  |  |  |  | %% | 
| 646 |  |  |  |  |  |  |  | 
| 647 |  |  |  |  |  |  | !2 Log Configuration | 
| 648 |  |  |  |  |  |  |  | 
| 649 |  |  |  |  |  |  | The /log.conf/ file contains settings used by the logging functions. The \ | 
| 650 |  |  |  |  |  |  | settings are placed in a section named log. The gdg entry specifies the \ | 
| 651 |  |  |  |  |  |  | default number of log archive files that will be maintained. In case you \ | 
| 652 |  |  |  |  |  |  | are curious, gdg stands for generation data group. | 
| 653 |  |  |  |  |  |  |  | 
| 654 |  |  |  |  |  |  | % language=Ini_Files | 
| 655 |  |  |  |  |  |  | % [log] | 
| 656 |  |  |  |  |  |  | % default_logfile=job.log | 
| 657 |  |  |  |  |  |  | % logging_levels=FATAL,ERROR,WARN,INFO | 
| 658 |  |  |  |  |  |  | % gdg=5 | 
| 659 |  |  |  |  |  |  | %% | 
| 660 |  |  |  |  |  |  |  | 
| 661 |  |  |  |  |  |  | !2 Query Configuration | 
| 662 |  |  |  |  |  |  |  | 
| 663 |  |  |  |  |  |  | The /query.conf/ file contains all the sql used by DBIx-JCL on your \ | 
| 664 |  |  |  |  |  |  | installations. Each job has its own section in this file. Querys are \ | 
| 665 |  |  |  |  |  |  | entered using heredoc syntax, which makes it very easy to cut-and-paste \ | 
| 666 |  |  |  |  |  |  | sql from other sources into this file, and vice-versa. Abstracting your \ | 
| 667 |  |  |  |  |  |  | sql into a separate file should make your maintenance life much easier. \ | 
| 668 |  |  |  |  |  |  | It would be a good idea to put this file under configuration management \ | 
| 669 |  |  |  |  |  |  | control. | 
| 670 |  |  |  |  |  |  |  | 
| 671 |  |  |  |  |  |  | !2 Util Configuration | 
| 672 |  |  |  |  |  |  |  | 
| 673 |  |  |  |  |  |  | The /util.conf/ file is currently not used. It is anticipated that there \ | 
| 674 |  |  |  |  |  |  | will be a need for this file in the future. | 
| 675 |  |  |  |  |  |  |  | 
| 676 |  |  |  |  |  |  | ---- | 
| 677 |  |  |  |  |  |  |  | 
| 678 |  |  |  |  |  |  | !1 Logging | 
| 679 |  |  |  |  |  |  |  | 
| 680 |  |  |  |  |  |  | One of the real strengths of DBIx-JCL is its support for logging. The goal \ | 
| 681 |  |  |  |  |  |  | is to log all significant events, including DBI errors. You decide what types \ | 
| 682 |  |  |  |  |  |  | of events are significant by setting the logging levels prior to running your \ | 
| 683 |  |  |  |  |  |  | script, or on the command line when starting your script. | 
| 684 |  |  |  |  |  |  |  | 
| 685 |  |  |  |  |  |  | !2 Writing to the log | 
| 686 |  |  |  |  |  |  |  | 
| 687 |  |  |  |  |  |  | You use the log write functions to write data to the log. If the log \ | 
| 688 |  |  |  |  |  |  | statement is in the list of logging levels to be output for this script, \ | 
| 689 |  |  |  |  |  |  | the log statement will be written, if the log statement used is lower than \ | 
| 690 |  |  |  |  |  |  | any of the set logging levels, it will not be written to the log file. An \ | 
| 691 |  |  |  |  |  |  | example may clarify. Let's say you have set the logging levels to include \ | 
| 692 |  |  |  |  |  |  | FATAL,ERROR,WARNING. If your job script calls C or C \ | 
| 693 |  |  |  |  |  |  | functions, they would not write to the log file becuase those log levels \ | 
| 694 |  |  |  |  |  |  | are not in the list of logging levels to be output. If you want to see you \ | 
| 695 |  |  |  |  |  |  | log messages on the console while your job is running, use the Verbose \ | 
| 696 |  |  |  |  |  |  | command line option. | 
| 697 |  |  |  |  |  |  |  | 
| 698 |  |  |  |  |  |  | The log write functions are: | 
| 699 |  |  |  |  |  |  |  | 
| 700 |  |  |  |  |  |  | |%log_fatal()% |outputs FATAL level messages| | 
| 701 |  |  |  |  |  |  | |%log_error()% |outputs ERROR level messages| | 
| 702 |  |  |  |  |  |  | |%log_warn()%  |outputs WARN  level messages| | 
| 703 |  |  |  |  |  |  | |%log_info()%  |outputs INFO  level messages| | 
| 704 |  |  |  |  |  |  | |%log_debug()% |outputs DEBUG level messages| | 
| 705 |  |  |  |  |  |  |  | 
| 706 |  |  |  |  |  |  | !2 Using Oracle's DBMS_OUTPUT Package | 
| 707 |  |  |  |  |  |  |  | 
| 708 |  |  |  |  |  |  | The functions used here to implement stored procedure calls (DBD::Oracle only) \ | 
| 709 |  |  |  |  |  |  | will gather dbms output automatically. If any is found, these are sent to \ | 
| 710 |  |  |  |  |  |  | the current log file using an appropriate logging level. To make your log \ | 
| 711 |  |  |  |  |  |  | files more readable, you should consider using a a custom package for all \ | 
| 712 |  |  |  |  |  |  | dbms output generated from stored procedures and functions. I've also found \ | 
| 713 |  |  |  |  |  |  | that if you preceed your dbms output messages with some white space, they \ | 
| 714 |  |  |  |  |  |  | will look better when viewed in your log files. | 
| 715 |  |  |  |  |  |  |  | 
| 716 |  |  |  |  |  |  | ---- | 
| 717 |  |  |  |  |  |  |  | 
| 718 |  |  |  |  |  |  | !1 Notifications | 
| 719 |  |  |  |  |  |  |  | 
| 720 |  |  |  |  |  |  | Another real strength of DBIx-JCL is the built-in support for notifications. \ | 
| 721 |  |  |  |  |  |  | There are two types of notifications, email notifications and pager \ | 
| 722 |  |  |  |  |  |  | notifications. One of the nice features of email notifications is that the \ | 
| 723 |  |  |  |  |  |  | log file is included in the email message following the message text. Pager \ | 
| 724 |  |  |  |  |  |  | notifications are just short versions of email notifications, pager \ | 
| 725 |  |  |  |  |  |  | notifications never have the contents of the log file appended. | 
| 726 |  |  |  |  |  |  |  | 
| 727 |  |  |  |  |  |  | The pager notifications are really just an email message. Your pager device \ | 
| 728 |  |  |  |  |  |  | must be able to support messaging via email interface to make use of this \ | 
| 729 |  |  |  |  |  |  | feature. Most cell phone devices and text pagers have this capability. | 
| 730 |  |  |  |  |  |  |  | 
| 731 |  |  |  |  |  |  | The severity of the message is included in the message subject line so you \ | 
| 732 |  |  |  |  |  |  | can immediately see if you need to respond to the message or not. | 
| 733 |  |  |  |  |  |  |  | 
| 734 |  |  |  |  |  |  | The log writing functions are hooked into the notification functions. \ | 
| 735 |  |  |  |  |  |  | Whenever a log write function is called it checks to see if a notification \ | 
| 736 |  |  |  |  |  |  | should also be sent based on the email and pager severity levels. These work | 
| 737 |  |  |  |  |  |  | the same as described above for logging levels, in fact, the same levels are \ | 
| 738 |  |  |  |  |  |  | used. Care should be exercised when setting the notifications levels, if you \ | 
| 739 |  |  |  |  |  |  | set them too low you script could generate a lot of email/pager messages. \ | 
| 740 |  |  |  |  |  |  | Caveat emptor. | 
| 741 |  |  |  |  |  |  |  | 
| 742 |  |  |  |  |  |  | ---- | 
| 743 |  |  |  |  |  |  |  | 
| 744 |  |  |  |  |  |  | !1 Database Interface | 
| 745 |  |  |  |  |  |  |  | 
| 746 |  |  |  |  |  |  | This module uses the Perl DBI for all database functionality. However you do \ | 
| 747 |  |  |  |  |  |  | not have to deal with the raw DBI functions. All DBI access thru this module \ | 
| 748 |  |  |  |  |  |  | is made via a virtual name that you assign to each database connection used \ | 
| 749 |  |  |  |  |  |  | by your running job script. The virtual name is resolved using entries in a \ | 
| 750 |  |  |  |  |  |  | configuration file. Furthermore, all calls to DBI functions just require that \ | 
| 751 |  |  |  |  |  |  | virtual name. Underneath, the module functions handle storage of database \ | 
| 752 |  |  |  |  |  |  | handles and statement handles automatically for you. This has two benefits, \ | 
| 753 |  |  |  |  |  |  | it makes writing database job scripts for the novice much simpler, and it \ | 
| 754 |  |  |  |  |  |  | makes for cleaner, more readable job scripts. | 
| 755 |  |  |  |  |  |  |  | 
| 756 |  |  |  |  |  |  | You probably can't fully appreciation the latter until you are reading a \ | 
| 757 |  |  |  |  |  |  | job script at 2am, trying to figure out what went wrong with a production \ | 
| 758 |  |  |  |  |  |  | job. Of course, one of the design goals of this module is to make it so you \ | 
| 759 |  |  |  |  |  |  | never have to read a script when one of your jobs fails. All the information \ | 
| 760 |  |  |  |  |  |  | you need to diagnose and fix the problem should be in the most recent log \ | 
| 761 |  |  |  |  |  |  | file, with previous log history right at your finger tips as well. | 
| 762 |  |  |  |  |  |  |  | 
| 763 |  |  |  |  |  |  | ---- | 
| 764 |  |  |  |  |  |  |  | 
| 765 |  |  |  |  |  |  | !1 Script Naming Convention | 
| 766 |  |  |  |  |  |  |  | 
| 767 |  |  |  |  |  |  | Scripts which use DBIx-JCL are required to use a script naming convention, \ | 
| 768 |  |  |  |  |  |  | however, the convention chosen is up to you. All scripts using DBIx-JCL \ | 
| 769 |  |  |  |  |  |  | should be prefixed with an acronym. For example, if you had a script that \ | 
| 770 |  |  |  |  |  |  | sent a warning message on some condition, you might name it "util_warn.pl" \ | 
| 771 |  |  |  |  |  |  | where "util_" is the script prefix acronym. You decide what script prefix \ | 
| 772 |  |  |  |  |  |  | acronyms you want to use, and configure those in the system.conf file. This \ | 
| 773 |  |  |  |  |  |  | module will check that all invoking scripts adhere to your naming convention. \ | 
| 774 |  |  |  |  |  |  | DBIx-JCL will complain at runtime if a script is inappropriately named. | 
| 775 |  |  |  |  |  |  |  | 
| 776 |  |  |  |  |  |  | Some examples of script acronyms are: | 
| 777 |  |  |  |  |  |  |  | 
| 778 |  |  |  |  |  |  | |Acro  |Description| | 
| 779 |  |  |  |  |  |  | |load_ |load data script| | 
| 780 |  |  |  |  |  |  | |extr_ |extract data script| | 
| 781 |  |  |  |  |  |  | |merg_ |merge/update data script| | 
| 782 |  |  |  |  |  |  | |job_  |job which runs other scripts| | 
| 783 |  |  |  |  |  |  | |util_ |utility script| | 
| 784 |  |  |  |  |  |  | |test_ |test script| | 
| 785 |  |  |  |  |  |  | |temp_ |temporary scipt| | 
| 786 |  |  |  |  |  |  |  | 
| 787 |  |  |  |  |  |  | You should examine the sampel system configuration files that some with \ | 
| 788 |  |  |  |  |  |  | DBIx-JCL. | 
| 789 |  |  |  |  |  |  |  | 
| 790 |  |  |  |  |  |  | ---- | 
| 791 |  |  |  |  |  |  |  | 
| 792 |  |  |  |  |  |  | !1 Installation | 
| 793 |  |  |  |  |  |  |  | 
| 794 |  |  |  |  |  |  | The DBIx-JCL module can be installed into a private directory or appended to \ | 
| 795 |  |  |  |  |  |  | your Perl installation using the normal install process. If you intall into a \ | 
| 796 |  |  |  |  |  |  | private directory, you'll need to set the environment variable PERL5LIB so \ | 
| 797 |  |  |  |  |  |  | your scripts can find the module. | 
| 798 |  |  |  |  |  |  |  | 
| 799 |  |  |  |  |  |  | /Environment Variables/ | 
| 800 |  |  |  |  |  |  |  | 
| 801 |  |  |  |  |  |  | The module also uses several envirnoment variables besides PERL5LIB, sample \ | 
| 802 |  |  |  |  |  |  | export entries are shown below. The module needs to know where your home \ | 
| 803 |  |  |  |  |  |  | directory is, this should normally be set for you in most installations. The \ | 
| 804 |  |  |  |  |  |  | module will look for a configuration file named /system.conf/ to start the \ | 
| 805 |  |  |  |  |  |  | boot-strap process, this location is identified by the JCLCONF environment \ | 
| 806 |  |  |  |  |  |  | variable. A default database environment needs to be identified. You \ | 
| 807 |  |  |  |  |  |  | determine what this variable will be called, in the example below the \ | 
| 808 |  |  |  |  |  |  | variable is named MYDBENV. The name you choose is stored in the \ | 
| 809 |  |  |  |  |  |  | /system.conf/ file in section %[system]%, under the key %envvar%. | 
| 810 |  |  |  |  |  |  |  | 
| 811 |  |  |  |  |  |  | Sample export settings: | 
| 812 |  |  |  |  |  |  |  | 
| 813 |  |  |  |  |  |  | % language=IniFiles | 
| 814 |  |  |  |  |  |  | % export PERL5LIB=/home/myaccount/lib | 
| 815 |  |  |  |  |  |  | % export HOME=/home/myaccount | 
| 816 |  |  |  |  |  |  | % export JCLCONF=/home/myaccount/conf | 
| 817 |  |  |  |  |  |  | % export MYDBENV=dbenv1 | 
| 818 |  |  |  |  |  |  | %% | 
| 819 |  |  |  |  |  |  |  | 
| 820 |  |  |  |  |  |  | Under a Windows system you will want to set these in yous Control Panel \ | 
| 821 |  |  |  |  |  |  | under System and Advanced options. | 
| 822 |  |  |  |  |  |  |  | 
| 823 |  |  |  |  |  |  | ---- | 
| 824 |  |  |  |  |  |  |  | 
| 825 |  |  |  |  |  |  | !1 Example Script | 
| 826 |  |  |  |  |  |  |  | 
| 827 |  |  |  |  |  |  | Shown below is the standard approach to writing job scripts. | 
| 828 |  |  |  |  |  |  |  | 
| 829 |  |  |  |  |  |  | % language=Perl | 
| 830 |  |  |  |  |  |  | % #!perl | 
| 831 |  |  |  |  |  |  | % ##@@name_of_script.pl,bin | 
| 832 |  |  |  |  |  |  | % ##$$Description of the Job | 
| 833 |  |  |  |  |  |  | % | 
| 834 |  |  |  |  |  |  | % use strict; | 
| 835 |  |  |  |  |  |  | % use warnings; | 
| 836 |  |  |  |  |  |  | % use DBIx::JCL qw( :all ); | 
| 837 |  |  |  |  |  |  | % | 
| 838 |  |  |  |  |  |  | % # initialize | 
| 839 |  |  |  |  |  |  | % # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
| 840 |  |  |  |  |  |  | % | 
| 841 |  |  |  |  |  |  | % my $jobname = 'name_of_script'; | 
| 842 |  |  |  |  |  |  | % sys_init( $jobname ); | 
| 843 |  |  |  |  |  |  | % | 
| 844 |  |  |  |  |  |  | % my $dbenv1 = 'mydb1'; | 
| 845 |  |  |  |  |  |  | % my $mysql1 = sys_get_sql( 'query_number_1' ); | 
| 846 |  |  |  |  |  |  | % | 
| 847 |  |  |  |  |  |  | % # main | 
| 848 |  |  |  |  |  |  | % # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
| 849 |  |  |  |  |  |  | % | 
| 850 |  |  |  |  |  |  | % log_info( sys_get_dbdescr( $dbenv1 ) ); | 
| 851 |  |  |  |  |  |  | % db_connect( $dbenv1 ); | 
| 852 |  |  |  |  |  |  | % | 
| 853 |  |  |  |  |  |  | % # do more db stuff here | 
| 854 |  |  |  |  |  |  | % | 
| 855 |  |  |  |  |  |  | % # end | 
| 856 |  |  |  |  |  |  | % # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
| 857 |  |  |  |  |  |  | % | 
| 858 |  |  |  |  |  |  | % =begin wiki | 
| 859 |  |  |  |  |  |  | % | 
| 860 |  |  |  |  |  |  | % !1 NAME | 
| 861 |  |  |  |  |  |  | % | 
| 862 |  |  |  |  |  |  | % Name of script | 
| 863 |  |  |  |  |  |  | % | 
| 864 |  |  |  |  |  |  | % ---- | 
| 865 |  |  |  |  |  |  | % | 
| 866 |  |  |  |  |  |  | % !1 DESCRIPTION | 
| 867 |  |  |  |  |  |  | % | 
| 868 |  |  |  |  |  |  | % Describe the job script here. | 
| 869 |  |  |  |  |  |  | % | 
| 870 |  |  |  |  |  |  | % ---- | 
| 871 |  |  |  |  |  |  | % | 
| 872 |  |  |  |  |  |  | % !1 RECOVERY NOTES | 
| 873 |  |  |  |  |  |  | % | 
| 874 |  |  |  |  |  |  | % Document recovery notes here. | 
| 875 |  |  |  |  |  |  | % | 
| 876 |  |  |  |  |  |  | % ---- | 
| 877 |  |  |  |  |  |  | % | 
| 878 |  |  |  |  |  |  | % !1 DEPENDENCIES | 
| 879 |  |  |  |  |  |  | % | 
| 880 |  |  |  |  |  |  | % Document dependencies here. | 
| 881 |  |  |  |  |  |  | % | 
| 882 |  |  |  |  |  |  | % =cut | 
| 883 |  |  |  |  |  |  | % | 
| 884 |  |  |  |  |  |  | % __END__ | 
| 885 |  |  |  |  |  |  | % | 
| 886 |  |  |  |  |  |  | %% | 
| 887 |  |  |  |  |  |  |  | 
| 888 |  |  |  |  |  |  | The second and third lines of the example are required for every job script. \ | 
| 889 |  |  |  |  |  |  | The second line identifies the script and the script installation directory. \ | 
| 890 |  |  |  |  |  |  | The third line provides a brief description of the job and is used by the \ | 
| 891 |  |  |  |  |  |  | command line option that displays all installed jobs. | 
| 892 |  |  |  |  |  |  |  | 
| 893 |  |  |  |  |  |  | ---- | 
| 894 |  |  |  |  |  |  |  | 
| 895 |  |  |  |  |  |  | !1 Functions | 
| 896 |  |  |  |  |  |  |  | 
| 897 |  |  |  |  |  |  | The following provides an explanation of each of the functions provided by \ | 
| 898 |  |  |  |  |  |  | DBIx-JCL. | 
| 899 |  |  |  |  |  |  |  | 
| 900 |  |  |  |  |  |  | =cut | 
| 901 |  |  |  |  |  |  |  | 
| 902 |  |  |  |  |  |  |  | 
| 903 |  |  |  |  |  |  | # package | 
| 904 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 905 |  |  |  |  |  |  |  | 
| 906 |  |  |  |  |  |  | package DBIx::JCL; | 
| 907 | 1 |  |  | 1 |  | 940 | use strict; | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 38 |  | 
| 908 | 1 |  |  | 1 |  | 6 | use warnings; | 
|  | 1 |  |  |  |  | 1 |  | 
|  | 1 |  |  |  |  | 64 |  | 
| 909 |  |  |  |  |  |  |  | 
| 910 |  |  |  |  |  |  | # package exports | 
| 911 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 912 |  |  |  |  |  |  |  | 
| 913 |  |  |  |  |  |  | require Exporter; | 
| 914 | 1 |  |  | 1 |  | 17 | use base qw( Exporter ); | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 491 |  | 
| 915 |  |  |  |  |  |  | our @EXPORT_OK = qw( | 
| 916 |  |  |  |  |  |  | sys_init | 
| 917 |  |  |  |  |  |  | sys_init_setuser | 
| 918 |  |  |  |  |  |  | sys_end | 
| 919 |  |  |  |  |  |  | sys_init_plugin | 
| 920 |  |  |  |  |  |  | sys_get_sql | 
| 921 |  |  |  |  |  |  | sys_get_item | 
| 922 |  |  |  |  |  |  | sys_get_hash | 
| 923 |  |  |  |  |  |  | sys_get_array | 
| 924 |  |  |  |  |  |  | sys_get_common_sql | 
| 925 |  |  |  |  |  |  | sys_get_run_control | 
| 926 |  |  |  |  |  |  | sys_get_dbdescr | 
| 927 |  |  |  |  |  |  | sys_get_dbinst | 
| 928 |  |  |  |  |  |  | sys_set_restart | 
| 929 |  |  |  |  |  |  | sys_load_library | 
| 930 |  |  |  |  |  |  | sys_set_verbose | 
| 931 |  |  |  |  |  |  | sys_die | 
| 932 |  |  |  |  |  |  | sys_warn | 
| 933 |  |  |  |  |  |  | sys_info | 
| 934 |  |  |  |  |  |  | sys_ctime2str | 
| 935 |  |  |  |  |  |  | sys_disp_active_jobs | 
| 936 |  |  |  |  |  |  | sys_run_job | 
| 937 |  |  |  |  |  |  | sys_run_job_background | 
| 938 |  |  |  |  |  |  | sys_run_job_wait | 
| 939 |  |  |  |  |  |  | sys_run_job_maxrc | 
| 940 |  |  |  |  |  |  | sys_run_job_reset | 
| 941 |  |  |  |  |  |  | sys_get_path_bin_dir | 
| 942 |  |  |  |  |  |  | sys_get_path_lib_dir | 
| 943 |  |  |  |  |  |  | sys_get_path_log_dir | 
| 944 |  |  |  |  |  |  | sys_get_path_load_dir | 
| 945 |  |  |  |  |  |  | sys_get_path_extr_dir | 
| 946 |  |  |  |  |  |  | sys_get_path_scripts_dir | 
| 947 |  |  |  |  |  |  | sys_get_path_plugin_dir | 
| 948 |  |  |  |  |  |  | sys_get_path_prev_dir | 
| 949 |  |  |  |  |  |  | sys_get_mail_server | 
| 950 |  |  |  |  |  |  | sys_get_mail_from | 
| 951 |  |  |  |  |  |  | sys_get_mail_emailto | 
| 952 |  |  |  |  |  |  | sys_get_mail_pagerto | 
| 953 |  |  |  |  |  |  | sys_get_mail_email_levels | 
| 954 |  |  |  |  |  |  | sys_get_mail_pager_levels | 
| 955 |  |  |  |  |  |  | sys_get_log_file | 
| 956 |  |  |  |  |  |  | sys_get_log_filefull | 
| 957 |  |  |  |  |  |  | sys_get_log_logging_levels | 
| 958 |  |  |  |  |  |  | sys_get_log_console_levels | 
| 959 |  |  |  |  |  |  | sys_get_log_gdg | 
| 960 |  |  |  |  |  |  | sys_get_dataenvr | 
| 961 |  |  |  |  |  |  | sys_get_errorlevel | 
| 962 |  |  |  |  |  |  | sys_get_conf_dir | 
| 963 |  |  |  |  |  |  | sys_get_email_levels | 
| 964 |  |  |  |  |  |  | sys_get_pager_levels | 
| 965 |  |  |  |  |  |  | sys_get_logging_levels | 
| 966 |  |  |  |  |  |  | sys_get_console_levels | 
| 967 |  |  |  |  |  |  | sys_get_commandline | 
| 968 |  |  |  |  |  |  | sys_get_commandline_opt | 
| 969 |  |  |  |  |  |  | sys_get_commandline_val | 
| 970 |  |  |  |  |  |  | sys_get_script_file | 
| 971 |  |  |  |  |  |  | sys_get_user | 
| 972 |  |  |  |  |  |  | sys_get_util_move | 
| 973 |  |  |  |  |  |  | sys_get_maxval | 
| 974 |  |  |  |  |  |  | sys_set_errorlevel | 
| 975 |  |  |  |  |  |  | sys_set_die | 
| 976 |  |  |  |  |  |  | sys_set_warn | 
| 977 |  |  |  |  |  |  | sys_set_conf_file | 
| 978 |  |  |  |  |  |  | sys_set_email_levels | 
| 979 |  |  |  |  |  |  | sys_set_pager_levels | 
| 980 |  |  |  |  |  |  | sys_set_mail_emailto | 
| 981 |  |  |  |  |  |  | sys_set_logging_levels | 
| 982 |  |  |  |  |  |  | sys_set_console_levels | 
| 983 |  |  |  |  |  |  | sys_set_script_file | 
| 984 |  |  |  |  |  |  | sys_set_path_log_dir | 
| 985 |  |  |  |  |  |  | sys_set_path_plugin_dir | 
| 986 |  |  |  |  |  |  | sys_set_maxval | 
| 987 |  |  |  |  |  |  | sys_check_dataenvr | 
| 988 |  |  |  |  |  |  | sys_timer | 
| 989 |  |  |  |  |  |  | sys_wait | 
| 990 |  |  |  |  |  |  | sys_disp_doc | 
| 991 |  |  |  |  |  |  | log_fatal | 
| 992 |  |  |  |  |  |  | log_error | 
| 993 |  |  |  |  |  |  | log_warn | 
| 994 |  |  |  |  |  |  | log_info | 
| 995 |  |  |  |  |  |  | log_debug | 
| 996 |  |  |  |  |  |  | log_close | 
| 997 |  |  |  |  |  |  | log_write_log | 
| 998 |  |  |  |  |  |  | log_write_screen | 
| 999 |  |  |  |  |  |  | db_init | 
| 1000 |  |  |  |  |  |  | db_connect | 
| 1001 |  |  |  |  |  |  | db_nil | 
| 1002 |  |  |  |  |  |  | db_finish | 
| 1003 |  |  |  |  |  |  | db_disconnect | 
| 1004 |  |  |  |  |  |  | db_prepare | 
| 1005 |  |  |  |  |  |  | db_execute | 
| 1006 |  |  |  |  |  |  | db_commit | 
| 1007 |  |  |  |  |  |  | db_get_sth | 
| 1008 |  |  |  |  |  |  | db_get_defenvr | 
| 1009 |  |  |  |  |  |  | db_pef | 
| 1010 |  |  |  |  |  |  | db_pef_list | 
| 1011 |  |  |  |  |  |  | db_fetchrow | 
| 1012 |  |  |  |  |  |  | db_bindcols | 
| 1013 |  |  |  |  |  |  | db_rollback | 
| 1014 |  |  |  |  |  |  | db_insert_from_file | 
| 1015 |  |  |  |  |  |  | db_query_to_file | 
| 1016 |  |  |  |  |  |  | db_dump_query | 
| 1017 |  |  |  |  |  |  | db_dump_table | 
| 1018 |  |  |  |  |  |  | db_grant | 
| 1019 |  |  |  |  |  |  | db_func | 
| 1020 |  |  |  |  |  |  | db_proc | 
| 1021 |  |  |  |  |  |  | db_proc_in | 
| 1022 |  |  |  |  |  |  | db_proc_out | 
| 1023 |  |  |  |  |  |  | db_proc_inout | 
| 1024 |  |  |  |  |  |  | db_rowcount_query | 
| 1025 |  |  |  |  |  |  | db_sanity_check | 
| 1026 |  |  |  |  |  |  | db_rowcount_table | 
| 1027 |  |  |  |  |  |  | db_truncate | 
| 1028 |  |  |  |  |  |  | db_dbms_output_enable | 
| 1029 |  |  |  |  |  |  | db_dbms_output_disable | 
| 1030 |  |  |  |  |  |  | db_dbms_output_get | 
| 1031 |  |  |  |  |  |  | db_drop_index | 
| 1032 |  |  |  |  |  |  | db_drop_table | 
| 1033 |  |  |  |  |  |  | db_drop_procedure | 
| 1034 |  |  |  |  |  |  | db_drop_function | 
| 1035 |  |  |  |  |  |  | db_drop_package | 
| 1036 |  |  |  |  |  |  | db_rename_index | 
| 1037 |  |  |  |  |  |  | db_rename_table | 
| 1038 |  |  |  |  |  |  | db_purge_table | 
| 1039 |  |  |  |  |  |  | db_purge_index | 
| 1040 |  |  |  |  |  |  | db_update_statistics | 
| 1041 |  |  |  |  |  |  | db_sqlloader | 
| 1042 |  |  |  |  |  |  | db_sqlloaderx | 
| 1043 |  |  |  |  |  |  | db_sqlloaderx_parse_logfile | 
| 1044 |  |  |  |  |  |  | db_sqlloaderx_read | 
| 1045 |  |  |  |  |  |  | db_sqlloaderx_skipped | 
| 1046 |  |  |  |  |  |  | db_sqlloaderx_rejected | 
| 1047 |  |  |  |  |  |  | db_sqlloaderx_discarded | 
| 1048 |  |  |  |  |  |  | db_sqlloaderx_elapsed_time | 
| 1049 |  |  |  |  |  |  | db_sqlloaderx_cpu_time | 
| 1050 |  |  |  |  |  |  | db_index_rebuild | 
| 1051 |  |  |  |  |  |  | db_exchange_partition | 
| 1052 |  |  |  |  |  |  | util_get_filename_load | 
| 1053 |  |  |  |  |  |  | util_get_filename_extr | 
| 1054 |  |  |  |  |  |  | util_get_filename_log | 
| 1055 |  |  |  |  |  |  | util_read_header | 
| 1056 |  |  |  |  |  |  | util_read_footer | 
| 1057 |  |  |  |  |  |  | util_read_file | 
| 1058 |  |  |  |  |  |  | util_write_header | 
| 1059 |  |  |  |  |  |  | util_write_footer | 
| 1060 |  |  |  |  |  |  | util_move | 
| 1061 |  |  |  |  |  |  | util_trim | 
| 1062 |  |  |  |  |  |  | util_zsdf | 
| 1063 |  |  |  |  |  |  | test_init | 
| 1064 |  |  |  |  |  |  | test_ok | 
| 1065 |  |  |  |  |  |  | test_results | 
| 1066 |  |  |  |  |  |  | test_harness_init | 
| 1067 |  |  |  |  |  |  | test_harness_run | 
| 1068 |  |  |  |  |  |  | test_harness_results | 
| 1069 |  |  |  |  |  |  | $VERSION | 
| 1070 |  |  |  |  |  |  | $SQLLDR_SUCC | 
| 1071 |  |  |  |  |  |  | $SQLLDR_WARN | 
| 1072 |  |  |  |  |  |  | $SQLLDR_FAIL | 
| 1073 |  |  |  |  |  |  | $SQLLDR_FTL | 
| 1074 |  |  |  |  |  |  | ); | 
| 1075 |  |  |  |  |  |  |  | 
| 1076 |  |  |  |  |  |  | our %EXPORT_TAGS = ( | 
| 1077 |  |  |  |  |  |  | all => [ | 
| 1078 |  |  |  |  |  |  | @EXPORT_OK | 
| 1079 |  |  |  |  |  |  | ], | 
| 1080 |  |  |  |  |  |  | sys => [ qw( | 
| 1081 |  |  |  |  |  |  | sys_init | 
| 1082 |  |  |  |  |  |  | sys_init_setuser | 
| 1083 |  |  |  |  |  |  | sys_end | 
| 1084 |  |  |  |  |  |  | sys_init_plugin | 
| 1085 |  |  |  |  |  |  | sys_get_sql | 
| 1086 |  |  |  |  |  |  | sys_get_item | 
| 1087 |  |  |  |  |  |  | sys_get_hash | 
| 1088 |  |  |  |  |  |  | sys_get_array | 
| 1089 |  |  |  |  |  |  | sys_get_common_sql | 
| 1090 |  |  |  |  |  |  | sys_get_run_control | 
| 1091 |  |  |  |  |  |  | sys_get_dbdescr | 
| 1092 |  |  |  |  |  |  | sys_get_dbinst | 
| 1093 |  |  |  |  |  |  | sys_set_restart | 
| 1094 |  |  |  |  |  |  | sys_load_library | 
| 1095 |  |  |  |  |  |  | sys_set_verbose | 
| 1096 |  |  |  |  |  |  | sys_die | 
| 1097 |  |  |  |  |  |  | sys_warn | 
| 1098 |  |  |  |  |  |  | sys_info | 
| 1099 |  |  |  |  |  |  | sys_ctime2str | 
| 1100 |  |  |  |  |  |  | sys_disp_active_jobs | 
| 1101 |  |  |  |  |  |  | sys_run_job | 
| 1102 |  |  |  |  |  |  | sys_run_job_background | 
| 1103 |  |  |  |  |  |  | sys_run_job_wait | 
| 1104 |  |  |  |  |  |  | sys_run_job_maxrc | 
| 1105 |  |  |  |  |  |  | sys_run_job_reset | 
| 1106 |  |  |  |  |  |  | sys_get_path_bin_dir | 
| 1107 |  |  |  |  |  |  | sys_get_path_lib_dir | 
| 1108 |  |  |  |  |  |  | sys_get_path_log_dir | 
| 1109 |  |  |  |  |  |  | sys_get_path_load_dir | 
| 1110 |  |  |  |  |  |  | sys_get_path_extr_dir | 
| 1111 |  |  |  |  |  |  | sys_get_path_prev_dir | 
| 1112 |  |  |  |  |  |  | sys_get_path_scripts_dir | 
| 1113 |  |  |  |  |  |  | sys_get_mail_server | 
| 1114 |  |  |  |  |  |  | sys_get_mail_from | 
| 1115 |  |  |  |  |  |  | sys_get_mail_emailto | 
| 1116 |  |  |  |  |  |  | sys_get_mail_pagerto | 
| 1117 |  |  |  |  |  |  | sys_get_mail_email_levels | 
| 1118 |  |  |  |  |  |  | sys_get_mail_pager_levels | 
| 1119 |  |  |  |  |  |  | sys_get_log_file | 
| 1120 |  |  |  |  |  |  | sys_get_log_filefull | 
| 1121 |  |  |  |  |  |  | sys_get_log_logging_levels | 
| 1122 |  |  |  |  |  |  | sys_get_log_console_levels | 
| 1123 |  |  |  |  |  |  | sys_get_log_gdg | 
| 1124 |  |  |  |  |  |  | sys_get_dataenvr | 
| 1125 |  |  |  |  |  |  | sys_get_errorlevel | 
| 1126 |  |  |  |  |  |  | sys_get_conf_dir | 
| 1127 |  |  |  |  |  |  | sys_get_email_levels | 
| 1128 |  |  |  |  |  |  | sys_get_pager_levels | 
| 1129 |  |  |  |  |  |  | sys_get_logging_levels | 
| 1130 |  |  |  |  |  |  | sys_get_console_levels | 
| 1131 |  |  |  |  |  |  | sys_get_commandline | 
| 1132 |  |  |  |  |  |  | sys_get_commandline_opt | 
| 1133 |  |  |  |  |  |  | sys_get_commandline_val | 
| 1134 |  |  |  |  |  |  | sys_get_script_file | 
| 1135 |  |  |  |  |  |  | sys_get_path_plugin_dir | 
| 1136 |  |  |  |  |  |  | sys_get_util_move | 
| 1137 |  |  |  |  |  |  | sys_get_user | 
| 1138 |  |  |  |  |  |  | sys_get_maxval | 
| 1139 |  |  |  |  |  |  | sys_set_errorlevel | 
| 1140 |  |  |  |  |  |  | sys_set_die | 
| 1141 |  |  |  |  |  |  | sys_set_warn | 
| 1142 |  |  |  |  |  |  | sys_set_email_levels | 
| 1143 |  |  |  |  |  |  | sys_set_pager_levels | 
| 1144 |  |  |  |  |  |  | sys_set_mail_emailto | 
| 1145 |  |  |  |  |  |  | sys_set_logging_levels | 
| 1146 |  |  |  |  |  |  | sys_set_console_levels | 
| 1147 |  |  |  |  |  |  | sys_set_script_file | 
| 1148 |  |  |  |  |  |  | sys_set_conf_file | 
| 1149 |  |  |  |  |  |  | sys_set_path_log_dir | 
| 1150 |  |  |  |  |  |  | sys_set_path_plugin_dir | 
| 1151 |  |  |  |  |  |  | sys_set_maxval | 
| 1152 |  |  |  |  |  |  | sys_check_dataenvr | 
| 1153 |  |  |  |  |  |  | sys_timer | 
| 1154 |  |  |  |  |  |  | sys_wait | 
| 1155 |  |  |  |  |  |  | sys_disp_doc | 
| 1156 |  |  |  |  |  |  | ) ], | 
| 1157 |  |  |  |  |  |  | log => [ qw( | 
| 1158 |  |  |  |  |  |  | log_fatal | 
| 1159 |  |  |  |  |  |  | log_error | 
| 1160 |  |  |  |  |  |  | log_warn | 
| 1161 |  |  |  |  |  |  | log_info | 
| 1162 |  |  |  |  |  |  | log_debug | 
| 1163 |  |  |  |  |  |  | log_close | 
| 1164 |  |  |  |  |  |  | log_write_log | 
| 1165 |  |  |  |  |  |  | log_write_screen | 
| 1166 |  |  |  |  |  |  | ) ], | 
| 1167 |  |  |  |  |  |  | db => [ qw( | 
| 1168 |  |  |  |  |  |  | db_init | 
| 1169 |  |  |  |  |  |  | db_connect | 
| 1170 |  |  |  |  |  |  | db_nil | 
| 1171 |  |  |  |  |  |  | db_finish | 
| 1172 |  |  |  |  |  |  | db_disconnect | 
| 1173 |  |  |  |  |  |  | db_prepare | 
| 1174 |  |  |  |  |  |  | db_execute | 
| 1175 |  |  |  |  |  |  | db_commit | 
| 1176 |  |  |  |  |  |  | db_get_sth | 
| 1177 |  |  |  |  |  |  | db_get_defenvr | 
| 1178 |  |  |  |  |  |  | db_pef | 
| 1179 |  |  |  |  |  |  | db_pef_list | 
| 1180 |  |  |  |  |  |  | db_fetchrow | 
| 1181 |  |  |  |  |  |  | db_bindcols | 
| 1182 |  |  |  |  |  |  | db_rollback | 
| 1183 |  |  |  |  |  |  | db_insert_from_file | 
| 1184 |  |  |  |  |  |  | db_query_to_file | 
| 1185 |  |  |  |  |  |  | db_dump_query | 
| 1186 |  |  |  |  |  |  | db_dump_table | 
| 1187 |  |  |  |  |  |  | db_grant | 
| 1188 |  |  |  |  |  |  | db_func | 
| 1189 |  |  |  |  |  |  | db_proc | 
| 1190 |  |  |  |  |  |  | db_proc_in | 
| 1191 |  |  |  |  |  |  | db_proc_out | 
| 1192 |  |  |  |  |  |  | db_proc_inout | 
| 1193 |  |  |  |  |  |  | db_rowcount_query | 
| 1194 |  |  |  |  |  |  | db_sanity_check | 
| 1195 |  |  |  |  |  |  | db_rowcount_table | 
| 1196 |  |  |  |  |  |  | db_truncate | 
| 1197 |  |  |  |  |  |  | db_dbms_output_enable | 
| 1198 |  |  |  |  |  |  | db_dbms_output_disable | 
| 1199 |  |  |  |  |  |  | db_dbms_output_get | 
| 1200 |  |  |  |  |  |  | db_drop_index | 
| 1201 |  |  |  |  |  |  | db_drop_table | 
| 1202 |  |  |  |  |  |  | db_drop_procedure | 
| 1203 |  |  |  |  |  |  | db_drop_function | 
| 1204 |  |  |  |  |  |  | db_drop_package | 
| 1205 |  |  |  |  |  |  | db_rename_index | 
| 1206 |  |  |  |  |  |  | db_rename_table | 
| 1207 |  |  |  |  |  |  | db_purge_table | 
| 1208 |  |  |  |  |  |  | db_purge_index | 
| 1209 |  |  |  |  |  |  | db_update_statistics | 
| 1210 |  |  |  |  |  |  | db_sqlloader | 
| 1211 |  |  |  |  |  |  | db_sqlloaderx | 
| 1212 |  |  |  |  |  |  | db_sqlloaderx_parse_logfile | 
| 1213 |  |  |  |  |  |  | db_sqlloaderx_read | 
| 1214 |  |  |  |  |  |  | db_sqlloaderx_skipped | 
| 1215 |  |  |  |  |  |  | db_sqlloaderx_rejected | 
| 1216 |  |  |  |  |  |  | db_sqlloaderx_discarded | 
| 1217 |  |  |  |  |  |  | db_sqlloaderx_elapsed_time | 
| 1218 |  |  |  |  |  |  | db_sqlloaderx_cpu_time | 
| 1219 |  |  |  |  |  |  | db_index_rebuild | 
| 1220 |  |  |  |  |  |  | db_exchange_partition | 
| 1221 |  |  |  |  |  |  | ) ], | 
| 1222 |  |  |  |  |  |  | util => [ qw( | 
| 1223 |  |  |  |  |  |  | util_get_filename_load | 
| 1224 |  |  |  |  |  |  | util_get_filename_extr | 
| 1225 |  |  |  |  |  |  | util_get_filename_log | 
| 1226 |  |  |  |  |  |  | util_read_header | 
| 1227 |  |  |  |  |  |  | util_read_footer | 
| 1228 |  |  |  |  |  |  | util_read_file | 
| 1229 |  |  |  |  |  |  | util_write_header | 
| 1230 |  |  |  |  |  |  | util_write_footer | 
| 1231 |  |  |  |  |  |  | util_move | 
| 1232 |  |  |  |  |  |  | util_trim | 
| 1233 |  |  |  |  |  |  | util_zsdf | 
| 1234 |  |  |  |  |  |  | ) ], | 
| 1235 |  |  |  |  |  |  | test => [ qw( | 
| 1236 |  |  |  |  |  |  | test_init | 
| 1237 |  |  |  |  |  |  | test_ok | 
| 1238 |  |  |  |  |  |  | test_results | 
| 1239 |  |  |  |  |  |  | test_harness_init | 
| 1240 |  |  |  |  |  |  | test_harness_run | 
| 1241 |  |  |  |  |  |  | test_harness_results | 
| 1242 |  |  |  |  |  |  | ) ], | 
| 1243 |  |  |  |  |  |  | const => [ qw( | 
| 1244 |  |  |  |  |  |  | $SQLLDR_SUCC | 
| 1245 |  |  |  |  |  |  | $SQLLDR_WARN | 
| 1246 |  |  |  |  |  |  | $SQLLDR_FAIL | 
| 1247 |  |  |  |  |  |  | $SQLLDR_FTL | 
| 1248 |  |  |  |  |  |  | ) ], | 
| 1249 |  |  |  |  |  |  | ); | 
| 1250 |  |  |  |  |  |  |  | 
| 1251 |  |  |  |  |  |  | # package imports | 
| 1252 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 1253 |  |  |  |  |  |  |  | 
| 1254 | 1 |  |  | 1 |  | 1092 | use English qw( -no_match_vars ); | 
|  | 1 |  |  |  |  | 2432 |  | 
|  | 1 |  |  |  |  | 10 |  | 
| 1255 | 1 |  |  | 1 |  | 2568 | use Getopt::Long; | 
|  | 1 |  |  |  |  | 13778 |  | 
|  | 1 |  |  |  |  | 9 |  | 
| 1256 | 1 |  |  | 1 |  | 1573 | use Config::IniFiles; | 
|  | 1 |  |  |  |  | 39680 |  | 
|  | 1 |  |  |  |  | 40 |  | 
| 1257 | 1 |  |  | 1 |  | 1201 | use Pod::WikiText; | 
|  | 1 |  |  |  |  | 121193 |  | 
|  | 1 |  |  |  |  | 136 |  | 
| 1258 | 1 |  |  | 1 |  | 1094 | use IO::File; | 
|  | 1 |  |  |  |  | 1237 |  | 
|  | 1 |  |  |  |  | 226 |  | 
| 1259 | 1 |  |  | 1 |  | 8 | use IO::Handle; | 
|  | 1 |  |  |  |  | 3 |  | 
|  | 1 |  |  |  |  | 40 |  | 
| 1260 | 1 |  |  | 1 |  | 1045 | use IO::LockedFile; | 
|  | 1 |  |  |  |  | 1869 |  | 
|  | 1 |  |  |  |  | 7 |  | 
| 1261 | 1 |  |  | 1 |  | 1362 | use Fcntl qw(:flock); | 
|  | 1 |  |  |  |  | 3 |  | 
|  | 1 |  |  |  |  | 98 |  | 
| 1262 | 1 |  |  | 1 |  | 979 | use File::Copy; | 
|  | 1 |  |  |  |  | 4173 |  | 
|  | 1 |  |  |  |  | 91 |  | 
| 1263 | 1 |  |  | 1 |  | 1014 | use File::Bidirectional; | 
|  | 1 |  |  |  |  | 2667 |  | 
|  | 1 |  |  |  |  | 37 |  | 
| 1264 | 1 |  |  | 1 |  | 10 | use File::Basename; | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 78 |  | 
| 1265 | 1 |  |  | 1 |  | 1505 | use MIME::Lite; | 
|  | 1 |  |  |  |  | 60977 |  | 
|  | 1 |  |  |  |  | 40 |  | 
| 1266 | 1 |  |  | 1 |  | 716 | use Date::Format; | 
|  | 1 |  |  |  |  | 20705 |  | 
|  | 1 |  |  |  |  | 94 |  | 
| 1267 | 1 |  |  | 1 |  | 10125 | use DBI; | 
|  | 1 |  |  |  |  | 59817 |  | 
|  | 1 |  |  |  |  | 488 |  | 
| 1268 |  |  |  |  |  |  | #|++  ## flush print buffer on write | 
| 1269 |  |  |  |  |  |  |  | 
| 1270 |  |  |  |  |  |  | # version | 
| 1271 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 1272 |  |  |  |  |  |  |  | 
| 1273 |  |  |  |  |  |  | our $VERSION = "0.12"; | 
| 1274 |  |  |  |  |  |  |  | 
| 1275 |  |  |  |  |  |  | # const exports | 
| 1276 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 1277 |  |  |  |  |  |  |  | 
| 1278 |  |  |  |  |  |  | our $SQLLDR_SUCC = 0; | 
| 1279 |  |  |  |  |  |  | our $SQLLDR_WARN = 2; | 
| 1280 |  |  |  |  |  |  | our $SQLLDR_FAIL = 1; | 
| 1281 |  |  |  |  |  |  | our $SQLLDR_FTL  = 3; | 
| 1282 |  |  |  |  |  |  |  | 
| 1283 |  |  |  |  |  |  | # state variables | 
| 1284 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 1285 |  |  |  |  |  |  |  | 
| 1286 |  |  |  |  |  |  | my $path_bin_dir       = ''; | 
| 1287 |  |  |  |  |  |  | my $path_lib_dir       = ''; | 
| 1288 |  |  |  |  |  |  | my $path_log_dir       = ''; | 
| 1289 |  |  |  |  |  |  | my $path_load_dir      = ''; | 
| 1290 |  |  |  |  |  |  | my $path_extr_dir      = ''; | 
| 1291 |  |  |  |  |  |  | my $path_prev_dir      = ''; | 
| 1292 |  |  |  |  |  |  | my $path_scripts_dir   = ''; | 
| 1293 |  |  |  |  |  |  | my $mail_server        = ''; | 
| 1294 |  |  |  |  |  |  | my $mail_from          = ''; | 
| 1295 |  |  |  |  |  |  | my $mail_emailto       = ''; | 
| 1296 |  |  |  |  |  |  | my $mail_pagerto       = ''; | 
| 1297 |  |  |  |  |  |  | my $mail_email_levels  = ''; | 
| 1298 |  |  |  |  |  |  | my $mail_pager_levels  = ''; | 
| 1299 |  |  |  |  |  |  | my $log_file           = ''; | 
| 1300 |  |  |  |  |  |  | my $log_filefull       = ''; | 
| 1301 |  |  |  |  |  |  | my $log_logging_levels = ''; | 
| 1302 |  |  |  |  |  |  | my $log_console_levels = ''; | 
| 1303 |  |  |  |  |  |  | my $dataenvr           = ''; | 
| 1304 |  |  |  |  |  |  | my $log_gdg            = 0; | 
| 1305 |  |  |  |  |  |  | my $log_prefix         = ''; | 
| 1306 |  |  |  |  |  |  | my $log_radix          = 2; | 
| 1307 |  |  |  |  |  |  | my $errorlevel         = 0; | 
| 1308 |  |  |  |  |  |  | my $util_move          = 1; | 
| 1309 |  |  |  |  |  |  |  | 
| 1310 |  |  |  |  |  |  | # command line variables | 
| 1311 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 1312 |  |  |  |  |  |  |  | 
| 1313 |  |  |  |  |  |  | my $opt_run                 = 0; | 
| 1314 |  |  |  |  |  |  | my $opt_run_background      = 0; | 
| 1315 |  |  |  |  |  |  | my $opt_run_scheduled       = ''; | 
| 1316 |  |  |  |  |  |  | my $opt_run_restart         = ''; | 
| 1317 |  |  |  |  |  |  | my $opt_connection          = ''; | 
| 1318 |  |  |  |  |  |  | my $opt_run_de              = ''; | 
| 1319 |  |  |  |  |  |  | my $opt_commandline_ext     = ''; | 
| 1320 |  |  |  |  |  |  | my $opt_verbose             = 0; | 
| 1321 |  |  |  |  |  |  | my $opt_very_verbose        = 0; | 
| 1322 |  |  |  |  |  |  | my $opt_no_greeting         = 0; | 
| 1323 |  |  |  |  |  |  | my $opt_test_dbcon          = ''; | 
| 1324 |  |  |  |  |  |  | my $opt_log_file            = ''; | 
| 1325 |  |  |  |  |  |  | my $opt_logging_levels      = ''; | 
| 1326 |  |  |  |  |  |  | my $opt_console_levels      = ''; | 
| 1327 |  |  |  |  |  |  | my $opt_log_gdg             = 0; | 
| 1328 |  |  |  |  |  |  | my $opt_log_prefix          = ''; | 
| 1329 |  |  |  |  |  |  | my $opt_log_radix           = 0; | 
| 1330 |  |  |  |  |  |  | my $opt_notify_email_oncomp = 0; | 
| 1331 |  |  |  |  |  |  | my $opt_notify_pager_oncomp = 0; | 
| 1332 |  |  |  |  |  |  | my $opt_notify_email_tolist = ''; | 
| 1333 |  |  |  |  |  |  | my $opt_notify_pager_tolist = ''; | 
| 1334 |  |  |  |  |  |  | my $opt_notify_email_levels = ''; | 
| 1335 |  |  |  |  |  |  | my $opt_notify_pager_levels = ''; | 
| 1336 |  |  |  |  |  |  | my $opt_disp_params         = 0; | 
| 1337 |  |  |  |  |  |  | my $opt_disp_sql            = 0; | 
| 1338 |  |  |  |  |  |  | my $opt_disp_doc            = 0; | 
| 1339 |  |  |  |  |  |  | my $opt_disp_sysdoc         = 0; | 
| 1340 |  |  |  |  |  |  | my $opt_disp_logprev        = 0; | 
| 1341 |  |  |  |  |  |  | my $opt_disp_logarch        = 0; | 
| 1342 |  |  |  |  |  |  | my $opt_disp_jobs           = 0; | 
| 1343 |  |  |  |  |  |  | my $opt_disp_active_jobs    = 0; | 
| 1344 |  |  |  |  |  |  | my $opt_disp_exec           = 0; | 
| 1345 |  |  |  |  |  |  | my $opt_send_email          = ''; | 
| 1346 |  |  |  |  |  |  | my $opt_send_pager          = ''; | 
| 1347 |  |  |  |  |  |  | my $opt_util_move           = 0; | 
| 1348 |  |  |  |  |  |  | my $opt_help                = 0; | 
| 1349 |  |  |  |  |  |  | my $opt_help_args           = 0; | 
| 1350 |  |  |  |  |  |  | my $opt_commandline         = join ' ', @ARGV; | 
| 1351 |  |  |  |  |  |  |  | 
| 1352 |  |  |  |  |  |  | # module variables | 
| 1353 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 1354 |  |  |  |  |  |  |  | 
| 1355 | 1 |  |  | 1 |  | 13 | use constant QUOTE => q{"}; | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 86 |  | 
| 1356 | 1 |  |  | 1 |  | 7 | use constant SPACE => q{ }; | 
|  | 1 |  |  |  |  | 3 |  | 
|  | 1 |  |  |  |  | 54088 |  | 
| 1357 |  |  |  |  |  |  |  | 
| 1358 |  |  |  |  |  |  | my $RC_FATAL = 32; | 
| 1359 |  |  |  |  |  |  | my $RC_ERROR = 16; | 
| 1360 |  |  |  |  |  |  | my $RC_WARN  = 8; | 
| 1361 |  |  |  |  |  |  |  | 
| 1362 |  |  |  |  |  |  | my %MONTHS = ( | 
| 1363 |  |  |  |  |  |  | Jan => 0, Feb => 1, Mar => 2, Apr => 3, May => 4, Jun => 5, | 
| 1364 |  |  |  |  |  |  | Jul => 6, Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec=> 11, | 
| 1365 |  |  |  |  |  |  | ); | 
| 1366 |  |  |  |  |  |  |  | 
| 1367 |  |  |  |  |  |  | my $jobname               = '';   # name used to identify job script | 
| 1368 |  |  |  |  |  |  | my $pid                   = 0;    # os process id number | 
| 1369 |  |  |  |  |  |  | my %pidlib                = ();   # hash of info about background jobs | 
| 1370 |  |  |  |  |  |  | my $pidcnt                = 0;    # count of child pids | 
| 1371 |  |  |  |  |  |  | my $maxrc                 = 0;    # max return code for foreground jobs | 
| 1372 |  |  |  |  |  |  | my $osuser                = '';   # os username | 
| 1373 |  |  |  |  |  |  | my $commandline_ext       = '';   # extended command line | 
| 1374 |  |  |  |  |  |  | my @plugins               = ();   # loaded plugin information | 
| 1375 |  |  |  |  |  |  | my %timers                = ();   # hash of timers | 
| 1376 |  |  |  |  |  |  | my %function_params       = ();   # hash of stored function params | 
| 1377 |  |  |  |  |  |  | my $wt_seconds            = 0;    # wait seconds | 
| 1378 |  |  |  |  |  |  | my $wt_start              = time; # init wait start time | 
| 1379 |  |  |  |  |  |  | my %maxval                = ();   # hash of max values | 
| 1380 |  |  |  |  |  |  | my $t_num                 = 0;    # test script | 
| 1381 |  |  |  |  |  |  | my $t_ok                  = 0;    # test script | 
| 1382 |  |  |  |  |  |  | my $t_notok               = 0;    # test script | 
| 1383 |  |  |  |  |  |  | my $th_num                = 0;    # test harness | 
| 1384 |  |  |  |  |  |  | my $th_error              = 0;    # test harness | 
| 1385 |  |  |  |  |  |  | my $sys_dbms_output       = 0;    # has dbms_output been enabled | 
| 1386 |  |  |  |  |  |  | my $sys_log_open          = 0;    # is log file open | 
| 1387 |  |  |  |  |  |  | my $sys_stderr_redirected = 0;    # STDERR has been redirected to /dev/null | 
| 1388 |  |  |  |  |  |  | my $sys_jobconf_override  = 0;    # using override job conf file | 
| 1389 |  |  |  |  |  |  | my $sys_jobconf_file      = '';   # override jobconf filename | 
| 1390 |  |  |  |  |  |  | my $path_plugin_dir       = '';   # path to plugin directory | 
| 1391 |  |  |  |  |  |  | my $path_conf_dir         = '';   # path to conf file directory | 
| 1392 |  |  |  |  |  |  | my %sqlloader_results     = ();   # hash of SQL*Loader results | 
| 1393 |  |  |  |  |  |  | my %log_level_opts        = ();   # hash of logging options | 
| 1394 |  |  |  |  |  |  |  | 
| 1395 |  |  |  |  |  |  | my (%conf_data, %conf_log, %conf_mail, %conf_query, %conf_job, %conf_util); | 
| 1396 |  |  |  |  |  |  | my (%conf_system, %conf_de, %conf_rcontrols); | 
| 1397 |  |  |  |  |  |  | my (@databases, @dat_envrs, @job_acros); | 
| 1398 |  |  |  |  |  |  | my (%dbname, %dbdefenvr, %dbinst, %dbconn, %dbhandles); | 
| 1399 |  |  |  |  |  |  |  | 
| 1400 |  |  |  |  |  |  | my $script_file           = $PROGRAM_NAME; | 
| 1401 |  |  |  |  |  |  | my $script_filefull       = $script_file; | 
| 1402 |  |  |  |  |  |  | my $log_ext               = '.log'; | 
| 1403 |  |  |  |  |  |  | my $dbitrace_base         = 'dbitrace'; | 
| 1404 |  |  |  |  |  |  | my $dbitrace_file         = $dbitrace_base . $log_ext; | 
| 1405 |  |  |  |  |  |  | my $dbitrace_filefull     = ''; | 
| 1406 |  |  |  |  |  |  |  | 
| 1407 |  |  |  |  |  |  | $script_file =~ s{^/.*/}{}; | 
| 1408 |  |  |  |  |  |  |  | 
| 1409 |  |  |  |  |  |  | $path_conf_dir = $ENV{JCLCONF} || ''; | 
| 1410 |  |  |  |  |  |  | if ( ! defined $path_conf_dir ) { | 
| 1411 |  |  |  |  |  |  | sys_die( 'Environment variable JCLCONF not set', 0 ); | 
| 1412 |  |  |  |  |  |  | } | 
| 1413 |  |  |  |  |  |  |  | 
| 1414 |  |  |  |  |  |  | if ( $path_conf_dir =~ m/(.*)\/$/ ) { $path_conf_dir = $1; } | 
| 1415 |  |  |  |  |  |  |  | 
| 1416 |  |  |  |  |  |  | my %db_func_params = ( | 
| 1417 |  |  |  |  |  |  | db_insert_from_file => { | 
| 1418 |  |  |  |  |  |  | TrimLead       => 'no', | 
| 1419 |  |  |  |  |  |  | TrimFieldLead  => 'no', | 
| 1420 |  |  |  |  |  |  | TrimFieldTrail => 'no', | 
| 1421 |  |  |  |  |  |  | CommentChar    => '#', | 
| 1422 |  |  |  |  |  |  | SkipComments   => 'no', | 
| 1423 |  |  |  |  |  |  | SkipLastField  => 'no', | 
| 1424 |  |  |  |  |  |  | UseRegex       => 'no', | 
| 1425 |  |  |  |  |  |  | }, | 
| 1426 |  |  |  |  |  |  | db_insert_from_conf => { | 
| 1427 |  |  |  |  |  |  | TrimLead       => 'no', | 
| 1428 |  |  |  |  |  |  | TrimFieldLead  => 'no', | 
| 1429 |  |  |  |  |  |  | TrimFieldTrail => 'no', | 
| 1430 |  |  |  |  |  |  | CommentChar    => '#', | 
| 1431 |  |  |  |  |  |  | SkipComments   => 'no', | 
| 1432 |  |  |  |  |  |  | SkipLastField  => 'no', | 
| 1433 |  |  |  |  |  |  | UseRegex       => 'no', | 
| 1434 |  |  |  |  |  |  | }, | 
| 1435 |  |  |  |  |  |  | db_sqlloader => { | 
| 1436 |  |  |  |  |  |  | DatFilePath => '', | 
| 1437 |  |  |  |  |  |  | DbEnvr      => '', | 
| 1438 |  |  |  |  |  |  | NetService  => '', | 
| 1439 |  |  |  |  |  |  | }, | 
| 1440 |  |  |  |  |  |  | ); | 
| 1441 |  |  |  |  |  |  |  | 
| 1442 |  |  |  |  |  |  | # public methods | 
| 1443 |  |  |  |  |  |  | # ------------------------------------------------------------------------------ | 
| 1444 |  |  |  |  |  |  |  | 
| 1445 |  |  |  |  |  |  | =begin wiki | 
| 1446 |  |  |  |  |  |  |  | 
| 1447 |  |  |  |  |  |  | !2 System Functions | 
| 1448 |  |  |  |  |  |  |  | 
| 1449 |  |  |  |  |  |  | These functions provide general job information and job managment \ | 
| 1450 |  |  |  |  |  |  | capabilities. | 
| 1451 |  |  |  |  |  |  |  | 
| 1452 |  |  |  |  |  |  | =cut | 
| 1453 |  |  |  |  |  |  |  | 
| 1454 |  |  |  |  |  |  | sub sys_init { | 
| 1455 |  |  |  |  |  |  | =begin wiki | 
| 1456 |  |  |  |  |  |  |  | 
| 1457 |  |  |  |  |  |  | !3 sys_init | 
| 1458 |  |  |  |  |  |  |  | 
| 1459 |  |  |  |  |  |  | ( jobname ) | 
| 1460 |  |  |  |  |  |  |  | 
| 1461 |  |  |  |  |  |  | This is the job script initialization function. All job scripts should call \ | 
| 1462 |  |  |  |  |  |  | this function first before any other JCL functions. This will validate a job \ | 
| 1463 |  |  |  |  |  |  | name and does all the other setup work necessary to run a job script. This \ | 
| 1464 |  |  |  |  |  |  | function also provides a standard command line interface and supporting \ | 
| 1465 |  |  |  |  |  |  | functions for the supplied command line options. | 
| 1466 |  |  |  |  |  |  |  | 
| 1467 |  |  |  |  |  |  | =cut | 
| 1468 | 0 |  |  | 0 | 0 | 0 | my ($jn, @cl) = @_; | 
| 1469 | 0 |  |  |  |  | 0 | $jobname = $jn; | 
| 1470 | 0 |  |  |  |  | 0 | foreach my $opt ( @cl ) { | 
| 1471 | 0 |  |  |  |  | 0 | push @ARGV, $opt;   # add additional command line option | 
| 1472 |  |  |  |  |  |  | } | 
| 1473 |  |  |  |  |  |  |  | 
| 1474 | 0 | 0 |  |  |  | 0 | unless ( $jobname ) { | 
| 1475 | 0 |  |  |  |  | 0 | sys_die( 'Please specify jobname when initializing', 0 ); | 
| 1476 |  |  |  |  |  |  | } | 
| 1477 |  |  |  |  |  |  |  | 
| 1478 | 0 |  |  |  |  | 0 | _sys_init_vars(); | 
| 1479 |  |  |  |  |  |  |  | 
| 1480 | 0 |  |  |  |  | 0 | $log_file = $jobname . $log_ext; | 
| 1481 | 0 |  |  |  |  | 0 | $log_filefull = $path_log_dir.$log_file; | 
| 1482 |  |  |  |  |  |  |  | 
| 1483 | 0 | 0 |  |  |  | 0 | push @ARGV, '-r' if $jobname eq "JCL";  # for convenience | 
| 1484 |  |  |  |  |  |  |  | 
| 1485 | 0 |  |  |  |  | 0 | $sys_jobconf_file = _sys_check_de_override( $jobname ); | 
| 1486 |  |  |  |  |  |  |  | 
| 1487 | 0 |  |  |  |  | 0 | $sys_jobconf_file .= ".conf"; | 
| 1488 | 0 |  |  |  |  | 0 | _sys_read_conf( $sys_jobconf_file );   # tie %conf_job to job's conf file | 
| 1489 | 0 |  |  |  |  | 0 | _sys_read_job();   # read job specific settings from %conf_job | 
| 1490 |  |  |  |  |  |  |  | 
| 1491 | 0 | 0 |  |  |  | 0 | GetOptions( "r"     => \$opt_run, | 
| 1492 |  |  |  |  |  |  | "rb"    => \$opt_run_background, | 
| 1493 |  |  |  |  |  |  | "rs=s"  => \$opt_run_scheduled, | 
| 1494 |  |  |  |  |  |  | "rr=s"  => \$opt_run_restart, | 
| 1495 |  |  |  |  |  |  | "rde=s" => \$opt_run_de, | 
| 1496 |  |  |  |  |  |  | "x=s"   => \$opt_commandline_ext, | 
| 1497 |  |  |  |  |  |  | "c=s"   => \$opt_connection, | 
| 1498 |  |  |  |  |  |  | "v"     => \$opt_verbose, | 
| 1499 |  |  |  |  |  |  | "vv"    => \$opt_very_verbose, | 
| 1500 |  |  |  |  |  |  | "ng"    => \$opt_no_greeting, | 
| 1501 |  |  |  |  |  |  | "tc=s"  => \$opt_test_dbcon, | 
| 1502 |  |  |  |  |  |  | "lf=s"  => \$opt_log_file, | 
| 1503 |  |  |  |  |  |  | "lg=i"  => \$opt_log_gdg, | 
| 1504 |  |  |  |  |  |  | "lp=s"  => \$opt_log_prefix, | 
| 1505 |  |  |  |  |  |  | "lr=i"  => \$opt_log_radix, | 
| 1506 |  |  |  |  |  |  | "ll=s"  => \$opt_logging_levels, | 
| 1507 |  |  |  |  |  |  | "cl=s"  => \$opt_console_levels, | 
| 1508 |  |  |  |  |  |  | "ne"    => \$opt_notify_email_oncomp, | 
| 1509 |  |  |  |  |  |  | "np"    => \$opt_notify_pager_oncomp, | 
| 1510 |  |  |  |  |  |  | "et=s"  => \$opt_notify_email_tolist, | 
| 1511 |  |  |  |  |  |  | "el=s"  => \$opt_notify_email_levels, | 
| 1512 |  |  |  |  |  |  | "pt=s"  => \$opt_notify_pager_tolist, | 
| 1513 |  |  |  |  |  |  | "pl=s"  => \$opt_notify_pager_levels, | 
| 1514 |  |  |  |  |  |  | "dp"    => \$opt_disp_params, | 
| 1515 |  |  |  |  |  |  | "dq"    => \$opt_disp_sql, | 
| 1516 |  |  |  |  |  |  | "dd"    => \$opt_disp_doc, | 
| 1517 |  |  |  |  |  |  | "dl"    => \$opt_disp_logprev, | 
| 1518 |  |  |  |  |  |  | "da"    => \$opt_disp_logarch, | 
| 1519 |  |  |  |  |  |  | "dj"    => \$opt_disp_jobs, | 
| 1520 |  |  |  |  |  |  | "dja"   => \$opt_disp_active_jobs, | 
| 1521 |  |  |  |  |  |  | "se=s"  => \$opt_send_email, | 
| 1522 |  |  |  |  |  |  | "sp=s"  => \$opt_send_pager, | 
| 1523 |  |  |  |  |  |  | "um"    => \$opt_util_move, | 
| 1524 |  |  |  |  |  |  | "h"     => \$opt_help, | 
| 1525 |  |  |  |  |  |  | "ha"    => \$opt_help_args, | 
| 1526 |  |  |  |  |  |  | ) || _sys_help(0); | 
| 1527 |  |  |  |  |  |  |  | 
| 1528 | 0 | 0 |  |  |  | 0 | if ( $opt_connection ) { | 
| 1529 | 0 |  |  |  |  | 0 | foreach my $connectdef ( split m/,/, $opt_connection ) { | 
| 1530 | 0 |  |  |  |  | 0 | my ($db, $inst) = split m/:/, $connectdef; | 
| 1531 | 0 | 0 |  |  |  | 0 | _check_array_val( $db, \@databases ) | 
| 1532 |  |  |  |  |  |  | || sys_die( "Invalid database: [$db]", 0 ); | 
| 1533 | 0 | 0 |  |  |  | 0 | _check_array_val( $inst, [split m/,/, $dbinst{$db}] ) | 
| 1534 |  |  |  |  |  |  | || sys_die( "Invalid database instance: [$db.$inst]", 0 ); | 
| 1535 |  |  |  |  |  |  | ## update default connection data | 
| 1536 | 0 |  |  |  |  | 0 | $dbdefenvr{$db} = $inst; | 
| 1537 |  |  |  |  |  |  | } | 
| 1538 |  |  |  |  |  |  | } | 
| 1539 |  |  |  |  |  |  |  | 
| 1540 |  |  |  |  |  |  | # create dbitrace file if not found | 
| 1541 | 0 | 0 |  |  |  | 0 | if ( ! -e $dbitrace_filefull ) { | 
| 1542 | 0 |  | 0 |  |  | 0 | open my $fh, ">", $dbitrace_filefull | 
| 1543 |  |  |  |  |  |  | || sys_die( 'Unable to open dbitrace file', 0 ); | 
| 1544 | 0 |  |  |  |  | 0 | close $fh; | 
| 1545 |  |  |  |  |  |  | } | 
| 1546 |  |  |  |  |  |  |  | 
| 1547 | 0 | 0 |  |  |  | 0 | if ( $opt_help                ) { | 
| 1548 | 0 |  |  |  |  | 0 | _sys_help( 1 ); } | 
| 1549 | 0 | 0 |  |  |  | 0 | if ( $opt_help_args           ) { | 
| 1550 | 0 |  |  |  |  | 0 | _sys_help( 2 ); } | 
| 1551 | 0 | 0 |  |  |  | 0 | if ( $opt_run_background      ) { | 
| 1552 | 0 |  |  |  |  | 0 | _sys_run_background(); } | 
| 1553 | 0 | 0 |  |  |  | 0 | if ( $opt_run_scheduled       ) { | 
| 1554 | 0 |  |  |  |  | 0 | _sys_run_scheduled(); } | 
| 1555 | 0 | 0 |  |  |  | 0 | if ( $opt_run_de              ) { | 
| 1556 | 0 |  |  |  |  | 0 | _sys_run_de( $opt_run_de ); } | 
| 1557 | 0 | 0 |  |  |  | 0 | if ( $opt_run_restart         ) { | 
| 1558 | 0 |  |  |  |  | 0 | _sys_run_restart(); } | 
| 1559 | 0 | 0 |  |  |  | 0 | if ( $opt_test_dbcon          ) { | 
| 1560 | 0 |  |  |  |  | 0 | _sys_test_dbcon( $opt_test_dbcon); } | 
| 1561 | 0 | 0 |  |  |  | 0 | if ( $opt_commandline_ext     ) { | 
| 1562 | 0 |  |  |  |  | 0 | $commandline_ext = $opt_commandline_ext; } | 
| 1563 | 0 | 0 |  |  |  | 0 | if ( $opt_logging_levels      ) { | 
| 1564 | 0 |  |  |  |  | 0 | $log_logging_levels = _sys_check_severity_levels( $opt_logging_levels ); } | 
| 1565 | 0 | 0 |  |  |  | 0 | if ( $opt_console_levels      ) { | 
| 1566 | 0 |  |  |  |  | 0 | $log_console_levels = _sys_check_severity_levels( $opt_console_levels ); } | 
| 1567 | 0 | 0 |  |  |  | 0 | if ( $opt_log_gdg             ) { | 
| 1568 | 0 |  |  |  |  | 0 | $log_gdg = _sys_check_log_gdg( $opt_log_gdg ); } | 
| 1569 | 0 | 0 |  |  |  | 0 | if ( $opt_log_prefix          ) { | 
| 1570 | 0 |  |  |  |  | 0 | $log_prefix = $opt_log_prefix; } | 
| 1571 | 0 | 0 |  |  |  | 0 | if ( $opt_log_radix           ) { | 
| 1572 | 0 |  |  |  |  | 0 | $log_radix = _sys_check_log_radix( $opt_log_radix ); } | 
| 1573 | 0 | 0 |  |  |  | 0 | if ( $opt_notify_email_tolist ) { | 
| 1574 | 0 |  |  |  |  | 0 | $mail_emailto = $opt_notify_email_tolist; } | 
| 1575 | 0 | 0 |  |  |  | 0 | if ( $opt_notify_pager_tolist ) { | 
| 1576 | 0 |  |  |  |  | 0 | $mail_pagerto = $opt_notify_pager_tolist; } | 
| 1577 | 0 | 0 |  |  |  | 0 | if ( $opt_notify_email_levels ) { | 
| 1578 | 0 |  |  |  |  | 0 | $mail_email_levels = _sys_check_severity_levels( $opt_notify_email_levels ); } | 
| 1579 | 0 | 0 |  |  |  | 0 | if ( $opt_notify_pager_levels ) { | 
| 1580 | 0 |  |  |  |  | 0 | $mail_pager_levels = _sys_check_severity_levels( $opt_notify_pager_levels ); } | 
| 1581 | 0 | 0 |  |  |  | 0 | if ( $opt_disp_logprev        ) { | 
| 1582 | 0 |  |  |  |  | 0 | _sys_disp_logprev(); } | 
| 1583 | 0 | 0 |  |  |  | 0 | if ( $opt_disp_logarch        ) { | 
| 1584 | 0 |  |  |  |  | 0 | _sys_disp_logarch(); } | 
| 1585 | 0 | 0 |  |  |  | 0 | if ( $opt_disp_exec           ) { | 
| 1586 | 0 |  |  |  |  | 0 | _sys_disp_exec(); } | 
| 1587 | 0 | 0 |  |  |  | 0 | if ( $opt_disp_sql            ) { | 
| 1588 | 0 |  |  |  |  | 0 | _sys_disp_sql(); } | 
| 1589 | 0 | 0 |  |  |  | 0 | if ( $opt_disp_params         ) { | 
| 1590 | 0 |  |  |  |  | 0 | _sys_disp_params(); } | 
| 1591 | 0 | 0 |  |  |  | 0 | if ( $opt_disp_doc            ) { | 
| 1592 | 0 |  |  |  |  | 0 | _sys_disp_doc(); } | 
| 1593 | 0 | 0 |  |  |  | 0 | if ( $opt_disp_jobs           ) { | 
| 1594 | 0 |  |  |  |  | 0 | _sys_disp_jobs(); } | 
| 1595 | 0 | 0 |  |  |  | 0 | if ( $opt_disp_active_jobs    ) { | 
| 1596 | 0 |  |  |  |  | 0 | _sys_disp_active_jobs( 0 ); } | 
| 1597 | 0 | 0 |  |  |  | 0 | if ( $opt_send_email          ) { | 
| 1598 | 0 |  |  |  |  | 0 | _sys_send_email_message($opt_send_email); } | 
| 1599 | 0 | 0 |  |  |  | 0 | if ( $opt_send_pager          ) { | 
| 1600 | 0 |  |  |  |  | 0 | _sys_send_pager_message($opt_send_pager); } | 
| 1601 | 0 | 0 |  |  |  | 0 | if ( $opt_util_move           ) { | 
| 1602 | 0 |  |  |  |  | 0 | $util_move = 0; } | 
| 1603 |  |  |  |  |  |  |  | 
| 1604 |  |  |  |  |  |  | # must have a Run option to continue | 
| 1605 | 0 | 0 |  |  |  | 0 | if ( ! $opt_run ) { | 
| 1606 | 0 |  |  |  |  | 0 | _sys_help(1); | 
| 1607 |  |  |  |  |  |  | } | 
| 1608 |  |  |  |  |  |  |  | 
| 1609 | 0 |  |  |  |  | 0 | $log_file = $log_prefix . $jobname . $log_ext;  # default | 
| 1610 |  |  |  |  |  |  |  | 
| 1611 | 0 | 0 |  |  |  | 0 | if ( $osuser ) {  # custom | 
| 1612 | 0 |  |  |  |  | 0 | $log_file = $log_prefix . $jobname . '_' . $osuser . $log_ext; | 
| 1613 |  |  |  |  |  |  | } | 
| 1614 | 0 |  |  |  |  | 0 | $log_filefull = $path_log_dir . $log_file; | 
| 1615 |  |  |  |  |  |  |  | 
| 1616 | 0 | 0 |  |  |  | 0 | if ( $opt_log_file ) {  # override | 
| 1617 | 0 |  |  |  |  | 0 | $log_file = $opt_log_file; | 
| 1618 | 0 |  |  |  |  | 0 | $log_filefull = $path_log_dir . $log_file; | 
| 1619 |  |  |  |  |  |  | } | 
| 1620 |  |  |  |  |  |  |  | 
| 1621 | 0 |  |  |  |  | 0 | _log_init_log_file();  # log rotation handler | 
| 1622 |  |  |  |  |  |  |  | 
| 1623 |  |  |  |  |  |  | # validate script name using configured acros | 
| 1624 | 0 |  |  |  |  | 0 | my ($base, $path, $type) = fileparse( $script_file ); | 
| 1625 | 0 | 0 |  |  |  | 0 | if ( $base =~ m/^([a-z]+_)/x ) {  ## acro + underscore | 
| 1626 | 0 |  |  |  |  | 0 | $base = $1; | 
| 1627 |  |  |  |  |  |  | } | 
| 1628 | 0 | 0 |  |  |  | 0 | _check_array_val($base, \@job_acros) || sys_die( "Not a valid job acro", 0 ); | 
| 1629 |  |  |  |  |  |  |  | 
| 1630 | 0 |  |  |  |  | 0 | _sys_init_source_validation(); | 
| 1631 |  |  |  |  |  |  |  | 
| 1632 | 0 |  |  |  |  | 0 | sys_timer( 'start', '__default_timer' ); | 
| 1633 |  |  |  |  |  |  |  | 
| 1634 | 0 | 0 |  |  |  | 0 | log_info( "Start: $jobname" ) unless $opt_no_greeting; | 
| 1635 |  |  |  |  |  |  |  | 
| 1636 | 0 | 0 |  |  |  | 0 | if ( $opt_very_verbose ) { $opt_verbose = 1; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 1637 | 0 | 0 |  |  |  | 0 | if ( $opt_verbose ) { | 
| 1638 | 0 |  |  |  |  | 0 | log_info( 'Running in verbose mode' ); | 
| 1639 | 0 |  |  |  |  | 0 | log_info( "Process: $pid" ); | 
| 1640 | 0 |  |  |  |  | 0 | log_info( "Options: $opt_commandline" ); | 
| 1641 |  |  |  |  |  |  | } | 
| 1642 |  |  |  |  |  |  |  | 
| 1643 | 0 | 0 |  |  |  | 0 | if ( $sys_jobconf_override ) { | 
| 1644 | 0 |  |  |  |  | 0 | log_info( "Jobconf override: $sys_jobconf_file" ); | 
| 1645 |  |  |  |  |  |  | } | 
| 1646 |  |  |  |  |  |  |  | 
| 1647 | 0 |  |  |  |  | 0 | _sys_job_init(); | 
| 1648 |  |  |  |  |  |  |  | 
| 1649 | 0 |  |  |  |  | 0 | return 0; | 
| 1650 |  |  |  |  |  |  | } | 
| 1651 |  |  |  |  |  |  |  | 
| 1652 |  |  |  |  |  |  | sub sys_init_setuser { | 
| 1653 |  |  |  |  |  |  | =begin wiki | 
| 1654 |  |  |  |  |  |  |  | 
| 1655 |  |  |  |  |  |  | !3 sys_init_setuser | 
| 1656 |  |  |  |  |  |  |  | 
| 1657 |  |  |  |  |  |  | ( jn, cl ) | 
| 1658 |  |  |  |  |  |  |  | 
| 1659 |  |  |  |  |  |  | Please write this documentation. | 
| 1660 |  |  |  |  |  |  |  | 
| 1661 |  |  |  |  |  |  | =cut | 
| 1662 | 0 |  |  | 0 | 0 | 0 | my ($jn, @cl) = @_; | 
| 1663 | 0 |  | 0 |  |  | 0 | $osuser = getlogin || 'unknown'; | 
| 1664 | 0 |  |  |  |  | 0 | sys_init( $jn, @cl ); | 
| 1665 | 0 |  |  |  |  | 0 | return 0; | 
| 1666 |  |  |  |  |  |  | } | 
| 1667 |  |  |  |  |  |  |  | 
| 1668 |  |  |  |  |  |  | sub sys_end { | 
| 1669 |  |  |  |  |  |  | =begin wiki | 
| 1670 |  |  |  |  |  |  |  | 
| 1671 |  |  |  |  |  |  | !3 sys_end | 
| 1672 |  |  |  |  |  |  |  | 
| 1673 |  |  |  |  |  |  | No Parameters | 
| 1674 |  |  |  |  |  |  |  | 
| 1675 |  |  |  |  |  |  | Please write this documentation. | 
| 1676 |  |  |  |  |  |  |  | 
| 1677 |  |  |  |  |  |  | =cut | 
| 1678 | 0 |  |  | 0 | 0 | 0 | _sys_job_end(); | 
| 1679 |  |  |  |  |  |  |  | 
| 1680 | 0 | 0 |  |  |  | 0 | if ( $opt_no_greeting ) { return 0; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 1681 |  |  |  |  |  |  |  | 
| 1682 | 0 |  |  |  |  | 0 | sys_timer( 'stop', '__default_timer' ); | 
| 1683 |  |  |  |  |  |  |  | 
| 1684 | 0 |  |  |  |  | 0 | log_info( "Errorlevel: $errorlevel" ); | 
| 1685 | 0 |  |  |  |  | 0 | log_info( "Elapsed time: " . sys_timer( 'elapsed', '__default_timer' ) ); | 
| 1686 | 0 | 0 |  |  |  | 0 | log_info( "End: $jobname" ) unless $opt_no_greeting; | 
| 1687 |  |  |  |  |  |  |  | 
| 1688 | 0 |  |  |  |  | 0 | return 0; | 
| 1689 |  |  |  |  |  |  | } | 
| 1690 |  |  |  |  |  |  |  | 
| 1691 |  |  |  |  |  |  | sub sys_load_library { | 
| 1692 |  |  |  |  |  |  | =begin wiki | 
| 1693 |  |  |  |  |  |  |  | 
| 1694 |  |  |  |  |  |  | !3 sys_load_library | 
| 1695 |  |  |  |  |  |  |  | 
| 1696 |  |  |  |  |  |  | ( conf_filename ) | 
| 1697 |  |  |  |  |  |  |  | 
| 1698 |  |  |  |  |  |  | Give the user an opportunity to load a different conf file replacing the \ | 
| 1699 |  |  |  |  |  |  | contents of sys_common.conf with the requested conf file contents. | 
| 1700 |  |  |  |  |  |  |  | 
| 1701 |  |  |  |  |  |  | =cut | 
| 1702 | 0 |  |  | 0 | 0 | 0 | my $conf_filename = shift; | 
| 1703 |  |  |  |  |  |  |  | 
| 1704 |  |  |  |  |  |  | ## load a conf file replacing the contents of sys_common.conf | 
| 1705 | 0 | 0 |  |  |  | 0 | tie %conf_query, 'Config::IniFiles', ( -file => $path_conf_dir.'/'.$conf_filename ) | 
| 1706 |  |  |  |  |  |  | or sys_die( "Unable to load conf file $conf_filename", 0 ); | 
| 1707 | 0 |  |  |  |  | 0 | return 0; | 
| 1708 |  |  |  |  |  |  | } | 
| 1709 |  |  |  |  |  |  |  | 
| 1710 |  |  |  |  |  |  | sub sys_init_plugin { | 
| 1711 |  |  |  |  |  |  | =begin wiki | 
| 1712 |  |  |  |  |  |  |  | 
| 1713 |  |  |  |  |  |  | !3 sys_init_plugin | 
| 1714 |  |  |  |  |  |  |  | 
| 1715 |  |  |  |  |  |  | ( plugin_file, package_name ) | 
| 1716 |  |  |  |  |  |  |  | 
| 1717 |  |  |  |  |  |  | Provide plugin support. This function accepts a plugin filename and attempts \ | 
| 1718 |  |  |  |  |  |  | to load a plugin file by that name from the plugin directory. Plugins are \ | 
| 1719 |  |  |  |  |  |  | standard Perl modules with nothing exported. The package name used by the \ | 
| 1720 |  |  |  |  |  |  | module is also passed in to this function and is used to call an \ | 
| 1721 |  |  |  |  |  |  | initialization function named start. | 
| 1722 |  |  |  |  |  |  |  | 
| 1723 |  |  |  |  |  |  | Plugins should always implement a start and an end function, these take no \ | 
| 1724 |  |  |  |  |  |  | parameters. All plugins should also implement a main plugin function named \ | 
| 1725 |  |  |  |  |  |  | odly enough, plugin_main. The start and end functions should not take any \ | 
| 1726 |  |  |  |  |  |  | parameters. The main plugin function can be written to accept whatever \ | 
| 1727 |  |  |  |  |  |  | parameters are needed. | 
| 1728 |  |  |  |  |  |  |  | 
| 1729 |  |  |  |  |  |  | This little bit of deep magic by merlyn gleened from the Perl Monastery was \ | 
| 1730 |  |  |  |  |  |  | very educational (I almost had it before finding this): | 
| 1731 |  |  |  |  |  |  |  | 
| 1732 |  |  |  |  |  |  | % language=Perl | 
| 1733 |  |  |  |  |  |  | %    my %codeRefs = map { | 
| 1734 |  |  |  |  |  |  | %       "Package"->can($_) || sub { die "can't find $_" } | 
| 1735 |  |  |  |  |  |  | %   } qw(subroutine1 subroutine2 subroutine3); | 
| 1736 |  |  |  |  |  |  | %% | 
| 1737 |  |  |  |  |  |  |  | 
| 1738 |  |  |  |  |  |  | Merlyn, aka, Tom Christensen??? | 
| 1739 |  |  |  |  |  |  |  | 
| 1740 |  |  |  |  |  |  | =cut | 
| 1741 | 0 |  |  | 0 | 0 | 0 | my ($plugin_file, $package_name) = @_; | 
| 1742 |  |  |  |  |  |  |  | 
| 1743 | 0 |  |  |  |  | 0 | my $plugin_filefull = $path_plugin_dir.$plugin_file.'.pm'; | 
| 1744 | 0 | 0 |  |  |  | 0 | unless ( -f $plugin_filefull ) { sys_die( "Plugin not found: $plugin_file", 0 ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 1745 |  |  |  |  |  |  |  | 
| 1746 | 0 |  |  |  |  | 0 | require $plugin_filefull; | 
| 1747 |  |  |  |  |  |  |  | 
| 1748 | 0 |  |  |  |  | 0 | push @plugins, join '~', ($package_name, $plugin_file, $plugin_filefull); | 
| 1749 | 0 |  |  |  |  | 0 | $package_name->start($path_conf_dir, $path_plugin_dir, $dataenvr); | 
| 1750 | 0 |  |  |  |  | 0 | return $package_name->can('plugin_main');   ## deep magic | 
| 1751 |  |  |  |  |  |  | } | 
| 1752 |  |  |  |  |  |  |  | 
| 1753 |  |  |  |  |  |  | sub sys_ctime2str { | 
| 1754 |  |  |  |  |  |  | =begin wiki | 
| 1755 |  |  |  |  |  |  |  | 
| 1756 |  |  |  |  |  |  | !3 sys_time2str | 
| 1757 |  |  |  |  |  |  |  | 
| 1758 |  |  |  |  |  |  | ( format ) | 
| 1759 |  |  |  |  |  |  |  | 
| 1760 |  |  |  |  |  |  | This is an interface to the Data::Format::time2str function. This simply \ | 
| 1761 |  |  |  |  |  |  | provides an easier way for the job script to make use of the time2str \ | 
| 1762 |  |  |  |  |  |  | function for acquiring a formatted current date/time. You can pass as a \ | 
| 1763 |  |  |  |  |  |  | format string any of the following meta characters. | 
| 1764 |  |  |  |  |  |  |  | 
| 1765 |  |  |  |  |  |  | |%% |PERCENT| | 
| 1766 |  |  |  |  |  |  | |%a |day of the week abbr| | 
| 1767 |  |  |  |  |  |  | |%A |day of the week| | 
| 1768 |  |  |  |  |  |  | |%b |month abbr| | 
| 1769 |  |  |  |  |  |  | |%B |month| | 
| 1770 |  |  |  |  |  |  | |%c |MM/DD/YY HH:MM:SS| | 
| 1771 |  |  |  |  |  |  | |%C |ctime format: Sat Nov 19 21:05:57 1994| | 
| 1772 |  |  |  |  |  |  | |%d |numeric day of the month, with leading zeros (eg 01..31)| | 
| 1773 |  |  |  |  |  |  | |%e |numeric day of the month, without leading zeros (eg 1..31)| | 
| 1774 |  |  |  |  |  |  | |%D |MM/DD/YY| | 
| 1775 |  |  |  |  |  |  | |%G |GPS week number (weeks since January 6, 1980)| | 
| 1776 |  |  |  |  |  |  | |%h |month abbr| | 
| 1777 |  |  |  |  |  |  | |%H |hour, 24 hour clock, leading 0's)| | 
| 1778 |  |  |  |  |  |  | |%I |hour, 12 hour clock, leading 0's)| | 
| 1779 |  |  |  |  |  |  | |%j |day of the year| | 
| 1780 |  |  |  |  |  |  | |%k |hour| | 
| 1781 |  |  |  |  |  |  | |%l |hour, 12 hour clock| | 
| 1782 |  |  |  |  |  |  | |%L |month number, starting with 1| | 
| 1783 |  |  |  |  |  |  | |%m |month number, starting with 01| | 
| 1784 |  |  |  |  |  |  | |%M |minute, leading 0's| | 
| 1785 |  |  |  |  |  |  | |%n |NEWLINE| | 
| 1786 |  |  |  |  |  |  | |%o |ornate day of month -- "1st", "2nd", "25th", etc.| | 
| 1787 |  |  |  |  |  |  | |%p |AM or PM| | 
| 1788 |  |  |  |  |  |  | |%P |am or pm (Yes %p and %P are backwards :)| | 
| 1789 |  |  |  |  |  |  | |%q |Quarter number, starting with 1| | 
| 1790 |  |  |  |  |  |  | |%r |time format: 09:05:57 PM| | 
| 1791 |  |  |  |  |  |  | |%R |time format: 21:05| | 
| 1792 |  |  |  |  |  |  | |%s |seconds since the Epoch, UCT| | 
| 1793 |  |  |  |  |  |  | |%S |seconds, leading 0's| | 
| 1794 |  |  |  |  |  |  | |%t |TAB| | 
| 1795 |  |  |  |  |  |  | |%T |time format: 21:05:57| | 
| 1796 |  |  |  |  |  |  | |%U |week number, Sunday as first day of week| | 
| 1797 |  |  |  |  |  |  | |%w |day of the week, numerically, Sunday == 0| | 
| 1798 |  |  |  |  |  |  | |%W |week number, Monday as first day of week| | 
| 1799 |  |  |  |  |  |  | |%x |date format: 11/19/94| | 
| 1800 |  |  |  |  |  |  | |%X |time format: 21:05:57| | 
| 1801 |  |  |  |  |  |  | |%y |year (2 digits)| | 
| 1802 |  |  |  |  |  |  | |%Y |year (4 digits)| | 
| 1803 |  |  |  |  |  |  | |%Z |timezone in ascii. eg: PST| | 
| 1804 |  |  |  |  |  |  | |%z |timezone in format -/+0000| | 
| 1805 |  |  |  |  |  |  |  | 
| 1806 |  |  |  |  |  |  | /end of table/ | 
| 1807 |  |  |  |  |  |  |  | 
| 1808 |  |  |  |  |  |  | =cut | 
| 1809 | 0 |  |  | 0 | 0 | 0 | my $format = shift; | 
| 1810 | 0 |  |  |  |  | 0 | return time2str($format, time); | 
| 1811 |  |  |  |  |  |  | } | 
| 1812 |  |  |  |  |  |  |  | 
| 1813 |  |  |  |  |  |  | sub sys_die { | 
| 1814 |  |  |  |  |  |  | =begin wiki | 
| 1815 |  |  |  |  |  |  |  | 
| 1816 |  |  |  |  |  |  | !3 sys_die | 
| 1817 |  |  |  |  |  |  |  | 
| 1818 |  |  |  |  |  |  | Parameters: ( message, notify ) | 
| 1819 |  |  |  |  |  |  |  | 
| 1820 |  |  |  |  |  |  | Print a message to STDOUT and then exit returning $errorlevel $RC_FATAL. The \ | 
| 1821 |  |  |  |  |  |  | message is printed to STDOUT because STDERR is redirected while running. | 
| 1822 |  |  |  |  |  |  |  | 
| 1823 |  |  |  |  |  |  | =cut | 
| 1824 | 0 |  |  | 0 | 0 | 0 | my ($message, $notify) = @_; | 
| 1825 | 0 | 0 |  |  |  | 0 | $notify = 0 unless defined $notify; | 
| 1826 | 0 |  |  |  |  | 0 | $errorlevel = $RC_FATAL; | 
| 1827 |  |  |  |  |  |  |  | 
| 1828 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'FATAL', $notify, $message ); | 
| 1829 |  |  |  |  |  |  |  | 
| 1830 | 0 | 0 |  |  |  | 0 | if ( $sys_log_open ) { | 
| 1831 | 0 |  |  |  |  | 0 | _log_write_to_log( 'FATAL', $notify, $message ); | 
| 1832 |  |  |  |  |  |  | } | 
| 1833 |  |  |  |  |  |  |  | 
| 1834 |  |  |  |  |  |  | ## save a call if possible | 
| 1835 | 0 | 0 |  |  |  | 0 | if ( $notify ) { _log_send_notifications( 'FATAL', $notify, $message ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 1836 |  |  |  |  |  |  |  | 
| 1837 | 0 |  |  |  |  | 0 | _sys_job_end(); | 
| 1838 |  |  |  |  |  |  |  | 
| 1839 | 0 |  |  |  |  | 0 | exit $errorlevel; | 
| 1840 |  |  |  |  |  |  | } | 
| 1841 |  |  |  |  |  |  |  | 
| 1842 |  |  |  |  |  |  | sub sys_warn { | 
| 1843 |  |  |  |  |  |  | =begin wiki | 
| 1844 |  |  |  |  |  |  |  | 
| 1845 |  |  |  |  |  |  | !3 sys_warn | 
| 1846 |  |  |  |  |  |  |  | 
| 1847 |  |  |  |  |  |  | Parameters: ( message, notify ) | 
| 1848 |  |  |  |  |  |  |  | 
| 1849 |  |  |  |  |  |  | Print a message to STDOUT and then return to caller setting $errorlevel \ | 
| 1850 |  |  |  |  |  |  | $RC_WARN. The message is printed to STDOUT because STDERR is redirected \ | 
| 1851 |  |  |  |  |  |  | while running. | 
| 1852 |  |  |  |  |  |  |  | 
| 1853 |  |  |  |  |  |  | =cut | 
| 1854 | 0 |  |  | 0 | 0 | 0 | my ($message, $notify) = @_; | 
| 1855 | 0 | 0 |  |  |  | 0 | $notify = 1 unless defined $notify; | 
| 1856 | 0 |  |  |  |  | 0 | $errorlevel = $RC_WARN; | 
| 1857 |  |  |  |  |  |  |  | 
| 1858 |  |  |  |  |  |  | ## force write to screen | 
| 1859 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'WARN', 1, $message ); | 
| 1860 |  |  |  |  |  |  |  | 
| 1861 |  |  |  |  |  |  | ## force write to log if log is open | 
| 1862 | 0 | 0 |  |  |  | 0 | if ( $sys_log_open ) { | 
| 1863 | 0 |  |  |  |  | 0 | _log_write_to_log( 'WARN', 1, $message ); | 
| 1864 |  |  |  |  |  |  | } | 
| 1865 |  |  |  |  |  |  |  | 
| 1866 |  |  |  |  |  |  | ## force notifications if notification requested | 
| 1867 | 0 | 0 |  |  |  | 0 | if ( $notify ) { _log_send_notifications( 'WARN', 1, $message ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 1868 |  |  |  |  |  |  |  | 
| 1869 | 0 |  |  |  |  | 0 | return $errorlevel; | 
| 1870 |  |  |  |  |  |  | } | 
| 1871 |  |  |  |  |  |  |  | 
| 1872 |  |  |  |  |  |  | sub sys_info { | 
| 1873 |  |  |  |  |  |  | =begin wiki | 
| 1874 |  |  |  |  |  |  |  | 
| 1875 |  |  |  |  |  |  | !3 sys_info | 
| 1876 |  |  |  |  |  |  |  | 
| 1877 |  |  |  |  |  |  | Parameters: ( message, notify ) | 
| 1878 |  |  |  |  |  |  |  | 
| 1879 |  |  |  |  |  |  | =cut | 
| 1880 | 0 |  |  | 0 | 0 | 0 | my ($message, $extmsg, $notify, $nolog) = @_; | 
| 1881 | 0 | 0 |  |  |  | 0 | $notify = 1 unless defined $notify; | 
| 1882 | 0 | 0 |  |  |  | 0 | $nolog = 0 unless defined $nolog; | 
| 1883 |  |  |  |  |  |  |  | 
| 1884 |  |  |  |  |  |  | ## get destination email address from job conf | 
| 1885 | 0 |  |  |  |  | 0 | my $emailto = sys_get_item( 'sys_info_emailto' ); | 
| 1886 | 0 |  |  |  |  | 0 | my $mail_emailto_save = $mail_emailto; | 
| 1887 | 0 |  |  |  |  | 0 | $mail_emailto = $emailto; | 
| 1888 |  |  |  |  |  |  |  | 
| 1889 | 0 |  |  |  |  | 0 | log_info( $message, $extmsg, $nolog ); | 
| 1890 | 0 | 0 |  |  |  | 0 | _log_send_notifications( 'INFO', 1, $message ) if $notify; | 
| 1891 |  |  |  |  |  |  |  | 
| 1892 | 0 |  |  |  |  | 0 | $mail_emailto = $mail_emailto_save; | 
| 1893 | 0 |  |  |  |  | 0 | return 0; | 
| 1894 |  |  |  |  |  |  | } | 
| 1895 |  |  |  |  |  |  |  | 
| 1896 |  |  |  |  |  |  | sub sys_disp_active_jobs { | 
| 1897 |  |  |  |  |  |  | =begin wiki | 
| 1898 |  |  |  |  |  |  |  | 
| 1899 |  |  |  |  |  |  | !3 sys_disp_active_jobs | 
| 1900 |  |  |  |  |  |  |  | 
| 1901 |  |  |  |  |  |  | No Parameters | 
| 1902 |  |  |  |  |  |  |  | 
| 1903 |  |  |  |  |  |  | Please write this documentation. | 
| 1904 |  |  |  |  |  |  |  | 
| 1905 |  |  |  |  |  |  | =cut | 
| 1906 | 0 |  |  | 0 | 0 | 0 | _sys_disp_active_jobs( 1 ); | 
| 1907 | 0 |  |  |  |  | 0 | return 0; | 
| 1908 |  |  |  |  |  |  | } | 
| 1909 |  |  |  |  |  |  |  | 
| 1910 |  |  |  |  |  |  | sub sys_run_job { | 
| 1911 |  |  |  |  |  |  | =begin wiki | 
| 1912 |  |  |  |  |  |  |  | 
| 1913 |  |  |  |  |  |  | !3 sys_run_job | 
| 1914 |  |  |  |  |  |  |  | 
| 1915 |  |  |  |  |  |  | Parameters: (jobname, job_maxrc, params ) | 
| 1916 |  |  |  |  |  |  |  | 
| 1917 |  |  |  |  |  |  | |$job    |name of script or application to execute| | 
| 1918 |  |  |  |  |  |  | |@params |list of parameters to pass to the executed process| | 
| 1919 |  |  |  |  |  |  |  | 
| 1920 |  |  |  |  |  |  | This function usese the built-in Perl system function to invoke a JCL script \ | 
| 1921 |  |  |  |  |  |  | (or other application). As such, this function will wait until the child \ | 
| 1922 |  |  |  |  |  |  | completes before returning to the caller. | 
| 1923 |  |  |  |  |  |  |  | 
| 1924 |  |  |  |  |  |  | A reasonable attempt is made to insure that the process execute is invoked \ | 
| 1925 |  |  |  |  |  |  | via a shell. This is accomplished by passing the system function the \ | 
| 1926 |  |  |  |  |  |  | paramaters as a quoted string, rather than as a list. | 
| 1927 |  |  |  |  |  |  |  | 
| 1928 |  |  |  |  |  |  | Returns: Process return code from the script/application executed. | 
| 1929 |  |  |  |  |  |  |  | 
| 1930 |  |  |  |  |  |  | =cut | 
| 1931 | 0 |  |  | 0 | 0 | 0 | my ($jobname, $job_maxrc, @params) = @_; | 
| 1932 |  |  |  |  |  |  |  | 
| 1933 | 0 |  |  |  |  | 0 | my @args = ($jobname, @params); | 
| 1934 | 0 |  |  |  |  | 0 | system(@args); | 
| 1935 | 0 |  |  |  |  | 0 | my $childrc = $CHILD_ERROR >> 8; | 
| 1936 |  |  |  |  |  |  |  | 
| 1937 | 0 | 0 |  |  |  | 0 | if ( $childrc > $job_maxrc ) { | 
| 1938 | 0 |  |  |  |  | 0 | sys_die( "Process failed with return code $childrc" ); | 
| 1939 |  |  |  |  |  |  | } | 
| 1940 |  |  |  |  |  |  |  | 
| 1941 | 0 | 0 |  |  |  | 0 | if ( $job_maxrc > $maxrc ) { $maxrc = $job_maxrc; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 1942 |  |  |  |  |  |  |  | 
| 1943 | 0 |  |  |  |  | 0 | return $childrc; | 
| 1944 |  |  |  |  |  |  | } | 
| 1945 |  |  |  |  |  |  |  | 
| 1946 |  |  |  |  |  |  | sub sys_run_job_background { | 
| 1947 |  |  |  |  |  |  | =begin wiki | 
| 1948 |  |  |  |  |  |  |  | 
| 1949 |  |  |  |  |  |  | !3 sys_run_job_background | 
| 1950 |  |  |  |  |  |  |  | 
| 1951 |  |  |  |  |  |  | Parameters: ( jobname, maxrc, params ) | 
| 1952 |  |  |  |  |  |  |  | 
| 1953 |  |  |  |  |  |  | Please write this documentation. | 
| 1954 |  |  |  |  |  |  |  | 
| 1955 |  |  |  |  |  |  | Returns: | 
| 1956 |  |  |  |  |  |  |  | 
| 1957 |  |  |  |  |  |  | =cut | 
| 1958 | 0 |  |  | 0 | 0 | 0 | my ($jobname, $maxrc, @params) = @_; | 
| 1959 | 0 | 0 |  |  |  | 0 | $maxrc = 0 unless $maxrc; | 
| 1960 |  |  |  |  |  |  |  | 
| 1961 | 0 |  |  |  |  | 0 | my $pid = _sys_forkexec( $jobname, @params ); | 
| 1962 | 0 |  |  |  |  | 0 | $pidlib{$pid} = { jobname => $jobname, | 
| 1963 |  |  |  |  |  |  | maxrc   => $maxrc, | 
| 1964 |  |  |  |  |  |  | retcd   => 0 | 
| 1965 |  |  |  |  |  |  | }; | 
| 1966 | 0 |  |  |  |  | 0 | $pidcnt++; | 
| 1967 | 0 |  |  |  |  | 0 | return $pid; | 
| 1968 |  |  |  |  |  |  | } | 
| 1969 |  |  |  |  |  |  |  | 
| 1970 |  |  |  |  |  |  | sub sys_run_job_wait { | 
| 1971 |  |  |  |  |  |  | =begin wiki | 
| 1972 |  |  |  |  |  |  |  | 
| 1973 |  |  |  |  |  |  | !3 sys_run_job_wait | 
| 1974 |  |  |  |  |  |  |  | 
| 1975 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 1976 |  |  |  |  |  |  |  | 
| 1977 |  |  |  |  |  |  | Please write this documentation. | 
| 1978 |  |  |  |  |  |  |  | 
| 1979 |  |  |  |  |  |  | Returns: | 
| 1980 |  |  |  |  |  |  |  | 
| 1981 |  |  |  |  |  |  | =cut | 
| 1982 | 0 | 0 |  | 0 | 0 | 0 | return 0 if $pidcnt < 1; | 
| 1983 | 0 |  |  |  |  | 0 | while (1) { | 
| 1984 | 0 |  |  |  |  | 0 | my $pid = _sys_reap_child(); | 
| 1985 | 0 |  |  |  |  | 0 | $pidcnt--; | 
| 1986 | 0 |  |  |  |  | 0 | my $childrc = $pidlib{$pid}{retcd}; | 
| 1987 | 0 |  |  |  |  | 0 | my $msg = "Complete $pidlib{$pid}{jobname}. Return code: $childrc."; | 
| 1988 | 0 | 0 |  |  |  | 0 | if ( $childrc > $pidlib{$pid}{maxrc} ) { | 
| 1989 |  |  |  |  |  |  | ## log_warn sets errorlevel | 
| 1990 | 0 |  |  |  |  | 0 | log_warn( "$msg Max allowed: $pidlib{$pid}{maxrc}." ); | 
| 1991 |  |  |  |  |  |  | } else { | 
| 1992 | 0 |  |  |  |  | 0 | log_info( $msg ); | 
| 1993 |  |  |  |  |  |  | } | 
| 1994 | 0 | 0 |  |  |  | 0 | last if $pidcnt < 1; | 
| 1995 |  |  |  |  |  |  | } | 
| 1996 | 0 |  |  |  |  | 0 | return $pidcnt; | 
| 1997 |  |  |  |  |  |  | } | 
| 1998 |  |  |  |  |  |  |  | 
| 1999 |  |  |  |  |  |  | sub sys_run_job_maxrc { | 
| 2000 |  |  |  |  |  |  | =begin wiki | 
| 2001 |  |  |  |  |  |  |  | 
| 2002 |  |  |  |  |  |  | !3 sys_run_job_maxrc | 
| 2003 |  |  |  |  |  |  |  | 
| 2004 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2005 |  |  |  |  |  |  |  | 
| 2006 |  |  |  |  |  |  | Please write this documentation. | 
| 2007 |  |  |  |  |  |  |  | 
| 2008 |  |  |  |  |  |  | Returns: | 
| 2009 |  |  |  |  |  |  |  | 
| 2010 |  |  |  |  |  |  | =cut | 
| 2011 |  |  |  |  |  |  | ## return the max of either the current background max return code or the | 
| 2012 |  |  |  |  |  |  | ## current foreground max return code | 
| 2013 | 0 |  |  | 0 | 0 | 0 | my $tmprc = 0; | 
| 2014 | 0 |  |  |  |  | 0 | foreach my $pid ( keys %pidlib ) { | 
| 2015 | 0 | 0 |  |  |  | 0 | if ( $pidlib{$pid}{retcd} > $tmprc ) { $tmprc = $pidlib{$pid}{retcd}; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 2016 |  |  |  |  |  |  | } | 
| 2017 |  |  |  |  |  |  |  | 
| 2018 | 0 | 0 |  |  |  | 0 | ( $tmprc >= $maxrc ) ? return $tmprc : return $maxrc; | 
| 2019 |  |  |  |  |  |  | } | 
| 2020 |  |  |  |  |  |  |  | 
| 2021 |  |  |  |  |  |  | sub sys_run_job_reset { | 
| 2022 |  |  |  |  |  |  | =begin wiki | 
| 2023 |  |  |  |  |  |  |  | 
| 2024 |  |  |  |  |  |  | !3 sys_run_job_reset | 
| 2025 |  |  |  |  |  |  |  | 
| 2026 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2027 |  |  |  |  |  |  |  | 
| 2028 |  |  |  |  |  |  | Please write this documentation. | 
| 2029 |  |  |  |  |  |  |  | 
| 2030 |  |  |  |  |  |  | Returns: | 
| 2031 |  |  |  |  |  |  |  | 
| 2032 |  |  |  |  |  |  | =cut | 
| 2033 | 0 |  |  | 0 | 0 | 0 | $pidcnt = 0;   ## reset background jobs count | 
| 2034 | 0 |  |  |  |  | 0 | %pidlib = ();  ## reset background jobs info hash | 
| 2035 | 0 |  |  |  |  | 0 | $maxrc = 0;    ## reset foreground jobs max return code | 
| 2036 | 0 |  |  |  |  | 0 | return 0; | 
| 2037 |  |  |  |  |  |  | } | 
| 2038 |  |  |  |  |  |  |  | 
| 2039 |  |  |  |  |  |  | sub sys_get_path_bin_dir { | 
| 2040 |  |  |  |  |  |  | =begin wiki | 
| 2041 |  |  |  |  |  |  |  | 
| 2042 |  |  |  |  |  |  | !3 sys_get_path_bin_dir | 
| 2043 |  |  |  |  |  |  |  | 
| 2044 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2045 |  |  |  |  |  |  |  | 
| 2046 |  |  |  |  |  |  | Please write this documentation. | 
| 2047 |  |  |  |  |  |  |  | 
| 2048 |  |  |  |  |  |  | Returns: | 
| 2049 |  |  |  |  |  |  |  | 
| 2050 |  |  |  |  |  |  | =cut | 
| 2051 | 0 |  |  | 0 | 0 | 0 | return $path_bin_dir; | 
| 2052 |  |  |  |  |  |  | } | 
| 2053 |  |  |  |  |  |  |  | 
| 2054 |  |  |  |  |  |  | sub sys_get_path_lib_dir { | 
| 2055 |  |  |  |  |  |  | =begin wiki | 
| 2056 |  |  |  |  |  |  |  | 
| 2057 |  |  |  |  |  |  | !3 sys_get_path_lib_dir | 
| 2058 |  |  |  |  |  |  |  | 
| 2059 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2060 |  |  |  |  |  |  |  | 
| 2061 |  |  |  |  |  |  | Please write this documentation. | 
| 2062 |  |  |  |  |  |  |  | 
| 2063 |  |  |  |  |  |  | Returns: | 
| 2064 |  |  |  |  |  |  |  | 
| 2065 |  |  |  |  |  |  | =cut | 
| 2066 | 0 |  |  | 0 | 0 | 0 | return $path_lib_dir; | 
| 2067 |  |  |  |  |  |  | } | 
| 2068 |  |  |  |  |  |  |  | 
| 2069 |  |  |  |  |  |  | sub sys_get_path_log_dir { | 
| 2070 |  |  |  |  |  |  | =begin wiki | 
| 2071 |  |  |  |  |  |  |  | 
| 2072 |  |  |  |  |  |  | !3 sys_get_path_log_dir | 
| 2073 |  |  |  |  |  |  |  | 
| 2074 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2075 |  |  |  |  |  |  |  | 
| 2076 |  |  |  |  |  |  | Please write this documentation. | 
| 2077 |  |  |  |  |  |  |  | 
| 2078 |  |  |  |  |  |  | Returns: | 
| 2079 |  |  |  |  |  |  |  | 
| 2080 |  |  |  |  |  |  | =cut | 
| 2081 | 0 |  |  | 0 | 0 | 0 | return $path_log_dir; | 
| 2082 |  |  |  |  |  |  | } | 
| 2083 |  |  |  |  |  |  |  | 
| 2084 |  |  |  |  |  |  | sub sys_get_path_load_dir { | 
| 2085 |  |  |  |  |  |  | =begin wiki | 
| 2086 |  |  |  |  |  |  |  | 
| 2087 |  |  |  |  |  |  | !3 sys_get_path_load_dir | 
| 2088 |  |  |  |  |  |  |  | 
| 2089 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2090 |  |  |  |  |  |  |  | 
| 2091 |  |  |  |  |  |  | Please write this documentation. | 
| 2092 |  |  |  |  |  |  |  | 
| 2093 |  |  |  |  |  |  | Returns: | 
| 2094 |  |  |  |  |  |  |  | 
| 2095 |  |  |  |  |  |  | =cut | 
| 2096 | 0 |  |  | 0 | 0 | 0 | return $path_load_dir; | 
| 2097 |  |  |  |  |  |  | } | 
| 2098 |  |  |  |  |  |  |  | 
| 2099 |  |  |  |  |  |  | sub sys_get_path_extr_dir { | 
| 2100 |  |  |  |  |  |  | =begin wiki | 
| 2101 |  |  |  |  |  |  |  | 
| 2102 |  |  |  |  |  |  | !3 sys_get_path_extr_dir | 
| 2103 |  |  |  |  |  |  |  | 
| 2104 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2105 |  |  |  |  |  |  |  | 
| 2106 |  |  |  |  |  |  | Please write this documentation. | 
| 2107 |  |  |  |  |  |  |  | 
| 2108 |  |  |  |  |  |  | Returns: | 
| 2109 |  |  |  |  |  |  |  | 
| 2110 |  |  |  |  |  |  | =cut | 
| 2111 | 0 |  |  | 0 | 0 | 0 | return $path_extr_dir; | 
| 2112 |  |  |  |  |  |  | } | 
| 2113 |  |  |  |  |  |  |  | 
| 2114 |  |  |  |  |  |  | sub sys_get_path_prev_dir { | 
| 2115 |  |  |  |  |  |  | =begin wiki | 
| 2116 |  |  |  |  |  |  |  | 
| 2117 |  |  |  |  |  |  | !3 sys_get_path_prev_dir | 
| 2118 |  |  |  |  |  |  |  | 
| 2119 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2120 |  |  |  |  |  |  |  | 
| 2121 |  |  |  |  |  |  | Please write this documentation. | 
| 2122 |  |  |  |  |  |  |  | 
| 2123 |  |  |  |  |  |  | Returns: | 
| 2124 |  |  |  |  |  |  |  | 
| 2125 |  |  |  |  |  |  | =cut | 
| 2126 | 0 |  |  | 0 | 0 | 0 | return $path_prev_dir; | 
| 2127 |  |  |  |  |  |  | } | 
| 2128 |  |  |  |  |  |  |  | 
| 2129 |  |  |  |  |  |  | sub sys_get_path_scripts_dir { | 
| 2130 |  |  |  |  |  |  | =begin wiki | 
| 2131 |  |  |  |  |  |  |  | 
| 2132 |  |  |  |  |  |  | !3 sys_get_path_scripts_dir | 
| 2133 |  |  |  |  |  |  |  | 
| 2134 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2135 |  |  |  |  |  |  |  | 
| 2136 |  |  |  |  |  |  | Please write this documentation. | 
| 2137 |  |  |  |  |  |  |  | 
| 2138 |  |  |  |  |  |  | Returns: | 
| 2139 |  |  |  |  |  |  |  | 
| 2140 |  |  |  |  |  |  | =cut | 
| 2141 | 0 |  |  | 0 | 0 | 0 | return $path_scripts_dir; | 
| 2142 |  |  |  |  |  |  | } | 
| 2143 |  |  |  |  |  |  |  | 
| 2144 |  |  |  |  |  |  | sub sys_get_path_plugin_dir { | 
| 2145 |  |  |  |  |  |  | =begin wiki | 
| 2146 |  |  |  |  |  |  |  | 
| 2147 |  |  |  |  |  |  | !3 sys_get_path_plugin_dir | 
| 2148 |  |  |  |  |  |  |  | 
| 2149 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2150 |  |  |  |  |  |  |  | 
| 2151 |  |  |  |  |  |  | Please write this documentation. | 
| 2152 |  |  |  |  |  |  |  | 
| 2153 |  |  |  |  |  |  | Returns: | 
| 2154 |  |  |  |  |  |  |  | 
| 2155 |  |  |  |  |  |  | =cut | 
| 2156 | 0 |  |  | 0 | 0 | 0 | return $path_plugin_dir; | 
| 2157 |  |  |  |  |  |  | } | 
| 2158 |  |  |  |  |  |  |  | 
| 2159 |  |  |  |  |  |  | sub sys_get_mail_server { | 
| 2160 |  |  |  |  |  |  | =begin wiki | 
| 2161 |  |  |  |  |  |  |  | 
| 2162 |  |  |  |  |  |  | !3 sys_get_mail_server | 
| 2163 |  |  |  |  |  |  |  | 
| 2164 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2165 |  |  |  |  |  |  |  | 
| 2166 |  |  |  |  |  |  | Please write this documentation. | 
| 2167 |  |  |  |  |  |  |  | 
| 2168 |  |  |  |  |  |  | Returns: | 
| 2169 |  |  |  |  |  |  |  | 
| 2170 |  |  |  |  |  |  | =cut | 
| 2171 | 0 |  |  | 0 | 0 | 0 | return $mail_server; | 
| 2172 |  |  |  |  |  |  | } | 
| 2173 |  |  |  |  |  |  |  | 
| 2174 |  |  |  |  |  |  | sub sys_get_mail_from { | 
| 2175 |  |  |  |  |  |  | =begin wiki | 
| 2176 |  |  |  |  |  |  |  | 
| 2177 |  |  |  |  |  |  | !3 sys_get_mail_from | 
| 2178 |  |  |  |  |  |  |  | 
| 2179 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2180 |  |  |  |  |  |  |  | 
| 2181 |  |  |  |  |  |  | Please write this documentation. | 
| 2182 |  |  |  |  |  |  |  | 
| 2183 |  |  |  |  |  |  | Returns: | 
| 2184 |  |  |  |  |  |  |  | 
| 2185 |  |  |  |  |  |  | =cut | 
| 2186 | 0 |  |  | 0 | 0 | 0 | return $mail_from; | 
| 2187 |  |  |  |  |  |  | } | 
| 2188 |  |  |  |  |  |  |  | 
| 2189 |  |  |  |  |  |  | sub sys_get_mail_emailto { | 
| 2190 |  |  |  |  |  |  | =begin wiki | 
| 2191 |  |  |  |  |  |  |  | 
| 2192 |  |  |  |  |  |  | !3 sys_get_mail_emailto | 
| 2193 |  |  |  |  |  |  |  | 
| 2194 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2195 |  |  |  |  |  |  |  | 
| 2196 |  |  |  |  |  |  | Please write this documentation. | 
| 2197 |  |  |  |  |  |  |  | 
| 2198 |  |  |  |  |  |  | Returns: | 
| 2199 |  |  |  |  |  |  |  | 
| 2200 |  |  |  |  |  |  | =cut | 
| 2201 | 0 |  |  | 0 | 0 | 0 | return $mail_emailto; | 
| 2202 |  |  |  |  |  |  | } | 
| 2203 |  |  |  |  |  |  |  | 
| 2204 |  |  |  |  |  |  | sub sys_get_mail_pagerto { | 
| 2205 |  |  |  |  |  |  | =begin wiki | 
| 2206 |  |  |  |  |  |  |  | 
| 2207 |  |  |  |  |  |  | !3 sys_get_mail_pagerto | 
| 2208 |  |  |  |  |  |  |  | 
| 2209 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2210 |  |  |  |  |  |  |  | 
| 2211 |  |  |  |  |  |  | Please write this documentation. | 
| 2212 |  |  |  |  |  |  |  | 
| 2213 |  |  |  |  |  |  | Returns: | 
| 2214 |  |  |  |  |  |  |  | 
| 2215 |  |  |  |  |  |  | =cut | 
| 2216 | 0 |  |  | 0 | 0 | 0 | return $mail_pagerto; | 
| 2217 |  |  |  |  |  |  | } | 
| 2218 |  |  |  |  |  |  |  | 
| 2219 |  |  |  |  |  |  | sub sys_get_mail_email_levels { | 
| 2220 |  |  |  |  |  |  | =begin wiki | 
| 2221 |  |  |  |  |  |  |  | 
| 2222 |  |  |  |  |  |  | !3 sys_get_mail_email_levels | 
| 2223 |  |  |  |  |  |  |  | 
| 2224 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2225 |  |  |  |  |  |  |  | 
| 2226 |  |  |  |  |  |  | Please write this documentation. | 
| 2227 |  |  |  |  |  |  |  | 
| 2228 |  |  |  |  |  |  | Returns: | 
| 2229 |  |  |  |  |  |  |  | 
| 2230 |  |  |  |  |  |  | =cut | 
| 2231 | 0 |  |  | 0 | 0 | 0 | return $mail_email_levels; | 
| 2232 |  |  |  |  |  |  | } | 
| 2233 |  |  |  |  |  |  |  | 
| 2234 |  |  |  |  |  |  | sub sys_get_mail_pager_levels { | 
| 2235 |  |  |  |  |  |  | =begin wiki | 
| 2236 |  |  |  |  |  |  |  | 
| 2237 |  |  |  |  |  |  | !3 sys_get_mail_pager_levels | 
| 2238 |  |  |  |  |  |  |  | 
| 2239 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2240 |  |  |  |  |  |  |  | 
| 2241 |  |  |  |  |  |  | Please write this documentation. | 
| 2242 |  |  |  |  |  |  |  | 
| 2243 |  |  |  |  |  |  | Returns: | 
| 2244 |  |  |  |  |  |  |  | 
| 2245 |  |  |  |  |  |  | =cut | 
| 2246 | 0 |  |  | 0 | 0 | 0 | return $mail_pager_levels; | 
| 2247 |  |  |  |  |  |  | } | 
| 2248 |  |  |  |  |  |  |  | 
| 2249 |  |  |  |  |  |  | sub sys_get_log_file { | 
| 2250 |  |  |  |  |  |  | =begin wiki | 
| 2251 |  |  |  |  |  |  |  | 
| 2252 |  |  |  |  |  |  | !3 sys_get_log_file | 
| 2253 |  |  |  |  |  |  |  | 
| 2254 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2255 |  |  |  |  |  |  |  | 
| 2256 |  |  |  |  |  |  | Please write this documentation. | 
| 2257 |  |  |  |  |  |  |  | 
| 2258 |  |  |  |  |  |  | Returns: | 
| 2259 |  |  |  |  |  |  |  | 
| 2260 |  |  |  |  |  |  | =cut | 
| 2261 | 0 |  |  | 0 | 0 | 0 | return $log_file; | 
| 2262 |  |  |  |  |  |  | } | 
| 2263 |  |  |  |  |  |  |  | 
| 2264 |  |  |  |  |  |  | sub sys_get_log_filefull { | 
| 2265 |  |  |  |  |  |  | =begin wiki | 
| 2266 |  |  |  |  |  |  |  | 
| 2267 |  |  |  |  |  |  | !3 sys_get_log_filefull | 
| 2268 |  |  |  |  |  |  |  | 
| 2269 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2270 |  |  |  |  |  |  |  | 
| 2271 |  |  |  |  |  |  | Please write this documentation. | 
| 2272 |  |  |  |  |  |  |  | 
| 2273 |  |  |  |  |  |  | Returns: | 
| 2274 |  |  |  |  |  |  |  | 
| 2275 |  |  |  |  |  |  | =cut | 
| 2276 | 0 |  |  | 0 | 0 | 0 | return $log_filefull; | 
| 2277 |  |  |  |  |  |  | } | 
| 2278 |  |  |  |  |  |  |  | 
| 2279 |  |  |  |  |  |  | sub sys_get_log_logging_levels { | 
| 2280 |  |  |  |  |  |  | =begin wiki | 
| 2281 |  |  |  |  |  |  |  | 
| 2282 |  |  |  |  |  |  | !3 sys_get_log_logging_levels | 
| 2283 |  |  |  |  |  |  |  | 
| 2284 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2285 |  |  |  |  |  |  |  | 
| 2286 |  |  |  |  |  |  | Please write this documentation. | 
| 2287 |  |  |  |  |  |  |  | 
| 2288 |  |  |  |  |  |  | Returns: | 
| 2289 |  |  |  |  |  |  |  | 
| 2290 |  |  |  |  |  |  | =cut | 
| 2291 | 0 |  |  | 0 | 0 | 0 | return $log_logging_levels; | 
| 2292 |  |  |  |  |  |  | } | 
| 2293 |  |  |  |  |  |  |  | 
| 2294 |  |  |  |  |  |  | sub sys_get_log_console_levels { | 
| 2295 |  |  |  |  |  |  | =begin wiki | 
| 2296 |  |  |  |  |  |  |  | 
| 2297 |  |  |  |  |  |  | !3 sys_get_log_console_levels | 
| 2298 |  |  |  |  |  |  |  | 
| 2299 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2300 |  |  |  |  |  |  |  | 
| 2301 |  |  |  |  |  |  | Please write this documentation. | 
| 2302 |  |  |  |  |  |  |  | 
| 2303 |  |  |  |  |  |  | Returns: | 
| 2304 |  |  |  |  |  |  |  | 
| 2305 |  |  |  |  |  |  | =cut | 
| 2306 | 0 |  |  | 0 | 0 | 0 | return $log_console_levels; | 
| 2307 |  |  |  |  |  |  | } | 
| 2308 |  |  |  |  |  |  |  | 
| 2309 |  |  |  |  |  |  | sub sys_get_log_gdg { | 
| 2310 |  |  |  |  |  |  | =begin wiki | 
| 2311 |  |  |  |  |  |  |  | 
| 2312 |  |  |  |  |  |  | !3 sys_get_log_gdg | 
| 2313 |  |  |  |  |  |  |  | 
| 2314 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2315 |  |  |  |  |  |  |  | 
| 2316 |  |  |  |  |  |  | Please write this documentation. | 
| 2317 |  |  |  |  |  |  |  | 
| 2318 |  |  |  |  |  |  | Returns: | 
| 2319 |  |  |  |  |  |  |  | 
| 2320 |  |  |  |  |  |  | =cut | 
| 2321 | 0 |  |  | 0 | 0 | 0 | return $log_gdg; | 
| 2322 |  |  |  |  |  |  | } | 
| 2323 |  |  |  |  |  |  |  | 
| 2324 |  |  |  |  |  |  | sub sys_get_dataenvr { | 
| 2325 |  |  |  |  |  |  | =begin wiki | 
| 2326 |  |  |  |  |  |  |  | 
| 2327 |  |  |  |  |  |  | !3 sys_get_dataenvr | 
| 2328 |  |  |  |  |  |  |  | 
| 2329 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2330 |  |  |  |  |  |  |  | 
| 2331 |  |  |  |  |  |  | Please write this documentation. | 
| 2332 |  |  |  |  |  |  |  | 
| 2333 |  |  |  |  |  |  | Returns: | 
| 2334 |  |  |  |  |  |  |  | 
| 2335 |  |  |  |  |  |  | =cut | 
| 2336 | 0 |  |  | 0 | 0 | 0 | return $dataenvr; | 
| 2337 |  |  |  |  |  |  | } | 
| 2338 |  |  |  |  |  |  |  | 
| 2339 |  |  |  |  |  |  | sub sys_get_errorlevel { | 
| 2340 |  |  |  |  |  |  | =begin wiki | 
| 2341 |  |  |  |  |  |  |  | 
| 2342 |  |  |  |  |  |  | !3 sys_get_errorlevel | 
| 2343 |  |  |  |  |  |  |  | 
| 2344 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2345 |  |  |  |  |  |  |  | 
| 2346 |  |  |  |  |  |  | Please write this documentation. | 
| 2347 |  |  |  |  |  |  |  | 
| 2348 |  |  |  |  |  |  | Returns: | 
| 2349 |  |  |  |  |  |  |  | 
| 2350 |  |  |  |  |  |  | =cut | 
| 2351 | 0 |  |  | 0 | 0 | 0 | return $errorlevel; | 
| 2352 |  |  |  |  |  |  | } | 
| 2353 |  |  |  |  |  |  |  | 
| 2354 |  |  |  |  |  |  | sub sys_get_dbdescr { | 
| 2355 |  |  |  |  |  |  | =begin wiki | 
| 2356 |  |  |  |  |  |  |  | 
| 2357 |  |  |  |  |  |  | !3 sys_get_dbdescr | 
| 2358 |  |  |  |  |  |  |  | 
| 2359 |  |  |  |  |  |  | Parameters: ( dbacro ) | 
| 2360 |  |  |  |  |  |  |  | 
| 2361 |  |  |  |  |  |  | Accept a database acro and return a database description string which \ | 
| 2362 |  |  |  |  |  |  | consists of database name, acro, and current instance. | 
| 2363 |  |  |  |  |  |  |  | 
| 2364 |  |  |  |  |  |  | Returns: | 
| 2365 |  |  |  |  |  |  |  | 
| 2366 |  |  |  |  |  |  | =cut | 
| 2367 | 0 |  |  | 0 | 0 | 0 | my $dbacro = shift; | 
| 2368 |  |  |  |  |  |  |  | 
| 2369 | 0 |  |  |  |  | 0 | my $dbdescr = 'Database: acronym not found'; | 
| 2370 | 0 |  |  |  |  | 0 | foreach my $acro ( @databases ) { | 
| 2371 | 0 | 0 |  |  |  | 0 | if ( $acro eq $dbacro ) { | 
| 2372 | 0 |  |  |  |  | 0 | $dbdescr = 'Database Connection: ' . $dbname{$dbacro} . ' (' . | 
| 2373 |  |  |  |  |  |  | $dbacro . '/' . $dbdefenvr{$dbacro} . ')'; | 
| 2374 |  |  |  |  |  |  | } | 
| 2375 |  |  |  |  |  |  | } | 
| 2376 | 0 |  |  |  |  | 0 | return $dbdescr; | 
| 2377 |  |  |  |  |  |  | } | 
| 2378 |  |  |  |  |  |  | sub sys_get_dbinst { | 
| 2379 |  |  |  |  |  |  | =begin wiki | 
| 2380 |  |  |  |  |  |  |  | 
| 2381 |  |  |  |  |  |  | !3 sys_get_dbinst | 
| 2382 |  |  |  |  |  |  |  | 
| 2383 |  |  |  |  |  |  | Parameters: ( dbacro ) | 
| 2384 |  |  |  |  |  |  |  | 
| 2385 |  |  |  |  |  |  | Please write this documentation. | 
| 2386 |  |  |  |  |  |  |  | 
| 2387 |  |  |  |  |  |  | Returns: | 
| 2388 |  |  |  |  |  |  |  | 
| 2389 |  |  |  |  |  |  | =cut | 
| 2390 | 0 |  |  | 0 | 0 | 0 | my $dbacro = shift; | 
| 2391 |  |  |  |  |  |  |  | 
| 2392 | 0 |  |  |  |  | 0 | my $dbdescr = 'Database: instance not found'; | 
| 2393 | 0 |  |  |  |  | 0 | foreach my $acro ( @databases ) { | 
| 2394 | 0 | 0 |  |  |  | 0 | if ( $acro eq $dbacro ) { | 
| 2395 | 0 |  |  |  |  | 0 | $dbdescr = $dbacro . '/' . $dbdefenvr{$dbacro}; | 
| 2396 |  |  |  |  |  |  | } | 
| 2397 |  |  |  |  |  |  | } | 
| 2398 | 0 |  |  |  |  | 0 | return uc($dbdescr); | 
| 2399 |  |  |  |  |  |  | } | 
| 2400 |  |  |  |  |  |  |  | 
| 2401 |  |  |  |  |  |  | sub sys_get_conf_dir { | 
| 2402 |  |  |  |  |  |  | =begin wiki | 
| 2403 |  |  |  |  |  |  |  | 
| 2404 |  |  |  |  |  |  | !3 sys_get_conf_dir | 
| 2405 |  |  |  |  |  |  |  | 
| 2406 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2407 |  |  |  |  |  |  |  | 
| 2408 |  |  |  |  |  |  | Please write this documentation. | 
| 2409 |  |  |  |  |  |  |  | 
| 2410 |  |  |  |  |  |  | Returns: | 
| 2411 |  |  |  |  |  |  |  | 
| 2412 |  |  |  |  |  |  | =cut | 
| 2413 | 0 |  |  | 0 | 0 | 0 | return $path_conf_dir . '/'; | 
| 2414 |  |  |  |  |  |  | } | 
| 2415 |  |  |  |  |  |  |  | 
| 2416 |  |  |  |  |  |  | sub sys_get_sql { | 
| 2417 |  |  |  |  |  |  | =begin wiki | 
| 2418 |  |  |  |  |  |  |  | 
| 2419 |  |  |  |  |  |  | !3 sys_get_sql | 
| 2420 |  |  |  |  |  |  |  | 
| 2421 |  |  |  |  |  |  | Parameters: ( sqlname, alternate_job_name ) | 
| 2422 |  |  |  |  |  |  |  | 
| 2423 |  |  |  |  |  |  | Return the sql query from the query.conf file using the sqlname provided. \ | 
| 2424 |  |  |  |  |  |  | If the requested sql name is not found, the name gets 'sql:' prepended and \ | 
| 2425 |  |  |  |  |  |  | then another attempt is made. This allows entries of the form 'name' or \ | 
| 2426 |  |  |  |  |  |  | alternately 'sql:name' to be used in the query.conf file. | 
| 2427 |  |  |  |  |  |  |  | 
| 2428 |  |  |  |  |  |  | The user may also pass in an optionl section name which will override the \ | 
| 2429 |  |  |  |  |  |  | default section name. (Default section name is the current $jobname.) | 
| 2430 |  |  |  |  |  |  |  | 
| 2431 |  |  |  |  |  |  | Returns: | 
| 2432 |  |  |  |  |  |  |  | 
| 2433 |  |  |  |  |  |  | =cut | 
| 2434 | 0 |  |  | 0 | 0 | 0 | my ($sqlname, $altsection) = @_; | 
| 2435 | 0 |  | 0 |  |  | 0 | my $section = $altsection || 'sql'; | 
| 2436 |  |  |  |  |  |  |  | 
| 2437 | 0 | 0 |  |  |  | 0 | if ( ! $conf_job{$section}{$sqlname} ) { | 
| 2438 | 0 |  |  |  |  | 0 | $sqlname = 'sql:'.$sqlname; | 
| 2439 | 0 | 0 |  |  |  | 0 | if ( ! $conf_job{$section}{$sqlname} ) { | 
| 2440 | 0 |  |  |  |  | 0 | sys_die( "The job conf file does not contain a query named [$sqlname]", 0 ); | 
| 2441 |  |  |  |  |  |  | } | 
| 2442 |  |  |  |  |  |  | } | 
| 2443 | 0 |  |  |  |  | 0 | return $conf_job{$section}{$sqlname}; | 
| 2444 |  |  |  |  |  |  | } | 
| 2445 |  |  |  |  |  |  |  | 
| 2446 |  |  |  |  |  |  | sub sys_get_item { | 
| 2447 |  |  |  |  |  |  | =begin wiki | 
| 2448 |  |  |  |  |  |  |  | 
| 2449 |  |  |  |  |  |  | !3 sys_get_item | 
| 2450 |  |  |  |  |  |  |  | 
| 2451 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2452 |  |  |  |  |  |  |  | 
| 2453 |  |  |  |  |  |  | Please write this documentation. | 
| 2454 |  |  |  |  |  |  |  | 
| 2455 |  |  |  |  |  |  | Returns: | 
| 2456 |  |  |  |  |  |  |  | 
| 2457 |  |  |  |  |  |  | =cut | 
| 2458 | 0 |  |  | 0 | 0 | 0 | my ($item, $altsection) = @_; | 
| 2459 | 0 |  | 0 |  |  | 0 | my $section = $altsection || 'job'; | 
| 2460 |  |  |  |  |  |  |  | 
| 2461 | 0 |  |  |  |  | 0 | my $value = $conf_job{$section}{$item}; | 
| 2462 |  |  |  |  |  |  |  | 
| 2463 | 0 | 0 |  |  |  | 0 | if ( ! defined $value ) { | 
| 2464 | 0 |  |  |  |  | 0 | sys_die( "Job conf missing entry [$item] in section [$section]", 0 ); | 
| 2465 |  |  |  |  |  |  | } | 
| 2466 |  |  |  |  |  |  |  | 
| 2467 | 0 | 0 |  |  |  | 0 | if ( $value eq '0' ) { | 
| 2468 | 0 |  |  |  |  | 0 | return $conf_job{$section}{$item}; | 
| 2469 |  |  |  |  |  |  | } | 
| 2470 |  |  |  |  |  |  |  | 
| 2471 | 0 |  |  |  |  | 0 | return $value; | 
| 2472 |  |  |  |  |  |  | } | 
| 2473 |  |  |  |  |  |  |  | 
| 2474 |  |  |  |  |  |  | sub sys_get_hash { | 
| 2475 |  |  |  |  |  |  | =begin wiki | 
| 2476 |  |  |  |  |  |  |  | 
| 2477 |  |  |  |  |  |  | !3 sys_get_hash | 
| 2478 |  |  |  |  |  |  |  | 
| 2479 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2480 |  |  |  |  |  |  |  | 
| 2481 |  |  |  |  |  |  | Please write this documentation. | 
| 2482 |  |  |  |  |  |  |  | 
| 2483 |  |  |  |  |  |  | Returns: | 
| 2484 |  |  |  |  |  |  |  | 
| 2485 |  |  |  |  |  |  | =cut | 
| 2486 | 0 |  |  | 0 | 0 | 0 | my ($section, $entry, $delim) = @_; | 
| 2487 | 0 | 0 |  |  |  | 0 | $delim = ':' unless $delim; | 
| 2488 |  |  |  |  |  |  |  | 
| 2489 | 0 |  |  |  |  | 0 | my ($pseudo, %hash); | 
| 2490 |  |  |  |  |  |  |  | 
| 2491 | 0 | 0 |  |  |  | 0 | if ( $conf_job{$section}{$entry} ) { | 
| 2492 | 0 |  |  |  |  | 0 | $pseudo = $conf_job{$section}{$entry}; | 
| 2493 |  |  |  |  |  |  | } else { | 
| 2494 | 0 |  |  |  |  | 0 | sys_die( "No job conf entry found for $entry in section $section" ); | 
| 2495 |  |  |  |  |  |  | } | 
| 2496 |  |  |  |  |  |  |  | 
| 2497 |  |  |  |  |  |  | ## construct a real hash from the pseudo hash | 
| 2498 | 0 |  |  |  |  | 0 | foreach my $item ( split "\n", $pseudo ) { | 
| 2499 | 0 |  |  |  |  | 0 | my ($key, $value) = split m/$delim/, $item; | 
| 2500 | 0 |  |  |  |  | 0 | $hash{$key} = $value; | 
| 2501 |  |  |  |  |  |  | } | 
| 2502 |  |  |  |  |  |  |  | 
| 2503 | 0 |  |  |  |  | 0 | return \%hash;  ## ref to hash | 
| 2504 |  |  |  |  |  |  | } | 
| 2505 |  |  |  |  |  |  |  | 
| 2506 |  |  |  |  |  |  | sub sys_get_array { | 
| 2507 |  |  |  |  |  |  | =begin wiki | 
| 2508 |  |  |  |  |  |  |  | 
| 2509 |  |  |  |  |  |  | !3 sys_get_array | 
| 2510 |  |  |  |  |  |  |  | 
| 2511 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2512 |  |  |  |  |  |  |  | 
| 2513 |  |  |  |  |  |  | Please write this documentation. | 
| 2514 |  |  |  |  |  |  |  | 
| 2515 |  |  |  |  |  |  | Returns: | 
| 2516 |  |  |  |  |  |  |  | 
| 2517 |  |  |  |  |  |  | =cut | 
| 2518 | 0 |  |  | 0 | 0 | 0 | my ($section, $entry, $delim) = @_; | 
| 2519 | 0 | 0 |  |  |  | 0 | $delim = ':' unless $delim; | 
| 2520 |  |  |  |  |  |  |  | 
| 2521 | 0 |  |  |  |  | 0 | my ($pseudo, @array); | 
| 2522 |  |  |  |  |  |  |  | 
| 2523 | 0 | 0 |  |  |  | 0 | if ( $conf_job{$section}{$entry} ) { | 
| 2524 | 0 |  |  |  |  | 0 | $pseudo = $conf_job{$section}{$entry}; | 
| 2525 |  |  |  |  |  |  | } else { | 
| 2526 | 0 |  |  |  |  | 0 | sys_die( "No job conf entry found for $entry in section $section" ); | 
| 2527 |  |  |  |  |  |  | } | 
| 2528 |  |  |  |  |  |  |  | 
| 2529 |  |  |  |  |  |  | ## construct a real array from the pseudo array | 
| 2530 | 0 |  |  |  |  | 0 | foreach my $item ( split "\n", $pseudo ) { | 
| 2531 | 0 |  |  |  |  | 0 | push @array, $item; | 
| 2532 |  |  |  |  |  |  | } | 
| 2533 |  |  |  |  |  |  |  | 
| 2534 | 0 |  |  |  |  | 0 | return \@array;  ## ref to an array | 
| 2535 |  |  |  |  |  |  | } | 
| 2536 |  |  |  |  |  |  |  | 
| 2537 |  |  |  |  |  |  | sub sys_get_common_sql { | 
| 2538 |  |  |  |  |  |  | =begin wiki | 
| 2539 |  |  |  |  |  |  |  | 
| 2540 |  |  |  |  |  |  | !3 sys_get_common_sql | 
| 2541 |  |  |  |  |  |  |  | 
| 2542 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2543 |  |  |  |  |  |  |  | 
| 2544 |  |  |  |  |  |  | Please write this documentation. | 
| 2545 |  |  |  |  |  |  |  | 
| 2546 |  |  |  |  |  |  | Returns: | 
| 2547 |  |  |  |  |  |  |  | 
| 2548 |  |  |  |  |  |  | =cut | 
| 2549 | 0 |  |  | 0 | 0 | 0 | my ($sqlname, $altsection) = @_; | 
| 2550 | 0 |  | 0 |  |  | 0 | my $section = $altsection || 'sql'; | 
| 2551 |  |  |  |  |  |  |  | 
| 2552 | 0 | 0 |  |  |  | 0 | if ( ! $conf_query{$section}{$sqlname} ) { | 
| 2553 | 0 |  |  |  |  | 0 | $sqlname = 'sql:'.$sqlname; | 
| 2554 | 0 | 0 |  |  |  | 0 | if ( ! $conf_query{$section}{$sqlname} ) { | 
| 2555 | 0 |  |  |  |  | 0 | sys_die( 'Common sql conf missing query by that name', 0 ); | 
| 2556 |  |  |  |  |  |  | } | 
| 2557 |  |  |  |  |  |  | } | 
| 2558 | 0 |  |  |  |  | 0 | return $conf_query{$section}{$sqlname}; | 
| 2559 |  |  |  |  |  |  | } | 
| 2560 |  |  |  |  |  |  |  | 
| 2561 |  |  |  |  |  |  | sub sys_get_run_control { | 
| 2562 |  |  |  |  |  |  | =begin wiki | 
| 2563 |  |  |  |  |  |  |  | 
| 2564 |  |  |  |  |  |  | !3 sys_get_run_control | 
| 2565 |  |  |  |  |  |  |  | 
| 2566 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2567 |  |  |  |  |  |  |  | 
| 2568 |  |  |  |  |  |  | Please write this documentation. | 
| 2569 |  |  |  |  |  |  |  | 
| 2570 |  |  |  |  |  |  | Returns: | 
| 2571 |  |  |  |  |  |  |  | 
| 2572 |  |  |  |  |  |  | =cut | 
| 2573 | 0 |  |  | 0 | 0 | 0 | my ($jobname, $section, $default) = @_; | 
| 2574 |  |  |  |  |  |  |  | 
| 2575 | 0 |  | 0 |  |  | 0 | my $rcontrol = $default || 0; | 
| 2576 | 0 | 0 |  |  |  | 0 | if ( ! $conf_rcontrols{$section}{$jobname} ) { | 
| 2577 | 0 |  |  |  |  | 0 | return $rcontrol; | 
| 2578 |  |  |  |  |  |  | } | 
| 2579 |  |  |  |  |  |  |  | 
| 2580 | 0 |  |  |  |  | 0 | return $conf_rcontrols{$section}{$jobname}; | 
| 2581 |  |  |  |  |  |  | } | 
| 2582 |  |  |  |  |  |  |  | 
| 2583 |  |  |  |  |  |  | sub sys_get_email_levels { | 
| 2584 |  |  |  |  |  |  | =begin wiki | 
| 2585 |  |  |  |  |  |  |  | 
| 2586 |  |  |  |  |  |  | !3 sys_get_email_levels | 
| 2587 |  |  |  |  |  |  |  | 
| 2588 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2589 |  |  |  |  |  |  |  | 
| 2590 |  |  |  |  |  |  | Please write this documentation. | 
| 2591 |  |  |  |  |  |  |  | 
| 2592 |  |  |  |  |  |  | Returns: | 
| 2593 |  |  |  |  |  |  |  | 
| 2594 |  |  |  |  |  |  | =cut | 
| 2595 | 0 |  |  | 0 | 0 | 0 | return $mail_email_levels; | 
| 2596 |  |  |  |  |  |  | } | 
| 2597 |  |  |  |  |  |  |  | 
| 2598 |  |  |  |  |  |  | sub sys_get_pager_levels { | 
| 2599 |  |  |  |  |  |  | =begin wiki | 
| 2600 |  |  |  |  |  |  |  | 
| 2601 |  |  |  |  |  |  | !3 sys_get_pager_levels | 
| 2602 |  |  |  |  |  |  |  | 
| 2603 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2604 |  |  |  |  |  |  |  | 
| 2605 |  |  |  |  |  |  | Please write this documentation. | 
| 2606 |  |  |  |  |  |  |  | 
| 2607 |  |  |  |  |  |  | Returns: | 
| 2608 |  |  |  |  |  |  |  | 
| 2609 |  |  |  |  |  |  | =cut | 
| 2610 | 0 |  |  | 0 | 0 | 0 | return $mail_pager_levels; | 
| 2611 |  |  |  |  |  |  | } | 
| 2612 |  |  |  |  |  |  |  | 
| 2613 |  |  |  |  |  |  | sub sys_get_logging_levels { | 
| 2614 |  |  |  |  |  |  | =begin wiki | 
| 2615 |  |  |  |  |  |  |  | 
| 2616 |  |  |  |  |  |  | !3 sys_get_logging_levels | 
| 2617 |  |  |  |  |  |  |  | 
| 2618 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2619 |  |  |  |  |  |  |  | 
| 2620 |  |  |  |  |  |  | Please write this documentation. | 
| 2621 |  |  |  |  |  |  |  | 
| 2622 |  |  |  |  |  |  | Returns: | 
| 2623 |  |  |  |  |  |  |  | 
| 2624 |  |  |  |  |  |  | =cut | 
| 2625 | 0 |  |  | 0 | 0 | 0 | return $log_logging_levels; | 
| 2626 |  |  |  |  |  |  | } | 
| 2627 |  |  |  |  |  |  |  | 
| 2628 |  |  |  |  |  |  | sub sys_get_console_levels { | 
| 2629 |  |  |  |  |  |  | =begin wiki | 
| 2630 |  |  |  |  |  |  |  | 
| 2631 |  |  |  |  |  |  | !3 sys_get_console_levels | 
| 2632 |  |  |  |  |  |  |  | 
| 2633 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2634 |  |  |  |  |  |  |  | 
| 2635 |  |  |  |  |  |  | Please write this documentation. | 
| 2636 |  |  |  |  |  |  |  | 
| 2637 |  |  |  |  |  |  | Returns: | 
| 2638 |  |  |  |  |  |  |  | 
| 2639 |  |  |  |  |  |  | =cut | 
| 2640 | 0 |  |  | 0 | 0 | 0 | return $log_console_levels; | 
| 2641 |  |  |  |  |  |  | } | 
| 2642 |  |  |  |  |  |  |  | 
| 2643 |  |  |  |  |  |  | sub sys_get_commandline { | 
| 2644 |  |  |  |  |  |  | =begin wiki | 
| 2645 |  |  |  |  |  |  |  | 
| 2646 |  |  |  |  |  |  | !3 sys_get_commandline | 
| 2647 |  |  |  |  |  |  |  | 
| 2648 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2649 |  |  |  |  |  |  |  | 
| 2650 |  |  |  |  |  |  | Please write this documentation. | 
| 2651 |  |  |  |  |  |  |  | 
| 2652 |  |  |  |  |  |  | Returns: | 
| 2653 |  |  |  |  |  |  |  | 
| 2654 |  |  |  |  |  |  | =cut | 
| 2655 | 0 |  |  | 0 | 0 | 0 | return join ' ', @ARGV; | 
| 2656 |  |  |  |  |  |  | } | 
| 2657 |  |  |  |  |  |  |  | 
| 2658 |  |  |  |  |  |  | sub sys_get_commandline_opt { | 
| 2659 |  |  |  |  |  |  | =begin wiki | 
| 2660 |  |  |  |  |  |  |  | 
| 2661 |  |  |  |  |  |  | !3 sys_get_commandline_opt | 
| 2662 |  |  |  |  |  |  |  | 
| 2663 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2664 |  |  |  |  |  |  |  | 
| 2665 |  |  |  |  |  |  | Please write this documentation. | 
| 2666 |  |  |  |  |  |  |  | 
| 2667 |  |  |  |  |  |  | Returns: | 
| 2668 |  |  |  |  |  |  |  | 
| 2669 |  |  |  |  |  |  | =cut | 
| 2670 | 0 |  |  | 0 | 0 | 0 | my $target_opt = shift; | 
| 2671 | 0 |  |  |  |  | 0 | foreach my $option ( @ARGV ) { | 
| 2672 | 0 |  |  |  |  | 0 | my ($opt,$val) = split m/=/, $option; | 
| 2673 | 0 |  |  |  |  | 0 | $opt =~ s/^-\s*//x; | 
| 2674 | 0 |  |  |  |  | 0 | $opt =~ s/\s+$//x; | 
| 2675 | 0 | 0 |  |  |  | 0 | if ( $opt =~ m/^$target_opt$/ix ) { | 
| 2676 | 0 |  |  |  |  | 0 | return 1; | 
| 2677 |  |  |  |  |  |  | } | 
| 2678 |  |  |  |  |  |  | } | 
| 2679 | 0 |  |  |  |  | 0 | return 0; | 
| 2680 |  |  |  |  |  |  | } | 
| 2681 |  |  |  |  |  |  |  | 
| 2682 |  |  |  |  |  |  | sub sys_get_commandline_val { | 
| 2683 |  |  |  |  |  |  | =begin wiki | 
| 2684 |  |  |  |  |  |  |  | 
| 2685 |  |  |  |  |  |  | !3 sys_get_commandline_val | 
| 2686 |  |  |  |  |  |  |  | 
| 2687 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2688 |  |  |  |  |  |  |  | 
| 2689 |  |  |  |  |  |  | Please write this documentation. | 
| 2690 |  |  |  |  |  |  |  | 
| 2691 |  |  |  |  |  |  | Returns: | 
| 2692 |  |  |  |  |  |  |  | 
| 2693 |  |  |  |  |  |  | =cut | 
| 2694 | 0 |  |  | 0 | 0 | 0 | my ($target_opt,$default_value) = @_; | 
| 2695 |  |  |  |  |  |  | ## handle: | 
| 2696 |  |  |  |  |  |  | ##   >script.pl -r -- -batchsize=10 | 
| 2697 | 0 |  |  |  |  | 0 | foreach my $option ( @ARGV ) { | 
| 2698 | 0 |  |  |  |  | 0 | $option =~ s/\s+=/=/x; | 
| 2699 | 0 |  |  |  |  | 0 | $option =~ s/=\s+/=/x; | 
| 2700 | 0 |  |  |  |  | 0 | my ($opt,$val) = split m/=/, $option; | 
| 2701 | 0 |  |  |  |  | 0 | $opt =~ s/^-\s*//x; | 
| 2702 | 0 |  |  |  |  | 0 | $opt =~ s/\s+$//x; | 
| 2703 | 0 | 0 |  |  |  | 0 | if ( $opt =~ m/^$target_opt$/ix ) { | 
| 2704 |  |  |  |  |  |  | #$val =~ s/^\s*//; | 
| 2705 |  |  |  |  |  |  | #$val =~ s/\s*$//; | 
| 2706 | 0 |  |  |  |  | 0 | return $val; | 
| 2707 |  |  |  |  |  |  | } | 
| 2708 |  |  |  |  |  |  | } | 
| 2709 | 0 |  |  |  |  | 0 | return $default_value; | 
| 2710 |  |  |  |  |  |  | } | 
| 2711 |  |  |  |  |  |  |  | 
| 2712 |  |  |  |  |  |  | sub sys_get_script_file { | 
| 2713 |  |  |  |  |  |  | =begin wiki | 
| 2714 |  |  |  |  |  |  |  | 
| 2715 |  |  |  |  |  |  | !3 sys_get_script_file | 
| 2716 |  |  |  |  |  |  |  | 
| 2717 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2718 |  |  |  |  |  |  |  | 
| 2719 |  |  |  |  |  |  | Please write this documentation. | 
| 2720 |  |  |  |  |  |  |  | 
| 2721 |  |  |  |  |  |  | Returns: | 
| 2722 |  |  |  |  |  |  |  | 
| 2723 |  |  |  |  |  |  | =cut | 
| 2724 | 0 |  |  | 0 | 0 | 0 | return $script_file; | 
| 2725 |  |  |  |  |  |  | } | 
| 2726 |  |  |  |  |  |  |  | 
| 2727 |  |  |  |  |  |  | sub sys_get_util_move { | 
| 2728 |  |  |  |  |  |  | =begin wiki | 
| 2729 |  |  |  |  |  |  |  | 
| 2730 |  |  |  |  |  |  | !3 sys_get_util_move | 
| 2731 |  |  |  |  |  |  |  | 
| 2732 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2733 |  |  |  |  |  |  |  | 
| 2734 |  |  |  |  |  |  | Please write this documentation. | 
| 2735 |  |  |  |  |  |  |  | 
| 2736 |  |  |  |  |  |  | Returns: | 
| 2737 |  |  |  |  |  |  |  | 
| 2738 |  |  |  |  |  |  | =cut | 
| 2739 | 0 |  |  | 0 | 0 | 0 | return $util_move; | 
| 2740 |  |  |  |  |  |  | } | 
| 2741 |  |  |  |  |  |  |  | 
| 2742 |  |  |  |  |  |  | sub sys_get_user { | 
| 2743 |  |  |  |  |  |  | =begin wiki | 
| 2744 |  |  |  |  |  |  |  | 
| 2745 |  |  |  |  |  |  | !3 sys_get_user | 
| 2746 |  |  |  |  |  |  |  | 
| 2747 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2748 |  |  |  |  |  |  |  | 
| 2749 |  |  |  |  |  |  | Please write this documentation. | 
| 2750 |  |  |  |  |  |  |  | 
| 2751 |  |  |  |  |  |  | Returns: | 
| 2752 |  |  |  |  |  |  |  | 
| 2753 |  |  |  |  |  |  | =cut | 
| 2754 | 0 |  | 0 | 0 | 0 | 0 | return getlogin || 'unknown'; | 
| 2755 |  |  |  |  |  |  | } | 
| 2756 |  |  |  |  |  |  |  | 
| 2757 |  |  |  |  |  |  | sub sys_get_maxval { | 
| 2758 |  |  |  |  |  |  | =begin wiki | 
| 2759 |  |  |  |  |  |  |  | 
| 2760 |  |  |  |  |  |  | !3 sys_get_maxval | 
| 2761 |  |  |  |  |  |  |  | 
| 2762 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2763 |  |  |  |  |  |  |  | 
| 2764 |  |  |  |  |  |  | Please write this documentation. | 
| 2765 |  |  |  |  |  |  |  | 
| 2766 |  |  |  |  |  |  | Returns: | 
| 2767 |  |  |  |  |  |  |  | 
| 2768 |  |  |  |  |  |  | =cut | 
| 2769 | 0 |  |  | 0 | 0 | 0 | my $key = shift; | 
| 2770 | 0 |  | 0 |  |  | 0 | return $maxval{$key} || 0; | 
| 2771 |  |  |  |  |  |  | } | 
| 2772 |  |  |  |  |  |  |  | 
| 2773 |  |  |  |  |  |  | sub sys_set_restart { | 
| 2774 |  |  |  |  |  |  | =begin wiki | 
| 2775 |  |  |  |  |  |  |  | 
| 2776 |  |  |  |  |  |  | !3 sys_set_restart | 
| 2777 |  |  |  |  |  |  |  | 
| 2778 |  |  |  |  |  |  | Parameters: ( restart_option ) | 
| 2779 |  |  |  |  |  |  |  | 
| 2780 |  |  |  |  |  |  | Write the requested restart_option to the the system.conf file. This value \ | 
| 2781 |  |  |  |  |  |  | is the last step attempted by the calling script. | 
| 2782 |  |  |  |  |  |  |  | 
| 2783 |  |  |  |  |  |  | Returns: | 
| 2784 |  |  |  |  |  |  |  | 
| 2785 |  |  |  |  |  |  | =cut | 
| 2786 | 0 |  |  | 0 | 0 | 0 | my $restart_option = shift; | 
| 2787 |  |  |  |  |  |  |  | 
| 2788 | 0 | 0 |  |  |  | 0 | if ( $restart_option !~ m/^\d+/x ) { | 
| 2789 | 0 |  |  |  |  | 0 | sys_die( 'Restart option is not numeric', 0 ); | 
| 2790 | 0 |  |  |  |  | 0 | return 1; | 
| 2791 |  |  |  |  |  |  | } | 
| 2792 |  |  |  |  |  |  |  | 
| 2793 | 0 |  |  |  |  | 0 | my $rtconf = $path_conf_dir.'/'.$jobname.'.running'; | 
| 2794 | 0 |  |  |  |  | 0 | my $conf = new Config::IniFiles( -file => $rtconf ); | 
| 2795 | 0 | 0 |  |  |  | 0 | unless ( defined $conf ) { sys_die( "Error opening runtime jobconf file", 0 ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 2796 | 0 |  |  |  |  | 0 | $conf->setval( 'restart', 'restart', $restart_option ); | 
| 2797 | 0 |  |  |  |  | 0 | $conf->RewriteConfig; | 
| 2798 |  |  |  |  |  |  |  | 
| 2799 | 0 |  |  |  |  | 0 | return 0; | 
| 2800 |  |  |  |  |  |  | } | 
| 2801 |  |  |  |  |  |  |  | 
| 2802 |  |  |  |  |  |  | sub sys_set_verbose { | 
| 2803 |  |  |  |  |  |  | =begin wiki | 
| 2804 |  |  |  |  |  |  |  | 
| 2805 |  |  |  |  |  |  | !3 sys_set_verbose | 
| 2806 |  |  |  |  |  |  |  | 
| 2807 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2808 |  |  |  |  |  |  |  | 
| 2809 |  |  |  |  |  |  | Please write this documentation. | 
| 2810 |  |  |  |  |  |  |  | 
| 2811 |  |  |  |  |  |  | Returns: | 
| 2812 |  |  |  |  |  |  |  | 
| 2813 |  |  |  |  |  |  | =cut | 
| 2814 | 0 |  |  | 0 | 0 | 0 | $opt_verbose = 1; | 
| 2815 | 0 |  |  |  |  | 0 | return 0; | 
| 2816 |  |  |  |  |  |  | } | 
| 2817 |  |  |  |  |  |  |  | 
| 2818 |  |  |  |  |  |  | sub sys_set_errorlevel { | 
| 2819 |  |  |  |  |  |  | =begin wiki | 
| 2820 |  |  |  |  |  |  |  | 
| 2821 |  |  |  |  |  |  | !3 sys_set_errorlevel | 
| 2822 |  |  |  |  |  |  |  | 
| 2823 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2824 |  |  |  |  |  |  |  | 
| 2825 |  |  |  |  |  |  | Please write this documentation. | 
| 2826 |  |  |  |  |  |  |  | 
| 2827 |  |  |  |  |  |  | Returns: | 
| 2828 |  |  |  |  |  |  |  | 
| 2829 |  |  |  |  |  |  | =cut | 
| 2830 | 0 |  |  | 0 | 0 | 0 | my $errlvl = shift; | 
| 2831 |  |  |  |  |  |  |  | 
| 2832 | 0 | 0 |  |  |  | 0 | if ( $errlvl !~ /^\d+$/ ) { | 
| 2833 | 0 |  |  |  |  | 0 | sys_die( "Invalid value passed to sys_set_errorlevel()" ); | 
| 2834 |  |  |  |  |  |  | } | 
| 2835 |  |  |  |  |  |  |  | 
| 2836 | 0 |  |  |  |  | 0 | my $save_errlvl = $errorlevel; | 
| 2837 | 0 |  |  |  |  | 0 | $errorlevel = $errlvl; | 
| 2838 | 0 |  |  |  |  | 0 | return $save_errlvl; | 
| 2839 |  |  |  |  |  |  | } | 
| 2840 |  |  |  |  |  |  |  | 
| 2841 |  |  |  |  |  |  | sub sys_set_warn { | 
| 2842 |  |  |  |  |  |  | =begin wiki | 
| 2843 |  |  |  |  |  |  |  | 
| 2844 |  |  |  |  |  |  | !3 sys_set_warn | 
| 2845 |  |  |  |  |  |  |  | 
| 2846 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2847 |  |  |  |  |  |  |  | 
| 2848 |  |  |  |  |  |  | Please write this documentation. | 
| 2849 |  |  |  |  |  |  |  | 
| 2850 |  |  |  |  |  |  | Returns: | 
| 2851 |  |  |  |  |  |  |  | 
| 2852 |  |  |  |  |  |  | =cut | 
| 2853 | 0 |  |  | 0 | 0 | 0 | $errorlevel = $RC_WARN; | 
| 2854 | 0 |  |  |  |  | 0 | return $RC_WARN; | 
| 2855 |  |  |  |  |  |  | } | 
| 2856 |  |  |  |  |  |  |  | 
| 2857 |  |  |  |  |  |  | sub sys_set_die { | 
| 2858 |  |  |  |  |  |  | =begin wiki | 
| 2859 |  |  |  |  |  |  |  | 
| 2860 |  |  |  |  |  |  | !3 sys_set_die | 
| 2861 |  |  |  |  |  |  |  | 
| 2862 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2863 |  |  |  |  |  |  |  | 
| 2864 |  |  |  |  |  |  | Please write this documentation. | 
| 2865 |  |  |  |  |  |  |  | 
| 2866 |  |  |  |  |  |  | Returns: | 
| 2867 |  |  |  |  |  |  |  | 
| 2868 |  |  |  |  |  |  | =cut | 
| 2869 | 0 |  |  | 0 | 0 | 0 | $errorlevel = $RC_FATAL; | 
| 2870 | 0 |  |  |  |  | 0 | return $RC_FATAL; | 
| 2871 |  |  |  |  |  |  | } | 
| 2872 |  |  |  |  |  |  |  | 
| 2873 |  |  |  |  |  |  | sub sys_set_email_levels { | 
| 2874 |  |  |  |  |  |  | =begin wiki | 
| 2875 |  |  |  |  |  |  |  | 
| 2876 |  |  |  |  |  |  | !3 sys_set_email_levels | 
| 2877 |  |  |  |  |  |  |  | 
| 2878 |  |  |  |  |  |  | Parameters: ( email_levels ) | 
| 2879 |  |  |  |  |  |  |  | 
| 2880 |  |  |  |  |  |  | Accept a comma delimited list of message levels to use as the source for \ | 
| 2881 |  |  |  |  |  |  | determing which message levels will generate a notification, and which \ | 
| 2882 |  |  |  |  |  |  | message levels will be ignored when email notification is invoked. | 
| 2883 |  |  |  |  |  |  |  | 
| 2884 |  |  |  |  |  |  | Valid values for the list are: FATAL,ERROR,WARN,INFO,DEBUG,NONE | 
| 2885 |  |  |  |  |  |  |  | 
| 2886 |  |  |  |  |  |  | Returns: | 
| 2887 |  |  |  |  |  |  |  | 
| 2888 |  |  |  |  |  |  | =cut | 
| 2889 | 0 |  | 0 | 0 | 0 | 0 | my $email_levels = shift || "FATAL"; | 
| 2890 | 0 |  |  |  |  | 0 | $mail_email_levels = _sys_check_severity_levels( $email_levels ); | 
| 2891 | 0 |  |  |  |  | 0 | return $mail_email_levels; | 
| 2892 |  |  |  |  |  |  | } | 
| 2893 |  |  |  |  |  |  |  | 
| 2894 |  |  |  |  |  |  | sub sys_set_pager_levels { | 
| 2895 |  |  |  |  |  |  | =begin wiki | 
| 2896 |  |  |  |  |  |  |  | 
| 2897 |  |  |  |  |  |  | !3 sys_set_pager_levels | 
| 2898 |  |  |  |  |  |  |  | 
| 2899 |  |  |  |  |  |  | Parameters: ( pager_levels ) | 
| 2900 |  |  |  |  |  |  |  | 
| 2901 |  |  |  |  |  |  | Accept a comma delimited list of message levels to use as the source for \ | 
| 2902 |  |  |  |  |  |  | determing which message levels will generate a notification, and which \ | 
| 2903 |  |  |  |  |  |  | message levels will be ignored when pager notification is invoked. | 
| 2904 |  |  |  |  |  |  |  | 
| 2905 |  |  |  |  |  |  | Valid values for the list are: FATAL,ERROR,WARN,INFO,DEBUG,NONE | 
| 2906 |  |  |  |  |  |  |  | 
| 2907 |  |  |  |  |  |  | Returns: | 
| 2908 |  |  |  |  |  |  |  | 
| 2909 |  |  |  |  |  |  | =cut | 
| 2910 | 0 |  | 0 | 0 | 0 | 0 | my $pager_levels = shift || "FATAL"; | 
| 2911 | 0 |  |  |  |  | 0 | $mail_pager_levels = _sys_check_severity_levels( $pager_levels ); | 
| 2912 | 0 |  |  |  |  | 0 | return $mail_pager_levels; | 
| 2913 |  |  |  |  |  |  | } | 
| 2914 |  |  |  |  |  |  |  | 
| 2915 |  |  |  |  |  |  | sub sys_set_mail_emailto { | 
| 2916 |  |  |  |  |  |  | =begin wiki | 
| 2917 |  |  |  |  |  |  |  | 
| 2918 |  |  |  |  |  |  | !3 sys_set_mail_emailto | 
| 2919 |  |  |  |  |  |  |  | 
| 2920 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2921 |  |  |  |  |  |  |  | 
| 2922 |  |  |  |  |  |  | Please write this documentation. | 
| 2923 |  |  |  |  |  |  |  | 
| 2924 |  |  |  |  |  |  | Returns: | 
| 2925 |  |  |  |  |  |  |  | 
| 2926 |  |  |  |  |  |  | =cut | 
| 2927 | 0 |  |  | 0 | 0 | 0 | my $new_emailto = shift; | 
| 2928 | 0 |  |  |  |  | 0 | my $old_emailto = $mail_emailto; | 
| 2929 | 0 |  |  |  |  | 0 | $mail_emailto = $new_emailto; | 
| 2930 | 0 |  |  |  |  | 0 | return $old_emailto; | 
| 2931 |  |  |  |  |  |  | } | 
| 2932 |  |  |  |  |  |  |  | 
| 2933 |  |  |  |  |  |  | sub sys_set_logging_levels { | 
| 2934 |  |  |  |  |  |  | =begin wiki | 
| 2935 |  |  |  |  |  |  |  | 
| 2936 |  |  |  |  |  |  | !3 sys_set_logging_levels | 
| 2937 |  |  |  |  |  |  |  | 
| 2938 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2939 |  |  |  |  |  |  |  | 
| 2940 |  |  |  |  |  |  | Please write this documentation. | 
| 2941 |  |  |  |  |  |  |  | 
| 2942 |  |  |  |  |  |  | Returns: | 
| 2943 |  |  |  |  |  |  |  | 
| 2944 |  |  |  |  |  |  | =cut | 
| 2945 | 0 |  | 0 | 0 | 0 | 0 | my $logging_levels = shift || "FATAL,ERROR,WARN,INFO"; | 
| 2946 | 0 |  |  |  |  | 0 | $log_logging_levels = _sys_check_severity_levels( $logging_levels ); | 
| 2947 | 0 |  |  |  |  | 0 | return $log_logging_levels; | 
| 2948 |  |  |  |  |  |  | } | 
| 2949 |  |  |  |  |  |  |  | 
| 2950 |  |  |  |  |  |  | sub sys_set_console_levels { | 
| 2951 |  |  |  |  |  |  | =begin wiki | 
| 2952 |  |  |  |  |  |  |  | 
| 2953 |  |  |  |  |  |  | !3 sys_set_console_levels | 
| 2954 |  |  |  |  |  |  |  | 
| 2955 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2956 |  |  |  |  |  |  |  | 
| 2957 |  |  |  |  |  |  | Please write this documentation. | 
| 2958 |  |  |  |  |  |  |  | 
| 2959 |  |  |  |  |  |  | Returns: | 
| 2960 |  |  |  |  |  |  |  | 
| 2961 |  |  |  |  |  |  | =cut | 
| 2962 | 0 |  | 0 | 0 | 0 | 0 | my $console_levels = shift || "FATAL,ERROR,WARN,INFO"; | 
| 2963 | 0 |  |  |  |  | 0 | $log_console_levels = _sys_check_severity_levels( $console_levels ); | 
| 2964 | 0 |  |  |  |  | 0 | return $log_console_levels; | 
| 2965 |  |  |  |  |  |  | } | 
| 2966 |  |  |  |  |  |  |  | 
| 2967 |  |  |  |  |  |  | sub sys_set_script_file { | 
| 2968 |  |  |  |  |  |  | =begin wiki | 
| 2969 |  |  |  |  |  |  |  | 
| 2970 |  |  |  |  |  |  | !3 sys_set_script_file | 
| 2971 |  |  |  |  |  |  |  | 
| 2972 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 2973 |  |  |  |  |  |  |  | 
| 2974 |  |  |  |  |  |  | Please write this documentation. | 
| 2975 |  |  |  |  |  |  |  | 
| 2976 |  |  |  |  |  |  | Returns: | 
| 2977 |  |  |  |  |  |  |  | 
| 2978 |  |  |  |  |  |  | =cut | 
| 2979 | 0 |  | 0 | 0 | 0 | 0 | my $file = shift || $script_file; | 
| 2980 | 0 |  |  |  |  | 0 | $script_file = $file; | 
| 2981 | 0 |  |  |  |  | 0 | return $script_file; | 
| 2982 |  |  |  |  |  |  |  | 
| 2983 |  |  |  |  |  |  | } | 
| 2984 |  |  |  |  |  |  |  | 
| 2985 |  |  |  |  |  |  | sub sys_set_conf_file { | 
| 2986 |  |  |  |  |  |  | =begin wiki | 
| 2987 |  |  |  |  |  |  |  | 
| 2988 |  |  |  |  |  |  | Parameters: ( jobconf ) | 
| 2989 |  |  |  |  |  |  |  | 
| 2990 |  |  |  |  |  |  | Manage the job conf file. | 
| 2991 |  |  |  |  |  |  |  | 
| 2992 |  |  |  |  |  |  | Set the value of the job conf filename and read the corresponding file. If \ | 
| 2993 |  |  |  |  |  |  | no job conf filename is given, set the job conf filename back to the default \ | 
| 2994 |  |  |  |  |  |  | value and reread the default job conf file (perform a reset). | 
| 2995 |  |  |  |  |  |  |  | 
| 2996 |  |  |  |  |  |  | Returns: | 
| 2997 |  |  |  |  |  |  |  | 
| 2998 |  |  |  |  |  |  | =cut | 
| 2999 | 0 |  | 0 | 0 | 0 | 0 | my $jobconf = shift || ''; | 
| 3000 |  |  |  |  |  |  |  | 
| 3001 | 0 | 0 |  |  |  | 0 | if ( $jobconf ) { | 
| 3002 |  |  |  |  |  |  | ## change jobconf file and read | 
| 3003 | 0 |  |  |  |  | 0 | $sys_jobconf_file = $jobconf . '.conf'; | 
| 3004 | 0 |  |  |  |  | 0 | _sys_read_conf( $sys_jobconf_file );  ## tie %conf_job to job conf file | 
| 3005 | 0 |  |  |  |  | 0 | _sys_read_job();  ## read job specific settings from %conf_job | 
| 3006 |  |  |  |  |  |  | } else { | 
| 3007 |  |  |  |  |  |  | ## reset jobconf file to default and reread | 
| 3008 | 0 |  |  |  |  | 0 | $sys_jobconf_file = _sys_check_de_override( $jobname . '.conf' ); | 
| 3009 | 0 |  |  |  |  | 0 | _sys_read_conf( $sys_jobconf_file );  ## tie %conf_job to job conf file | 
| 3010 | 0 |  |  |  |  | 0 | _sys_read_job();  ## read job specific settings from %conf_job | 
| 3011 |  |  |  |  |  |  | } | 
| 3012 | 0 |  |  |  |  | 0 | return 0; | 
| 3013 |  |  |  |  |  |  | } | 
| 3014 |  |  |  |  |  |  |  | 
| 3015 |  |  |  |  |  |  | sub sys_set_path_log_dir { | 
| 3016 |  |  |  |  |  |  | =begin wiki | 
| 3017 |  |  |  |  |  |  |  | 
| 3018 |  |  |  |  |  |  | !3 sys_set_path_log_dir | 
| 3019 |  |  |  |  |  |  |  | 
| 3020 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3021 |  |  |  |  |  |  |  | 
| 3022 |  |  |  |  |  |  | Please write this documentation. | 
| 3023 |  |  |  |  |  |  |  | 
| 3024 |  |  |  |  |  |  | Returns: | 
| 3025 |  |  |  |  |  |  |  | 
| 3026 |  |  |  |  |  |  | =cut | 
| 3027 | 0 |  | 0 | 0 | 0 | 0 | my $path = shift || $path_log_dir; | 
| 3028 | 0 |  |  |  |  | 0 | $path_log_dir = $path; | 
| 3029 | 0 |  |  |  |  | 0 | return $path_log_dir; | 
| 3030 |  |  |  |  |  |  | } | 
| 3031 |  |  |  |  |  |  |  | 
| 3032 |  |  |  |  |  |  | sub sys_set_path_plugin_dir { | 
| 3033 |  |  |  |  |  |  | =begin wiki | 
| 3034 |  |  |  |  |  |  |  | 
| 3035 |  |  |  |  |  |  | !3 sys_set_path_plugin_dir | 
| 3036 |  |  |  |  |  |  |  | 
| 3037 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3038 |  |  |  |  |  |  |  | 
| 3039 |  |  |  |  |  |  | Please write this documentation. | 
| 3040 |  |  |  |  |  |  |  | 
| 3041 |  |  |  |  |  |  | Returns: | 
| 3042 |  |  |  |  |  |  |  | 
| 3043 |  |  |  |  |  |  | =cut | 
| 3044 | 0 |  | 0 | 0 | 0 | 0 | my $path = shift || $path_plugin_dir; | 
| 3045 | 0 |  |  |  |  | 0 | $path_plugin_dir = $path; | 
| 3046 | 0 |  |  |  |  | 0 | return $path_plugin_dir; | 
| 3047 |  |  |  |  |  |  | } | 
| 3048 |  |  |  |  |  |  |  | 
| 3049 |  |  |  |  |  |  | sub sys_set_maxval { | 
| 3050 |  |  |  |  |  |  | =begin wiki | 
| 3051 |  |  |  |  |  |  |  | 
| 3052 |  |  |  |  |  |  | !3 sys_set_maxval | 
| 3053 |  |  |  |  |  |  |  | 
| 3054 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3055 |  |  |  |  |  |  |  | 
| 3056 |  |  |  |  |  |  | Please write this documentation. | 
| 3057 |  |  |  |  |  |  |  | 
| 3058 |  |  |  |  |  |  | Returns: | 
| 3059 |  |  |  |  |  |  |  | 
| 3060 |  |  |  |  |  |  | =cut | 
| 3061 | 0 |  |  | 0 | 0 | 0 | my ($key, $val) = @_; | 
| 3062 | 0 | 0 |  |  |  | 0 | if ( $maxval{$key} ) { | 
| 3063 | 0 | 0 |  |  |  | 0 | if ( $val > $maxval{$key} ) { | 
| 3064 | 0 |  |  |  |  | 0 | $maxval{$key} = $val; | 
| 3065 |  |  |  |  |  |  | } | 
| 3066 | 0 |  |  |  |  | 0 | return $val; | 
| 3067 |  |  |  |  |  |  | } | 
| 3068 | 0 |  |  |  |  | 0 | $maxval{$key} = $val; | 
| 3069 | 0 |  |  |  |  | 0 | return $val; | 
| 3070 |  |  |  |  |  |  | } | 
| 3071 |  |  |  |  |  |  |  | 
| 3072 |  |  |  |  |  |  | sub sys_check_dataenvr { | 
| 3073 |  |  |  |  |  |  | =begin wiki | 
| 3074 |  |  |  |  |  |  |  | 
| 3075 |  |  |  |  |  |  | !3 sys_check_dataenvr | 
| 3076 |  |  |  |  |  |  |  | 
| 3077 |  |  |  |  |  |  | Parameters: | 
| 3078 |  |  |  |  |  |  |  | 
| 3079 |  |  |  |  |  |  | /data_envrs/ = dataenvrs to check | 
| 3080 |  |  |  |  |  |  |  | 
| 3081 |  |  |  |  |  |  | Accept either a dataenvr or a ref to an array of dataenvrs. If \ | 
| 3082 |  |  |  |  |  |  | /data_envrs/ contains the current dataenvr, return true, otherwise return \ | 
| 3083 |  |  |  |  |  |  | false. | 
| 3084 |  |  |  |  |  |  |  | 
| 3085 |  |  |  |  |  |  | Returns: | 
| 3086 |  |  |  |  |  |  |  | 
| 3087 |  |  |  |  |  |  | =cut | 
| 3088 | 0 |  |  | 0 | 0 | 0 | my $data_envrs = shift; | 
| 3089 | 0 |  |  |  |  | 0 | my @check_envrs; | 
| 3090 |  |  |  |  |  |  |  | 
| 3091 | 0 | 0 |  |  |  | 0 | if ( ref $data_envrs eq 'ARRAY' ) { | 
| 3092 | 0 |  |  |  |  | 0 | @check_envrs = map { $_ } @{$data_envrs}; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 3093 |  |  |  |  |  |  | } else { | 
| 3094 | 0 |  |  |  |  | 0 | push @check_envrs, $data_envrs;  ## single entry | 
| 3095 |  |  |  |  |  |  | } | 
| 3096 |  |  |  |  |  |  |  | 
| 3097 |  |  |  |  |  |  | ## is current data environment in the list of acceptable environments | 
| 3098 | 0 | 0 |  |  |  | 0 | if ( grep { $_ eq $dataenvr } @check_envrs ) { | 
|  | 0 |  |  |  |  | 0 |  | 
| 3099 | 0 |  |  |  |  | 0 | return 1; | 
| 3100 |  |  |  |  |  |  | } | 
| 3101 |  |  |  |  |  |  |  | 
| 3102 | 0 |  |  |  |  | 0 | return 0; | 
| 3103 |  |  |  |  |  |  | } | 
| 3104 |  |  |  |  |  |  |  | 
| 3105 |  |  |  |  |  |  | sub sys_disp_doc { | 
| 3106 |  |  |  |  |  |  | =begin wiki | 
| 3107 |  |  |  |  |  |  |  | 
| 3108 |  |  |  |  |  |  | !3 sys_disp_doc | 
| 3109 |  |  |  |  |  |  |  | 
| 3110 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3111 |  |  |  |  |  |  |  | 
| 3112 |  |  |  |  |  |  | Please write this documentation. | 
| 3113 |  |  |  |  |  |  |  | 
| 3114 |  |  |  |  |  |  | Returns: | 
| 3115 |  |  |  |  |  |  |  | 
| 3116 |  |  |  |  |  |  | =cut | 
| 3117 | 0 |  |  | 0 | 0 | 0 | return _sys_disp_doc(); | 
| 3118 |  |  |  |  |  |  | } | 
| 3119 |  |  |  |  |  |  |  | 
| 3120 |  |  |  |  |  |  | sub sys_timer { | 
| 3121 |  |  |  |  |  |  | =begin wiki | 
| 3122 |  |  |  |  |  |  |  | 
| 3123 |  |  |  |  |  |  | !3 sys_timer | 
| 3124 |  |  |  |  |  |  |  | 
| 3125 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3126 |  |  |  |  |  |  |  | 
| 3127 |  |  |  |  |  |  | Please write this documentation. | 
| 3128 |  |  |  |  |  |  |  | 
| 3129 |  |  |  |  |  |  | Returns: | 
| 3130 |  |  |  |  |  |  |  | 
| 3131 |  |  |  |  |  |  | =cut | 
| 3132 | 0 |  |  | 0 | 0 | 0 | my ($opt, $timer_name) = @_; | 
| 3133 | 0 | 0 |  |  |  | 0 | $timer_name = 't1' unless $timer_name; | 
| 3134 |  |  |  |  |  |  |  | 
| 3135 | 0 | 0 |  |  |  | 0 | if ( $opt =~ m/start/ix ) { | 
| 3136 | 0 |  |  |  |  | 0 | $timers{$timer_name.'_start'} = time; | 
| 3137 | 0 |  |  |  |  | 0 | return $timers{$timer_name.'_start'}; | 
| 3138 |  |  |  |  |  |  | } | 
| 3139 | 0 | 0 |  |  |  | 0 | if ( $opt =~ m/stop/ix ) { | 
| 3140 | 0 |  |  |  |  | 0 | $timers{$timer_name.'_stop'} = time; | 
| 3141 | 0 |  |  |  |  | 0 | return $timers{$timer_name.'_stop'}; | 
| 3142 |  |  |  |  |  |  | } | 
| 3143 | 0 | 0 |  |  |  | 0 | if ( $opt =~ m/elapsed/ix ) { | 
| 3144 | 0 |  |  |  |  | 0 | my $estart = $timers{$timer_name.'_start'}; | 
| 3145 | 0 |  |  |  |  | 0 | my $estop = $timers{$timer_name.'_stop'}; | 
| 3146 | 0 |  |  |  |  | 0 | my $eelapsed = $estop - $estart; | 
| 3147 | 0 |  |  |  |  | 0 | my $ehours = int $eelapsed / 3600; | 
| 3148 | 0 |  |  |  |  | 0 | my $emins  = int $eelapsed / 60 % 60; | 
| 3149 | 0 |  |  |  |  | 0 | my $esecs  = int $eelapsed % 60; | 
| 3150 | 0 |  |  |  |  | 0 | return sprintf "%02d:%02d:%02d", $ehours, $emins, $esecs; | 
| 3151 |  |  |  |  |  |  | } | 
| 3152 | 0 | 0 |  |  |  | 0 | if ( $opt =~ /elapsed_seconds/i ) { | 
| 3153 | 0 |  |  |  |  | 0 | my $sstart = $timers{$timer_name.'_start'}; | 
| 3154 | 0 |  |  |  |  | 0 | my $sstop = $timers{$timer_name.'_stop'}; | 
| 3155 | 0 |  |  |  |  | 0 | my $selapsed = $sstop - $sstart; | 
| 3156 | 0 |  |  |  |  | 0 | return $selapsed; | 
| 3157 |  |  |  |  |  |  | } | 
| 3158 | 0 |  |  |  |  | 0 | return 'TIMER ERROR'; | 
| 3159 |  |  |  |  |  |  | } | 
| 3160 |  |  |  |  |  |  |  | 
| 3161 |  |  |  |  |  |  | sub sys_wait { | 
| 3162 |  |  |  |  |  |  | =begin wiki | 
| 3163 |  |  |  |  |  |  |  | 
| 3164 |  |  |  |  |  |  | !3 sys_wait | 
| 3165 |  |  |  |  |  |  |  | 
| 3166 |  |  |  |  |  |  | Parameters: ( $action, $minutes ) | 
| 3167 |  |  |  |  |  |  |  | 
| 3168 |  |  |  |  |  |  | $action can be either: | 
| 3169 |  |  |  |  |  |  |  | 
| 3170 |  |  |  |  |  |  | * 'init' - initialize wait's start time and elapsed time | 
| 3171 |  |  |  |  |  |  | * 'wait' - wait until $minutes has elapsed since start time | 
| 3172 |  |  |  |  |  |  |  | 
| 3173 |  |  |  |  |  |  | Example: | 
| 3174 |  |  |  |  |  |  |  | 
| 3175 |  |  |  |  |  |  | % language=Perl | 
| 3176 |  |  |  |  |  |  | % sys_wait( 'init', 3 ); | 
| 3177 |  |  |  |  |  |  | % ... do some work | 
| 3178 |  |  |  |  |  |  | % sys_wait( 'wait' ); | 
| 3179 |  |  |  |  |  |  | %% | 
| 3180 |  |  |  |  |  |  |  | 
| 3181 |  |  |  |  |  |  | Returns: | 
| 3182 |  |  |  |  |  |  |  | 
| 3183 |  |  |  |  |  |  | =cut | 
| 3184 | 0 |  |  | 0 | 0 | 0 | my ($action, $minutes) = @_; | 
| 3185 |  |  |  |  |  |  |  | 
| 3186 | 0 | 0 |  |  |  | 0 | if ( $action =~ /^init$/i ) { | 
| 3187 | 0 |  |  |  |  | 0 | $wt_start = time; | 
| 3188 | 0 |  |  |  |  | 0 | $wt_seconds = 0; | 
| 3189 | 0 | 0 |  |  |  | 0 | return 0 unless $minutes =~ /^\d+$/; | 
| 3190 | 0 |  |  |  |  | 0 | $wt_seconds = $minutes * 60; | 
| 3191 |  |  |  |  |  |  | } | 
| 3192 |  |  |  |  |  |  |  | 
| 3193 | 0 | 0 |  |  |  | 0 | if ( $action =~ /^wait$/i ) { | 
| 3194 | 0 |  |  |  |  | 0 | while ( 1 ) { | 
| 3195 | 0 |  |  |  |  | 0 | my $currtime = time; | 
| 3196 | 0 |  |  |  |  | 0 | my $elapsedt = $currtime - $wt_start; | 
| 3197 | 0 |  |  |  |  | 0 | log_info( "Waiting $wt_seconds, Elapsed: $elapsedt" ); | 
| 3198 | 0 | 0 |  |  |  | 0 | if ( ($currtime - $wt_start) < $wt_seconds ) { | 
| 3199 | 0 |  |  |  |  | 0 | sleep 10; | 
| 3200 |  |  |  |  |  |  | } else { | 
| 3201 | 0 |  |  |  |  | 0 | last; | 
| 3202 |  |  |  |  |  |  | } | 
| 3203 |  |  |  |  |  |  | } | 
| 3204 |  |  |  |  |  |  | } | 
| 3205 |  |  |  |  |  |  |  | 
| 3206 | 0 |  |  |  |  | 0 | return 0; | 
| 3207 |  |  |  |  |  |  | } | 
| 3208 |  |  |  |  |  |  |  | 
| 3209 |  |  |  |  |  |  | =begin wiki | 
| 3210 |  |  |  |  |  |  |  | 
| 3211 |  |  |  |  |  |  | !2 Logging Functions | 
| 3212 |  |  |  |  |  |  |  | 
| 3213 |  |  |  |  |  |  | These functions provide logging and notification capabilities. | 
| 3214 |  |  |  |  |  |  |  | 
| 3215 |  |  |  |  |  |  | =cut | 
| 3216 |  |  |  |  |  |  |  | 
| 3217 |  |  |  |  |  |  | sub log_fatal { | 
| 3218 |  |  |  |  |  |  | =begin wiki | 
| 3219 |  |  |  |  |  |  |  | 
| 3220 |  |  |  |  |  |  | !3 log_fatal | 
| 3221 |  |  |  |  |  |  |  | 
| 3222 |  |  |  |  |  |  | Parameters: ( message ) | 
| 3223 |  |  |  |  |  |  |  | 
| 3224 |  |  |  |  |  |  | Call lower level logging functions using severity level FATAL. | 
| 3225 |  |  |  |  |  |  |  | 
| 3226 |  |  |  |  |  |  | Returns: | 
| 3227 |  |  |  |  |  |  |  | 
| 3228 |  |  |  |  |  |  | =cut | 
| 3229 | 0 |  |  | 0 | 0 | 0 | my ($message, $extmsg) = @_; | 
| 3230 | 0 |  |  |  |  | 0 | $errorlevel = $RC_FATAL; | 
| 3231 | 0 |  |  |  |  | 0 | _log_write_to_log( 'FATAL', 0, $message, $extmsg); | 
| 3232 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'FATAL', 0, $message, $extmsg); | 
| 3233 | 0 |  |  |  |  | 0 | return $errorlevel; | 
| 3234 |  |  |  |  |  |  | } | 
| 3235 |  |  |  |  |  |  |  | 
| 3236 |  |  |  |  |  |  | sub log_error { | 
| 3237 |  |  |  |  |  |  | =begin wiki | 
| 3238 |  |  |  |  |  |  |  | 
| 3239 |  |  |  |  |  |  | !3 log_error | 
| 3240 |  |  |  |  |  |  |  | 
| 3241 |  |  |  |  |  |  | Parameters: ( message ) | 
| 3242 |  |  |  |  |  |  |  | 
| 3243 |  |  |  |  |  |  | Call lower level logging functions using severity level ERROR. | 
| 3244 |  |  |  |  |  |  |  | 
| 3245 |  |  |  |  |  |  | Returns: | 
| 3246 |  |  |  |  |  |  |  | 
| 3247 |  |  |  |  |  |  | =cut | 
| 3248 | 0 |  |  | 0 | 0 | 0 | my ($message, $extmsg) = @_; | 
| 3249 | 0 |  |  |  |  | 0 | $errorlevel = $RC_ERROR; | 
| 3250 | 0 |  |  |  |  | 0 | _log_write_to_log( 'ERROR', 0, $message, $extmsg); | 
| 3251 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'ERROR', 0, $message, $extmsg); | 
| 3252 | 0 |  |  |  |  | 0 | return $errorlevel; | 
| 3253 |  |  |  |  |  |  | } | 
| 3254 |  |  |  |  |  |  |  | 
| 3255 |  |  |  |  |  |  | sub log_warn { | 
| 3256 |  |  |  |  |  |  | =begin wiki | 
| 3257 |  |  |  |  |  |  |  | 
| 3258 |  |  |  |  |  |  | !3 log_warn | 
| 3259 |  |  |  |  |  |  |  | 
| 3260 |  |  |  |  |  |  | Parameters: ( message ) | 
| 3261 |  |  |  |  |  |  |  | 
| 3262 |  |  |  |  |  |  | Call lower level logging functions using severity level WARN. | 
| 3263 |  |  |  |  |  |  |  | 
| 3264 |  |  |  |  |  |  | Returns: | 
| 3265 |  |  |  |  |  |  |  | 
| 3266 |  |  |  |  |  |  | =cut | 
| 3267 | 0 |  |  | 0 | 0 | 0 | my ($message, $extmsg) = @_; | 
| 3268 | 0 |  |  |  |  | 0 | $errorlevel = $RC_WARN; | 
| 3269 | 0 |  |  |  |  | 0 | _log_write_to_log( 'WARN', 0, $message, $extmsg); | 
| 3270 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'WARN', 0, $message, $extmsg); | 
| 3271 | 0 |  |  |  |  | 0 | return $errorlevel; | 
| 3272 |  |  |  |  |  |  | } | 
| 3273 |  |  |  |  |  |  |  | 
| 3274 |  |  |  |  |  |  | sub log_info { | 
| 3275 |  |  |  |  |  |  | =begin wiki | 
| 3276 |  |  |  |  |  |  |  | 
| 3277 |  |  |  |  |  |  | !3 log_info | 
| 3278 |  |  |  |  |  |  |  | 
| 3279 |  |  |  |  |  |  | Parameters: ( message ) | 
| 3280 |  |  |  |  |  |  |  | 
| 3281 |  |  |  |  |  |  | Call lower level logging functions using severity level INFO. | 
| 3282 |  |  |  |  |  |  |  | 
| 3283 |  |  |  |  |  |  | Returns: | 
| 3284 |  |  |  |  |  |  |  | 
| 3285 |  |  |  |  |  |  | =cut | 
| 3286 | 0 |  |  | 0 | 0 | 0 | my ($message, $extmsg, $nolog) = @_; | 
| 3287 | 0 | 0 |  |  |  | 0 | $nolog = 0 unless $nolog; | 
| 3288 | 0 | 0 |  |  |  | 0 | return 0 if $nolog; | 
| 3289 | 0 |  |  |  |  | 0 | _log_write_to_log( 'INFO', 0, $message, $extmsg); | 
| 3290 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'INFO', 0, $message, $extmsg); | 
| 3291 | 0 |  |  |  |  | 0 | return 0; | 
| 3292 |  |  |  |  |  |  | } | 
| 3293 |  |  |  |  |  |  |  | 
| 3294 |  |  |  |  |  |  | sub log_debug { | 
| 3295 |  |  |  |  |  |  | =begin wiki | 
| 3296 |  |  |  |  |  |  |  | 
| 3297 |  |  |  |  |  |  | !3 log_debug | 
| 3298 |  |  |  |  |  |  |  | 
| 3299 |  |  |  |  |  |  | Parameters: ( message ) | 
| 3300 |  |  |  |  |  |  |  | 
| 3301 |  |  |  |  |  |  | Call lower level logging functions using severity level DEBUG. | 
| 3302 |  |  |  |  |  |  |  | 
| 3303 |  |  |  |  |  |  | Returns: | 
| 3304 |  |  |  |  |  |  |  | 
| 3305 |  |  |  |  |  |  | =cut | 
| 3306 | 0 |  |  | 0 | 0 | 0 | my ($message, $extmsg) = @_; | 
| 3307 | 0 |  |  |  |  | 0 | _log_write_to_log( 'DEBUG', 0, $message, $extmsg); | 
| 3308 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'DEBUG', 0, $message, $extmsg); | 
| 3309 | 0 |  |  |  |  | 0 | return 0; | 
| 3310 |  |  |  |  |  |  | } | 
| 3311 |  |  |  |  |  |  |  | 
| 3312 |  |  |  |  |  |  | sub log_close { | 
| 3313 |  |  |  |  |  |  | =begin wiki | 
| 3314 |  |  |  |  |  |  |  | 
| 3315 |  |  |  |  |  |  | !3 log_close | 
| 3316 |  |  |  |  |  |  |  | 
| 3317 |  |  |  |  |  |  | Parameters: ( message ) | 
| 3318 |  |  |  |  |  |  |  | 
| 3319 |  |  |  |  |  |  | Close the currently open log file. | 
| 3320 |  |  |  |  |  |  |  | 
| 3321 |  |  |  |  |  |  | Returns: 0 | 
| 3322 |  |  |  |  |  |  |  | 
| 3323 |  |  |  |  |  |  | =cut | 
| 3324 | 0 |  |  | 0 | 0 | 0 | my ($message, $extmsg) = @_; | 
| 3325 |  |  |  |  |  |  |  | 
| 3326 | 0 |  |  |  |  | 0 | _log_write_to_log( 'INFO', 0, $message, $extmsg); | 
| 3327 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'INFO', 0, $message, $extmsg); | 
| 3328 | 0 |  |  |  |  | 0 | $sys_log_open = 0; | 
| 3329 |  |  |  |  |  |  |  | 
| 3330 | 0 |  |  |  |  | 0 | return 0; | 
| 3331 |  |  |  |  |  |  | } | 
| 3332 |  |  |  |  |  |  |  | 
| 3333 |  |  |  |  |  |  | sub log_write_screen { | 
| 3334 |  |  |  |  |  |  | =begin wiki | 
| 3335 |  |  |  |  |  |  |  | 
| 3336 |  |  |  |  |  |  | !3 log_write_screen | 
| 3337 |  |  |  |  |  |  |  | 
| 3338 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3339 |  |  |  |  |  |  |  | 
| 3340 |  |  |  |  |  |  | Please write this documentation. | 
| 3341 |  |  |  |  |  |  |  | 
| 3342 |  |  |  |  |  |  | Returns: | 
| 3343 |  |  |  |  |  |  |  | 
| 3344 |  |  |  |  |  |  | =cut | 
| 3345 | 0 |  |  | 0 | 0 | 0 | my $message = shift; | 
| 3346 | 0 |  |  |  |  | 0 | _log_write_to_screen( 'INFO', 1, $message); | 
| 3347 | 0 |  |  |  |  | 0 | return 0; | 
| 3348 |  |  |  |  |  |  | } | 
| 3349 |  |  |  |  |  |  |  | 
| 3350 |  |  |  |  |  |  | sub log_write_log { | 
| 3351 |  |  |  |  |  |  | =begin wiki | 
| 3352 |  |  |  |  |  |  |  | 
| 3353 |  |  |  |  |  |  | !3 log_write_log | 
| 3354 |  |  |  |  |  |  |  | 
| 3355 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3356 |  |  |  |  |  |  |  | 
| 3357 |  |  |  |  |  |  | Please write this documentation. | 
| 3358 |  |  |  |  |  |  |  | 
| 3359 |  |  |  |  |  |  | Returns: | 
| 3360 |  |  |  |  |  |  |  | 
| 3361 |  |  |  |  |  |  | =cut | 
| 3362 | 0 |  |  | 0 | 0 | 0 | my $message = shift; | 
| 3363 | 0 |  |  |  |  | 0 | _log_write_to_log( 'INFO', 1, $message); | 
| 3364 | 0 |  |  |  |  | 0 | return 0; | 
| 3365 |  |  |  |  |  |  | } | 
| 3366 |  |  |  |  |  |  |  | 
| 3367 |  |  |  |  |  |  | =begin wiki | 
| 3368 |  |  |  |  |  |  |  | 
| 3369 |  |  |  |  |  |  | !2 Database Functions | 
| 3370 |  |  |  |  |  |  |  | 
| 3371 |  |  |  |  |  |  | These functions provide the database interface and data manipulation \ | 
| 3372 |  |  |  |  |  |  | capabilities. | 
| 3373 |  |  |  |  |  |  |  | 
| 3374 |  |  |  |  |  |  | =cut | 
| 3375 |  |  |  |  |  |  |  | 
| 3376 |  |  |  |  |  |  | sub db_init { | 
| 3377 |  |  |  |  |  |  | =begin wiki | 
| 3378 |  |  |  |  |  |  |  | 
| 3379 |  |  |  |  |  |  | !3 db_init | 
| 3380 |  |  |  |  |  |  |  | 
| 3381 |  |  |  |  |  |  | Parameters: ( ) | 
| 3382 |  |  |  |  |  |  |  | 
| 3383 |  |  |  |  |  |  | User interface to settings used by the various db functions. Requested \ | 
| 3384 |  |  |  |  |  |  | settings are validated against those held in the db_func_parmas hash. | 
| 3385 |  |  |  |  |  |  |  | 
| 3386 |  |  |  |  |  |  | Returns: | 
| 3387 |  |  |  |  |  |  |  | 
| 3388 |  |  |  |  |  |  | =cut | 
| 3389 | 0 |  |  | 0 | 0 | 0 | my ($id, %params) = @_; | 
| 3390 | 0 | 0 |  |  |  | 0 | if ( ! defined $db_func_params{$id} ) { | 
| 3391 | 0 |  |  |  |  | 0 | sys_die( "Param $id to db_init is invalid") | 
| 3392 |  |  |  |  |  |  | } | 
| 3393 | 0 |  |  |  |  | 0 | foreach my $key ( keys %params ) { | 
| 3394 | 0 | 0 |  |  |  | 0 | if ( ! defined $db_func_params{$id}{$key} ) { | 
| 3395 | 0 |  |  |  |  | 0 | sys_die( "Param $key to db_init is invalid" ); | 
| 3396 |  |  |  |  |  |  | } | 
| 3397 | 0 |  |  |  |  | 0 | $db_func_params{$id}{$key} = $params{$key}; | 
| 3398 |  |  |  |  |  |  | } | 
| 3399 | 0 |  |  |  |  | 0 | return 0; | 
| 3400 |  |  |  |  |  |  | } | 
| 3401 |  |  |  |  |  |  |  | 
| 3402 |  |  |  |  |  |  | sub db_connect { | 
| 3403 |  |  |  |  |  |  | =begin wiki | 
| 3404 |  |  |  |  |  |  |  | 
| 3405 |  |  |  |  |  |  | !3 db_connect | 
| 3406 |  |  |  |  |  |  |  | 
| 3407 |  |  |  |  |  |  | Parameters: ( vdn ) | 
| 3408 |  |  |  |  |  |  |  | 
| 3409 |  |  |  |  |  |  | This function accepts a virtual database name and makes a connection to the \ | 
| 3410 |  |  |  |  |  |  | database resource identified by that name. The desired database instance has \ | 
| 3411 |  |  |  |  |  |  | already been determined and stored before this function is called. | 
| 3412 |  |  |  |  |  |  |  | 
| 3413 |  |  |  |  |  |  | This function sets the DBI tracing mode so that we have a dbitrace.log file \ | 
| 3414 |  |  |  |  |  |  | with pertinent history in it. This file will get large, so it should be \ | 
| 3415 |  |  |  |  |  |  | rotated frequently. Contrary to what I've read, this does not supress \ | 
| 3416 |  |  |  |  |  |  | output to STDERR. It appears that this just forces DBI to write errors to \ | 
| 3417 |  |  |  |  |  |  | both STDERR and the dbitrace file. To fix that, this function redirects \ | 
| 3418 |  |  |  |  |  |  | STDERR to /dev/null. This is an ugly hack. So until I can figure out if I \ | 
| 3419 |  |  |  |  |  |  | read the docs wrong, or if DBI is just broken in this regard, I need to \ | 
| 3420 |  |  |  |  |  |  | leave this to prevent garbage output. It's garbage because I always check \ | 
| 3421 |  |  |  |  |  |  | and log DBI errors anyway. | 
| 3422 |  |  |  |  |  |  |  | 
| 3423 |  |  |  |  |  |  | Returns: | 
| 3424 |  |  |  |  |  |  |  | 
| 3425 |  |  |  |  |  |  | =cut | 
| 3426 | 0 |  |  | 0 | 0 | 0 | my ($vdn, %connect_params) = @_; | 
| 3427 | 0 |  |  |  |  | 0 | my ($starttime, $dbh, $instance); | 
| 3428 |  |  |  |  |  |  |  | 
| 3429 |  |  |  |  |  |  | ## time increment is secs, action is either 'run' or 'fail' | 
| 3430 | 0 |  | 0 |  |  | 0 | my $dependent_jobname = $connect_params{dependent_jobname} || ''; | 
| 3431 | 0 |  | 0 |  |  | 0 | my $wait_duration     = $connect_params{wait_duration}     || 60; | 
| 3432 | 0 |  | 0 |  |  | 0 | my $wait_max_secs     = $connect_params{wait_max_secs}     || 60*60; | 
| 3433 | 0 |  | 0 |  |  | 0 | my $wait_action       = $connect_params{wait_action}       || 'fail'; | 
| 3434 | 0 |  | 0 |  |  | 0 | my $retry_duration    = $connect_params{retry_duration}    || 0; | 
| 3435 | 0 |  | 0 |  |  | 0 | my $retry_max_secs    = $connect_params{retry_max_secs}    || 0; | 
| 3436 |  |  |  |  |  |  |  | 
| 3437 | 0 | 0 |  |  |  | 0 | if ( $vdn =~ m/:/x ) {  ## vdn contains instance definiton | 
| 3438 | 0 |  |  |  |  | 0 | my ($db, $inst) = split m/:/, $vdn; | 
| 3439 | 0 | 0 |  |  |  | 0 | _check_array_val( $db, \@databases ) | 
| 3440 |  |  |  |  |  |  | || sys_die( "Invalid database: [$db]", 0 ); | 
| 3441 | 0 | 0 |  |  |  | 0 | _check_array_val( $inst, [split m/,/, $dbinst{$db}] ) | 
| 3442 |  |  |  |  |  |  | || sys_die( "Invalid database instance: [$db.$inst]", 0 ); | 
| 3443 | 0 |  |  |  |  | 0 | $dbdefenvr{$db} = $inst;  ## update default connection data | 
| 3444 | 0 |  |  |  |  | 0 | $vdn = $db;  ## vdn gets true vdn | 
| 3445 |  |  |  |  |  |  | } | 
| 3446 |  |  |  |  |  |  |  | 
| 3447 |  |  |  |  |  |  | ## check for dependent job | 
| 3448 |  |  |  |  |  |  | _db_connect_check_dependent( | 
| 3449 | 0 |  |  |  |  | 0 | $dependent_jobname, $wait_duration, $wait_max_secs, $wait_action | 
| 3450 |  |  |  |  |  |  | ); | 
| 3451 |  |  |  |  |  |  |  | 
| 3452 |  |  |  |  |  |  | ## get database parameters | 
| 3453 | 0 |  |  |  |  | 0 | my ($db, $un, $pw) = _db_vdn('connect', $vdn); | 
| 3454 | 0 |  |  |  |  | 0 | DBI->trace( 1, $dbitrace_filefull ); | 
| 3455 | 0 | 0 |  |  |  | 0 | open STDERR, '>', '/dev/null' unless $opt_very_verbose; | 
| 3456 |  |  |  |  |  |  |  | 
| 3457 |  |  |  |  |  |  | ## connect with retry | 
| 3458 | 0 |  |  |  |  | 0 | $dbh = _db_connect_retry( | 
| 3459 |  |  |  |  |  |  | $db, $un, $pw, $retry_duration, $retry_max_secs | 
| 3460 |  |  |  |  |  |  | ); | 
| 3461 |  |  |  |  |  |  |  | 
| 3462 |  |  |  |  |  |  | ## connection established | 
| 3463 | 0 |  |  |  |  | 0 | $dbhandles{$vdn}{'dbh'} = $dbh;   ## store handle for cleanup on exit | 
| 3464 |  |  |  |  |  |  |  | 
| 3465 | 0 |  |  |  |  | 0 | db_nil( $vdn ); | 
| 3466 | 0 |  |  |  |  | 0 | return 0; | 
| 3467 |  |  |  |  |  |  | } | 
| 3468 |  |  |  |  |  |  |  | 
| 3469 |  |  |  |  |  |  | sub db_nil { | 
| 3470 |  |  |  |  |  |  | =begin wiki | 
| 3471 |  |  |  |  |  |  |  | 
| 3472 |  |  |  |  |  |  | !3 db_nil | 
| 3473 |  |  |  |  |  |  |  | 
| 3474 |  |  |  |  |  |  | Parameters: ( ) | 
| 3475 |  |  |  |  |  |  |  | 
| 3476 |  |  |  |  |  |  | This is just a convenience function. When running in test mode, this will \ | 
| 3477 |  |  |  |  |  |  | call the internal C<_db_vdn> to function for force closure of all database \ | 
| 3478 |  |  |  |  |  |  | connections immediately. | 
| 3479 |  |  |  |  |  |  |  | 
| 3480 |  |  |  |  |  |  | Returns: | 
| 3481 |  |  |  |  |  |  |  | 
| 3482 |  |  |  |  |  |  | =cut | 
| 3483 | 0 |  |  | 0 | 0 | 0 | my $vdn = shift; | 
| 3484 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn( 'nil', $vdn); | 
| 3485 | 0 |  |  |  |  | 0 | return 0; | 
| 3486 |  |  |  |  |  |  | } | 
| 3487 |  |  |  |  |  |  |  | 
| 3488 |  |  |  |  |  |  | sub db_disconnect { | 
| 3489 |  |  |  |  |  |  | =begin wiki | 
| 3490 |  |  |  |  |  |  |  | 
| 3491 |  |  |  |  |  |  | !3 db_disconnect | 
| 3492 |  |  |  |  |  |  |  | 
| 3493 |  |  |  |  |  |  | Parameters: ( vdn ) | 
| 3494 |  |  |  |  |  |  |  | 
| 3495 |  |  |  |  |  |  | Accept a virtual database name and disconnect from the datatabase specified \ | 
| 3496 |  |  |  |  |  |  | by the virtual database name. | 
| 3497 |  |  |  |  |  |  |  | 
| 3498 |  |  |  |  |  |  | Returns: | 
| 3499 |  |  |  |  |  |  |  | 
| 3500 |  |  |  |  |  |  | =cut | 
| 3501 | 0 |  |  | 0 | 0 | 0 | my $vdn = shift; | 
| 3502 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn( 'disconnect', $vdn); | 
| 3503 |  |  |  |  |  |  |  | 
| 3504 | 0 | 0 |  |  |  | 0 | if ( $dbh ) { | 
| 3505 | 0 |  |  |  |  | 0 | $dbh->disconnect; | 
| 3506 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { | 
| 3507 | 0 |  |  |  |  | 0 | log_warn( DBI->errstr ); | 
| 3508 | 0 |  |  |  |  | 0 | return 1; | 
| 3509 |  |  |  |  |  |  | } | 
| 3510 |  |  |  |  |  |  | } | 
| 3511 | 0 |  |  |  |  | 0 | $dbhandles{$vdn}{'dbh'} = 0; | 
| 3512 | 0 |  |  |  |  | 0 | return 0; | 
| 3513 |  |  |  |  |  |  | } | 
| 3514 |  |  |  |  |  |  |  | 
| 3515 |  |  |  |  |  |  | sub db_finish { | 
| 3516 |  |  |  |  |  |  | =begin wiki | 
| 3517 |  |  |  |  |  |  |  | 
| 3518 |  |  |  |  |  |  | !3 db_finish | 
| 3519 |  |  |  |  |  |  |  | 
| 3520 |  |  |  |  |  |  | Parameters: ( vdn ) | 
| 3521 |  |  |  |  |  |  |  | 
| 3522 |  |  |  |  |  |  | Accept a virtual database name and close the current statement handle for \ | 
| 3523 |  |  |  |  |  |  | the database specified by the virtual database name. | 
| 3524 |  |  |  |  |  |  |  | 
| 3525 |  |  |  |  |  |  | Returns: | 
| 3526 |  |  |  |  |  |  |  | 
| 3527 |  |  |  |  |  |  | =cut | 
| 3528 | 0 |  |  | 0 | 0 | 0 | my $vdn = shift; | 
| 3529 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn( 'finish', $vdn); | 
| 3530 |  |  |  |  |  |  |  | 
| 3531 | 0 | 0 |  |  |  | 0 | if ( $sth ) { | 
| 3532 | 0 |  |  |  |  | 0 | $sth->finish; | 
| 3533 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { | 
| 3534 | 0 |  |  |  |  | 0 | log_warn( DBI->errstr ); | 
| 3535 | 0 |  |  |  |  | 0 | return 1; | 
| 3536 |  |  |  |  |  |  | } | 
| 3537 |  |  |  |  |  |  | } | 
| 3538 | 0 |  |  |  |  | 0 | $dbhandles{$vdn}{'sth'} = 0; | 
| 3539 | 0 |  |  |  |  | 0 | return 0; | 
| 3540 |  |  |  |  |  |  | } | 
| 3541 |  |  |  |  |  |  |  | 
| 3542 |  |  |  |  |  |  | sub db_prepare { | 
| 3543 |  |  |  |  |  |  | =begin wiki | 
| 3544 |  |  |  |  |  |  |  | 
| 3545 |  |  |  |  |  |  | !3 db_prepare | 
| 3546 |  |  |  |  |  |  |  | 
| 3547 |  |  |  |  |  |  | Parameters: ( vdn, sql_query ) | 
| 3548 |  |  |  |  |  |  |  | 
| 3549 |  |  |  |  |  |  | Accept a virtual database name and an sql query and prepares the query for \ | 
| 3550 |  |  |  |  |  |  | database processing. This function stores the resulting statement handle for \ | 
| 3551 |  |  |  |  |  |  | subsequent access under the via the virtual database name. | 
| 3552 |  |  |  |  |  |  |  | 
| 3553 |  |  |  |  |  |  | Returns: | 
| 3554 |  |  |  |  |  |  |  | 
| 3555 |  |  |  |  |  |  | =cut | 
| 3556 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $sql, $longrlen) = @_; | 
| 3557 | 0 | 0 |  |  |  | 0 | $longrlen = 0 unless $longrlen; | 
| 3558 | 0 |  |  |  |  | 0 | my $sth_name = 'sth_default';  ## default statement handle name | 
| 3559 | 0 | 0 |  |  |  | 0 | if ( $vdn =~ m/\./x ) { | 
| 3560 | 0 |  |  |  |  | 0 | ($vdn, $sth_name) = split m/\./x, $vdn; | 
| 3561 | 0 | 0 |  |  |  | 0 | if ( $sth_name eq 'sth_default' ) { | 
| 3562 | 0 |  |  |  |  | 0 | sys_die( 'Invalid statement handle name', 0 ); | 
| 3563 |  |  |  |  |  |  | } | 
| 3564 |  |  |  |  |  |  | } | 
| 3565 |  |  |  |  |  |  |  | 
| 3566 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('prepare', $vdn); | 
| 3567 |  |  |  |  |  |  |  | 
| 3568 | 0 | 0 |  |  |  | 0 | if ( $longrlen > 0 ) { $dbh->{LongReadLen} = $longrlen; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 3569 |  |  |  |  |  |  |  | 
| 3570 | 0 | 0 |  |  |  | 0 | $sth = $dbh->prepare( $sql ) | 
| 3571 |  |  |  |  |  |  | or sys_die( $dbh->errstr ); | 
| 3572 |  |  |  |  |  |  |  | 
| 3573 |  |  |  |  |  |  | ## store statement handle for this vdn | 
| 3574 | 0 |  |  |  |  | 0 | $dbhandles{$vdn}{$sth_name} = $sth; | 
| 3575 |  |  |  |  |  |  |  | 
| 3576 | 0 |  |  |  |  | 0 | return 0; | 
| 3577 |  |  |  |  |  |  | } | 
| 3578 |  |  |  |  |  |  |  | 
| 3579 |  |  |  |  |  |  | sub db_truncate { | 
| 3580 |  |  |  |  |  |  | =begin wiki | 
| 3581 |  |  |  |  |  |  |  | 
| 3582 |  |  |  |  |  |  | !3 db_truncate | 
| 3583 |  |  |  |  |  |  |  | 
| 3584 |  |  |  |  |  |  | Parameters: ( vdn, table_name ) | 
| 3585 |  |  |  |  |  |  |  | 
| 3586 |  |  |  |  |  |  | Accept a virtual database name and a table name. Truncate the specified \ | 
| 3587 |  |  |  |  |  |  | table. This function returns number of rows truncated. | 
| 3588 |  |  |  |  |  |  |  | 
| 3589 |  |  |  |  |  |  | Returns: | 
| 3590 |  |  |  |  |  |  |  | 
| 3591 |  |  |  |  |  |  | =cut | 
| 3592 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $table_name) = @_; | 
| 3593 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('truncate', $vdn); | 
| 3594 |  |  |  |  |  |  |  | 
| 3595 | 0 |  |  |  |  | 0 | my $sql = "truncate table $table_name"; | 
| 3596 | 0 | 0 |  |  |  | 0 | $dbh->do( $sql ) | 
| 3597 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 3598 |  |  |  |  |  |  |  | 
| 3599 | 0 |  |  |  |  | 0 | return 0; | 
| 3600 |  |  |  |  |  |  | } | 
| 3601 |  |  |  |  |  |  |  | 
| 3602 |  |  |  |  |  |  | sub db_execute { | 
| 3603 |  |  |  |  |  |  | =begin wiki | 
| 3604 |  |  |  |  |  |  |  | 
| 3605 |  |  |  |  |  |  | !3 db_execute | 
| 3606 |  |  |  |  |  |  |  | 
| 3607 |  |  |  |  |  |  | Parameters: ( vdn, sql_substitution_paramaters ) | 
| 3608 |  |  |  |  |  |  |  | 
| 3609 |  |  |  |  |  |  | Accept a virtual database name and sql substitution parameters. Execute \ | 
| 3610 |  |  |  |  |  |  | the query against the stored statement handle associated with the supplied \ | 
| 3611 |  |  |  |  |  |  | virtual database name. The statement handle needs to be prepard before this \ | 
| 3612 |  |  |  |  |  |  | function is called. | 
| 3613 |  |  |  |  |  |  |  | 
| 3614 |  |  |  |  |  |  | Returns: | 
| 3615 |  |  |  |  |  |  |  | 
| 3616 |  |  |  |  |  |  | =cut | 
| 3617 | 0 |  |  | 0 | 0 | 0 | my ($vdn, @params) = @_; | 
| 3618 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('execute', $vdn); | 
| 3619 |  |  |  |  |  |  |  | 
| 3620 | 0 | 0 |  |  |  | 0 | $sth->execute( @params ) | 
| 3621 |  |  |  |  |  |  | or sys_die( $sth->errstr ); | 
| 3622 |  |  |  |  |  |  |  | 
| 3623 | 0 |  |  |  |  | 0 | return 0; | 
| 3624 |  |  |  |  |  |  | } | 
| 3625 |  |  |  |  |  |  |  | 
| 3626 |  |  |  |  |  |  | sub db_get_sth { | 
| 3627 |  |  |  |  |  |  | =begin wiki | 
| 3628 |  |  |  |  |  |  |  | 
| 3629 |  |  |  |  |  |  | !3 db_get_sth | 
| 3630 |  |  |  |  |  |  |  | 
| 3631 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3632 |  |  |  |  |  |  |  | 
| 3633 |  |  |  |  |  |  | Please write this documentation. | 
| 3634 |  |  |  |  |  |  |  | 
| 3635 |  |  |  |  |  |  | Returns: | 
| 3636 |  |  |  |  |  |  |  | 
| 3637 |  |  |  |  |  |  | =cut | 
| 3638 | 0 |  |  | 0 | 0 | 0 | my $vdn = shift; | 
| 3639 | 0 |  |  |  |  | 0 | my $sth_name = 'sth_default';  ## default statement handle name | 
| 3640 | 0 | 0 |  |  |  | 0 | if ( $vdn =~ m/\./x ) { | 
| 3641 | 0 |  |  |  |  | 0 | ($vdn, $sth_name) = split m/\./x, $vdn; | 
| 3642 |  |  |  |  |  |  | } | 
| 3643 | 0 |  |  |  |  | 0 | return $dbhandles{$vdn}{$sth_name}; | 
| 3644 |  |  |  |  |  |  | } | 
| 3645 |  |  |  |  |  |  |  | 
| 3646 |  |  |  |  |  |  | sub db_get_defenvr { | 
| 3647 |  |  |  |  |  |  | =begin wiki | 
| 3648 |  |  |  |  |  |  |  | 
| 3649 |  |  |  |  |  |  | !3 db_get_defenvr | 
| 3650 |  |  |  |  |  |  |  | 
| 3651 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3652 |  |  |  |  |  |  |  | 
| 3653 |  |  |  |  |  |  | Please write this documentation. | 
| 3654 |  |  |  |  |  |  |  | 
| 3655 |  |  |  |  |  |  | Returns: | 
| 3656 |  |  |  |  |  |  |  | 
| 3657 |  |  |  |  |  |  | =cut | 
| 3658 | 0 |  |  | 0 | 0 | 0 | my $vdn = shift; | 
| 3659 |  |  |  |  |  |  |  | 
| 3660 | 0 | 0 |  |  |  | 0 | if ( $dbdefenvr{$vdn} ) { | 
| 3661 | 0 |  |  |  |  | 0 | return $dbdefenvr{$vdn}; | 
| 3662 |  |  |  |  |  |  | } | 
| 3663 |  |  |  |  |  |  |  | 
| 3664 | 0 |  |  |  |  | 0 | return ''; | 
| 3665 |  |  |  |  |  |  | } | 
| 3666 |  |  |  |  |  |  |  | 
| 3667 |  |  |  |  |  |  | sub db_bindcols { | 
| 3668 |  |  |  |  |  |  | =begin wiki | 
| 3669 |  |  |  |  |  |  |  | 
| 3670 |  |  |  |  |  |  | !3 db_bindcols | 
| 3671 |  |  |  |  |  |  |  | 
| 3672 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3673 |  |  |  |  |  |  |  | 
| 3674 |  |  |  |  |  |  | Please write this documentation. | 
| 3675 |  |  |  |  |  |  |  | 
| 3676 |  |  |  |  |  |  | Returns: | 
| 3677 |  |  |  |  |  |  |  | 
| 3678 |  |  |  |  |  |  | =cut | 
| 3679 |  |  |  |  |  |  | # | 
| 3680 |  |  |  |  |  |  | # interface: | 
| 3681 |  |  |  |  |  |  | #   interface to sth->bind_columns() | 
| 3682 |  |  |  |  |  |  | # | 
| 3683 |  |  |  |  |  |  | # accepts: | 
| 3684 |  |  |  |  |  |  | #   1st position | 
| 3685 |  |  |  |  |  |  | #     a raw statement handle | 
| 3686 |  |  |  |  |  |  | #     a vdn which is used to obtain a default statment handle (one per vdn) | 
| 3687 |  |  |  |  |  |  | #     a vdn, named statement handle pair in the form vdn||nsth | 
| 3688 |  |  |  |  |  |  | #   remaining | 
| 3689 |  |  |  |  |  |  | #     any number of references to scalars | 
| 3690 |  |  |  |  |  |  | # | 
| 3691 |  |  |  |  |  |  | # returns: | 
| 3692 |  |  |  |  |  |  | #   0 = success | 
| 3693 |  |  |  |  |  |  | #   errors handled internally | 
| 3694 |  |  |  |  |  |  | # | 
| 3695 | 0 |  |  | 0 | 0 | 0 | my ($vdn,@colrefs) = @_; | 
| 3696 | 0 |  |  |  |  | 0 | my $sth; | 
| 3697 | 0 | 0 |  |  |  | 0 | if ( ref $vdn ) { | 
| 3698 | 0 |  |  |  |  | 0 | $sth = $vdn;  ## received a raw sth | 
| 3699 |  |  |  |  |  |  | } else { | 
| 3700 | 0 |  |  |  |  | 0 | my $sth_name = 'sth_default';  ## default statement handle name | 
| 3701 | 0 | 0 |  |  |  | 0 | if ( $vdn =~ m/\./x ) {  ## dot notation vdn.sthn | 
| 3702 | 0 |  |  |  |  | 0 | ($vdn, $sth_name) = split m/\./x, $vdn; | 
| 3703 |  |  |  |  |  |  | } | 
| 3704 | 0 |  |  |  |  | 0 | $sth = $dbhandles{$vdn}{$sth_name}; | 
| 3705 |  |  |  |  |  |  | } | 
| 3706 | 0 |  |  |  |  | 0 | foreach my $colref ( @colrefs ) { | 
| 3707 | 0 | 0 |  |  |  | 0 | if ( ! ref $colref ) { sys_die( "Received bad ref in db_bindcols" ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 3708 |  |  |  |  |  |  | } | 
| 3709 | 0 |  |  |  |  | 0 | $sth->bind_columns( @colrefs ); | 
| 3710 | 0 |  |  |  |  | 0 | return 0; | 
| 3711 |  |  |  |  |  |  | } | 
| 3712 |  |  |  |  |  |  |  | 
| 3713 |  |  |  |  |  |  | sub db_pef { | 
| 3714 |  |  |  |  |  |  | =begin wiki | 
| 3715 |  |  |  |  |  |  |  | 
| 3716 |  |  |  |  |  |  | !3 db_pef | 
| 3717 |  |  |  |  |  |  |  | 
| 3718 |  |  |  |  |  |  | Parameters: ( ) | 
| 3719 |  |  |  |  |  |  |  | 
| 3720 |  |  |  |  |  |  | Prepare, Execute, Fetch a scalar value | 
| 3721 |  |  |  |  |  |  |  | 
| 3722 |  |  |  |  |  |  | This function always returns the first element of the first row of the | 
| 3723 |  |  |  |  |  |  | result set. | 
| 3724 |  |  |  |  |  |  |  | 
| 3725 |  |  |  |  |  |  | Returns: | 
| 3726 |  |  |  |  |  |  |  | 
| 3727 |  |  |  |  |  |  | =cut | 
| 3728 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $sqlname, @params) = @_; | 
| 3729 |  |  |  |  |  |  |  | 
| 3730 | 0 |  |  |  |  | 0 | my $sql = sys_get_sql( $sqlname ); | 
| 3731 | 0 |  |  |  |  | 0 | db_prepare( $vdn, $sql ); | 
| 3732 | 0 |  |  |  |  | 0 | db_execute( $vdn, @params ); | 
| 3733 | 0 |  |  |  |  | 0 | my $row = db_fetchrow( $vdn ); | 
| 3734 |  |  |  |  |  |  |  | 
| 3735 | 0 |  |  |  |  | 0 | return @{$row}[0]; | 
|  | 0 |  |  |  |  | 0 |  | 
| 3736 |  |  |  |  |  |  | } | 
| 3737 |  |  |  |  |  |  |  | 
| 3738 |  |  |  |  |  |  | sub db_pef_list { | 
| 3739 |  |  |  |  |  |  | =begin wiki | 
| 3740 |  |  |  |  |  |  |  | 
| 3741 |  |  |  |  |  |  | !3 db_pef_list | 
| 3742 |  |  |  |  |  |  |  | 
| 3743 |  |  |  |  |  |  | Parameters: ( ) | 
| 3744 |  |  |  |  |  |  |  | 
| 3745 |  |  |  |  |  |  | Prepare, Execute, Fetch a result set as a list of scalars | 
| 3746 |  |  |  |  |  |  |  | 
| 3747 |  |  |  |  |  |  | This function returns a list of the first element from each row of the \ | 
| 3748 |  |  |  |  |  |  | result set. | 
| 3749 |  |  |  |  |  |  |  | 
| 3750 |  |  |  |  |  |  | Returns: | 
| 3751 |  |  |  |  |  |  |  | 
| 3752 |  |  |  |  |  |  | =cut | 
| 3753 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $sqlname, @params) = @_; | 
| 3754 | 0 |  |  |  |  | 0 | my @rsalist; | 
| 3755 |  |  |  |  |  |  |  | 
| 3756 | 0 |  |  |  |  | 0 | my $sql = sys_get_sql( $sqlname ); | 
| 3757 | 0 |  |  |  |  | 0 | db_prepare( $vdn, $sql ); | 
| 3758 | 0 |  |  |  |  | 0 | db_execute( $vdn, @params ); | 
| 3759 | 0 |  |  |  |  | 0 | while ( my $row = db_fetchrow( $vdn ) ) { | 
| 3760 | 0 |  |  |  |  | 0 | push @rsalist, @{$row}[0]; | 
|  | 0 |  |  |  |  | 0 |  | 
| 3761 |  |  |  |  |  |  | } | 
| 3762 |  |  |  |  |  |  |  | 
| 3763 | 0 |  |  |  |  | 0 | return \@rsalist;  ## return result set asa list | 
| 3764 |  |  |  |  |  |  | } | 
| 3765 |  |  |  |  |  |  |  | 
| 3766 |  |  |  |  |  |  | sub db_fetchrow { | 
| 3767 |  |  |  |  |  |  | =begin wiki | 
| 3768 |  |  |  |  |  |  |  | 
| 3769 |  |  |  |  |  |  | !3 db_fetchrow | 
| 3770 |  |  |  |  |  |  |  | 
| 3771 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3772 |  |  |  |  |  |  |  | 
| 3773 |  |  |  |  |  |  | Please write this documentation. | 
| 3774 |  |  |  |  |  |  |  | 
| 3775 |  |  |  |  |  |  | Returns: | 
| 3776 |  |  |  |  |  |  |  | 
| 3777 |  |  |  |  |  |  | =cut | 
| 3778 |  |  |  |  |  |  | # | 
| 3779 |  |  |  |  |  |  | # interface: | 
| 3780 |  |  |  |  |  |  | #   interface to sth->fetchrow_arrayref() | 
| 3781 |  |  |  |  |  |  | # | 
| 3782 |  |  |  |  |  |  | # accepts: | 
| 3783 |  |  |  |  |  |  | #   a raw statement handle | 
| 3784 |  |  |  |  |  |  | #   a vdn which is used to obtain a default statment handle (one per vdn) | 
| 3785 |  |  |  |  |  |  | #   a vdn, named statement handle pair in the form vdn||nsth | 
| 3786 |  |  |  |  |  |  | # | 
| 3787 |  |  |  |  |  |  | # note: | 
| 3788 |  |  |  |  |  |  | #   If you are going to make lots of calls to db_fetchrow for the | 
| 3789 |  |  |  |  |  |  | #   same execute cycle, you will get better performance using a raw | 
| 3790 |  |  |  |  |  |  | #   statement handle over a statement handle name | 
| 3791 |  |  |  |  |  |  | # | 
| 3792 |  |  |  |  |  |  | # returns: | 
| 3793 |  |  |  |  |  |  | #   reference to an array | 
| 3794 |  |  |  |  |  |  | # | 
| 3795 | 0 |  |  | 0 | 0 | 0 | my $vdn = shift; | 
| 3796 | 0 |  |  |  |  | 0 | my $sth; | 
| 3797 | 0 | 0 |  |  |  | 0 | if ( ref $vdn ) { | 
| 3798 | 0 |  |  |  |  | 0 | $sth = $vdn;  ## received a raw sth | 
| 3799 |  |  |  |  |  |  | } else { | 
| 3800 | 0 |  |  |  |  | 0 | my $sth_name = 'sth_default';  ## default statement handle name | 
| 3801 | 0 | 0 |  |  |  | 0 | if ( $vdn =~ m/\./x ) { | 
| 3802 | 0 |  |  |  |  | 0 | ($vdn, $sth_name) = split m/\./x, $vdn; | 
| 3803 |  |  |  |  |  |  | } | 
| 3804 | 0 |  |  |  |  | 0 | $sth = $dbhandles{$vdn}{$sth_name}; | 
| 3805 |  |  |  |  |  |  | } | 
| 3806 | 0 |  |  |  |  | 0 | return $sth->fetchrow_arrayref(); | 
| 3807 |  |  |  |  |  |  | } | 
| 3808 |  |  |  |  |  |  |  | 
| 3809 |  |  |  |  |  |  | sub db_commit { | 
| 3810 |  |  |  |  |  |  | =begin wiki | 
| 3811 |  |  |  |  |  |  |  | 
| 3812 |  |  |  |  |  |  | !3 db_commit | 
| 3813 |  |  |  |  |  |  |  | 
| 3814 |  |  |  |  |  |  | Parameters: ( virtual_database_name ) | 
| 3815 |  |  |  |  |  |  |  | 
| 3816 |  |  |  |  |  |  | Accept a virtual database name and perform a commit against the specified \ | 
| 3817 |  |  |  |  |  |  | database connection. | 
| 3818 |  |  |  |  |  |  |  | 
| 3819 |  |  |  |  |  |  | Returns: | 
| 3820 |  |  |  |  |  |  |  | 
| 3821 |  |  |  |  |  |  | =cut | 
| 3822 | 0 |  |  | 0 | 0 | 0 | my ($vdn) = shift; | 
| 3823 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('commit', $vdn); | 
| 3824 |  |  |  |  |  |  |  | 
| 3825 | 0 |  |  |  |  | 0 | $dbh->commit; | 
| 3826 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { | 
| 3827 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 3828 | 0 |  |  |  |  | 0 | return 1;   ## test harness returns from sys_die | 
| 3829 |  |  |  |  |  |  | } | 
| 3830 | 0 |  |  |  |  | 0 | return 0; | 
| 3831 |  |  |  |  |  |  | } | 
| 3832 |  |  |  |  |  |  |  | 
| 3833 |  |  |  |  |  |  | sub db_rollback { | 
| 3834 |  |  |  |  |  |  | =begin wiki | 
| 3835 |  |  |  |  |  |  |  | 
| 3836 |  |  |  |  |  |  | !3 db_rollback | 
| 3837 |  |  |  |  |  |  |  | 
| 3838 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 3839 |  |  |  |  |  |  |  | 
| 3840 |  |  |  |  |  |  | Please write this documentation. | 
| 3841 |  |  |  |  |  |  |  | 
| 3842 |  |  |  |  |  |  | Returns: | 
| 3843 |  |  |  |  |  |  |  | 
| 3844 |  |  |  |  |  |  | =cut | 
| 3845 | 0 |  |  | 0 | 0 | 0 | my ($vdn) = shift; | 
| 3846 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('rollback', $vdn); | 
| 3847 |  |  |  |  |  |  |  | 
| 3848 | 0 |  |  |  |  | 0 | $dbh->rollback; | 
| 3849 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { | 
| 3850 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 3851 | 0 |  |  |  |  | 0 | return 1;   ## test harness returns from sys_die | 
| 3852 |  |  |  |  |  |  | } | 
| 3853 | 0 |  |  |  |  | 0 | return 0; | 
| 3854 |  |  |  |  |  |  | } | 
| 3855 |  |  |  |  |  |  |  | 
| 3856 |  |  |  |  |  |  | sub db_rowcount_table { | 
| 3857 |  |  |  |  |  |  | =begin wiki | 
| 3858 |  |  |  |  |  |  |  | 
| 3859 |  |  |  |  |  |  | !3 db_rowcount_table | 
| 3860 |  |  |  |  |  |  |  | 
| 3861 |  |  |  |  |  |  | Parameters: ( vdn, table_name ) | 
| 3862 |  |  |  |  |  |  |  | 
| 3863 |  |  |  |  |  |  | Accept a virtual database name and a tablename and using the table name, \ | 
| 3864 |  |  |  |  |  |  | do a select count(*) query against that table to get the current rowcount. | 
| 3865 |  |  |  |  |  |  |  | 
| 3866 |  |  |  |  |  |  | Returns: | 
| 3867 |  |  |  |  |  |  |  | 
| 3868 |  |  |  |  |  |  | =cut | 
| 3869 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $table_name) = @_; | 
| 3870 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('rowcount_table', $vdn); | 
| 3871 |  |  |  |  |  |  |  | 
| 3872 | 0 |  |  |  |  | 0 | my $sql = "select count(*) from $table_name"; | 
| 3873 | 0 |  |  |  |  | 0 | my $count = $dbh->selectrow_array( $sql ); | 
| 3874 | 0 |  |  |  |  | 0 | return $count; | 
| 3875 |  |  |  |  |  |  | } | 
| 3876 |  |  |  |  |  |  |  | 
| 3877 |  |  |  |  |  |  | sub db_rowcount_query { | 
| 3878 |  |  |  |  |  |  | =begin wiki | 
| 3879 |  |  |  |  |  |  |  | 
| 3880 |  |  |  |  |  |  | !3 db_rowcount_query | 
| 3881 |  |  |  |  |  |  |  | 
| 3882 |  |  |  |  |  |  | Parameters: ( vdn, sql ) | 
| 3883 |  |  |  |  |  |  |  | 
| 3884 |  |  |  |  |  |  | Using a supplied query that does a select count(*), get a row count. This \ | 
| 3885 |  |  |  |  |  |  | function will accept optional params for the query. | 
| 3886 |  |  |  |  |  |  |  | 
| 3887 |  |  |  |  |  |  | Returns: | 
| 3888 |  |  |  |  |  |  |  | 
| 3889 |  |  |  |  |  |  | =cut | 
| 3890 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $sql, @params ) = @_; | 
| 3891 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('rowcount_query', $vdn); | 
| 3892 |  |  |  |  |  |  |  | 
| 3893 | 0 | 0 |  |  |  | 0 | if ( @params ) { | 
| 3894 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ) | 
| 3895 |  |  |  |  |  |  | or sys_die( $dbh->errstr ); | 
| 3896 | 0 | 0 |  |  |  | 0 | $tmp_sth->execute( @params ) | 
| 3897 |  |  |  |  |  |  | or sys_die( $sth->errstr ); | 
| 3898 | 0 |  |  |  |  | 0 | my @row = $tmp_sth->fetchrow_array(); | 
| 3899 | 0 |  |  |  |  | 0 | return $row[0]; | 
| 3900 |  |  |  |  |  |  | } else { | 
| 3901 | 0 |  |  |  |  | 0 | my $count = $dbh->selectrow_array( $sql ); | 
| 3902 | 0 |  |  |  |  | 0 | return $count; | 
| 3903 |  |  |  |  |  |  | } | 
| 3904 |  |  |  |  |  |  | } | 
| 3905 |  |  |  |  |  |  |  | 
| 3906 |  |  |  |  |  |  | sub db_sanity_check { | 
| 3907 |  |  |  |  |  |  | =begin wiki | 
| 3908 |  |  |  |  |  |  |  | 
| 3909 |  |  |  |  |  |  | !3 db_sanity_check | 
| 3910 |  |  |  |  |  |  |  | 
| 3911 |  |  |  |  |  |  | Parameters: ( vdn, query_name, notify ) | 
| 3912 |  |  |  |  |  |  |  | 
| 3913 |  |  |  |  |  |  | /vdn/        - virtual database name | 
| 3914 |  |  |  |  |  |  | /query_name/ - name of query in job conf file | 
| 3915 |  |  |  |  |  |  | /notify/     - send notification on warning | 
| 3916 |  |  |  |  |  |  |  | 
| 3917 |  |  |  |  |  |  | Verify that table contents are within acceptable range limits for a given \ | 
| 3918 |  |  |  |  |  |  | column value. | 
| 3919 |  |  |  |  |  |  |  | 
| 3920 |  |  |  |  |  |  | This function utilizes information stored in the current job conf file. The \ | 
| 3921 |  |  |  |  |  |  | query executed to perform each range limit test is passed as a parameter in \ | 
| 3922 |  |  |  |  |  |  | /query_name/. That query is executed for each test stored in the \ | 
| 3923 |  |  |  |  |  |  | "checkpoints" array in conf section "thereshold" in the job conf file. | 
| 3924 |  |  |  |  |  |  |  | 
| 3925 |  |  |  |  |  |  | A checkpoints array should be defined for each database environment. This \ | 
| 3926 |  |  |  |  |  |  | function will look for a checkpoints by database environment by combining \ | 
| 3927 |  |  |  |  |  |  | the name of the current database environment with the liter string \ | 
| 3928 |  |  |  |  |  |  | "checkpoints". If you have four database environments, you should have \ | 
| 3929 |  |  |  |  |  |  | four checkpoint entries in your job conf file. The name of the current \ | 
| 3930 |  |  |  |  |  |  | database environment is determined using the function sys_get_dataenvr(). | 
| 3931 |  |  |  |  |  |  |  | 
| 3932 |  |  |  |  |  |  | Once the range limit query and all of the checkpoint values have been \ | 
| 3933 |  |  |  |  |  |  | obtained, the parameter vdn is used to execute the range limit query. | 
| 3934 |  |  |  |  |  |  |  | 
| 3935 |  |  |  |  |  |  | Each checkpoint entry takes the form: | 
| 3936 |  |  |  |  |  |  |  | 
| 3937 |  |  |  |  |  |  | COLUMN_VALUE = count:percent_deviation | 
| 3938 |  |  |  |  |  |  |  | 
| 3939 |  |  |  |  |  |  | The range limit query will be executed for each COLUMN_VALUE entry. The \ | 
| 3940 |  |  |  |  |  |  | actual count returned will be compared to the checkpoint count, if the \ | 
| 3941 |  |  |  |  |  |  | count returned is within the percent range specified by the checkpoint \ | 
| 3942 |  |  |  |  |  |  | percent_deviation, the test will pass, otherwise the test will fail and a \ | 
| 3943 |  |  |  |  |  |  | log warning will be generated. | 
| 3944 |  |  |  |  |  |  |  | 
| 3945 |  |  |  |  |  |  | A percent_deviation of 0 (zero) represents a special case. If a \ | 
| 3946 |  |  |  |  |  |  | percent_deviation of 0 is used, this instructs db_sanity_check to accept \ | 
| 3947 |  |  |  |  |  |  | any positive value for count as a valid value. Typically, this behavior \ | 
| 3948 |  |  |  |  |  |  | would be invoked by using a column value entry of "1:0". | 
| 3949 |  |  |  |  |  |  |  | 
| 3950 |  |  |  |  |  |  | An expected value of 0 (zero) represents a special case as well. When the \ | 
| 3951 |  |  |  |  |  |  | expected value is 0, checking for that column value will be bypassed. In \ | 
| 3952 |  |  |  |  |  |  | this way you can "turn off" sanity checking for an entire database \ | 
| 3953 |  |  |  |  |  |  | environment by making all of the column value entries equal to "0:0". | 
| 3954 |  |  |  |  |  |  |  | 
| 3955 |  |  |  |  |  |  | If the /notify/ parameter is set, a notification will be sent in addition \ | 
| 3956 |  |  |  |  |  |  | to a log warning. | 
| 3957 |  |  |  |  |  |  |  | 
| 3958 |  |  |  |  |  |  | Returns: | 
| 3959 |  |  |  |  |  |  |  | 
| 3960 |  |  |  |  |  |  | =cut | 
| 3961 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $query_name, $notify) = @_; | 
| 3962 | 0 | 0 |  |  |  | 0 | $notify = 0 unless $notify; | 
| 3963 |  |  |  |  |  |  |  | 
| 3964 | 0 |  |  |  |  | 0 | my $warnings = 0; | 
| 3965 | 0 |  |  |  |  | 0 | my $lead = "Sanity check:"; | 
| 3966 | 0 |  |  |  |  | 0 | my $okay = " Ok            "; | 
| 3967 | 0 |  |  |  |  | 0 | my $outofbounds = " Out Of Bounds "; | 
| 3968 | 0 |  |  |  |  | 0 | my $disabled = " Disabled      "; | 
| 3969 |  |  |  |  |  |  |  | 
| 3970 |  |  |  |  |  |  | ## get checkpoints | 
| 3971 | 0 |  |  |  |  | 0 | my $checkpoints; | 
| 3972 | 0 |  |  |  |  | 0 | my $conf_entry = sys_get_dataenvr . '_checkpoints'; | 
| 3973 | 0 | 0 |  |  |  | 0 | if ( $conf_job{threshold}{$conf_entry} ) { | 
| 3974 | 0 |  |  |  |  | 0 | $checkpoints = $conf_job{threshold}{$conf_entry}; | 
| 3975 |  |  |  |  |  |  | } else { | 
| 3976 | 0 |  |  |  |  | 0 | log_warn( "No threshold checkpoints found in job conf for: $conf_entry" ); | 
| 3977 | 0 |  |  |  |  | 0 | return 1; | 
| 3978 |  |  |  |  |  |  | } | 
| 3979 |  |  |  |  |  |  |  | 
| 3980 |  |  |  |  |  |  | ## prepare range limit query | 
| 3981 | 0 |  |  |  |  | 0 | my $query = sys_get_sql( $query_name ); | 
| 3982 | 0 |  |  |  |  | 0 | db_prepare( $vdn, $query ); | 
| 3983 |  |  |  |  |  |  |  | 
| 3984 | 0 |  |  |  |  | 0 | log_info( "$lead Status        [Test] Expected/Actual/Threshold(%)/Threshold(#)" ); | 
| 3985 |  |  |  |  |  |  |  | 
| 3986 |  |  |  |  |  |  | ## perform checkpoint tests | 
| 3987 | 0 |  |  |  |  | 0 | foreach my $chkpt ( split "\n", $checkpoints ) { | 
| 3988 | 0 |  |  |  |  | 0 | my ($param,$rest) = split m/=/, $chkpt; | 
| 3989 | 0 |  |  |  |  | 0 | my ($exp,$range) = split m/:/, $rest; | 
| 3990 | 0 |  |  |  |  | 0 | $param = _trim($param);  ## col to check | 
| 3991 | 0 |  |  |  |  | 0 | $exp   = _trim($exp);    ## expected value | 
| 3992 | 0 |  |  |  |  | 0 | $range = _trim($range);  ## range/tolerance | 
| 3993 |  |  |  |  |  |  |  | 
| 3994 | 0 |  |  |  |  | 0 | db_execute( $vdn, $param ); | 
| 3995 | 0 |  |  |  |  | 0 | my $row = db_fetchrow( $vdn ); | 
| 3996 | 0 |  |  |  |  | 0 | my $act = @{$row}[0];                   ## actual value | 
|  | 0 |  |  |  |  | 0 |  | 
| 3997 | 0 |  |  |  |  | 0 | my $dev = int $exp * ( $range / 100 );  ## deviation as a percent | 
| 3998 |  |  |  |  |  |  |  | 
| 3999 | 0 |  |  |  |  | 0 | my $status = "[$param] $exp/$act/$range/$dev "; | 
| 4000 |  |  |  |  |  |  |  | 
| 4001 | 0 | 0 |  |  |  | 0 | if ( $exp == 0 ) {  ## checking has been disabled | 
| 4002 | 0 |  |  |  |  | 0 | log_info( $lead . $disabled . $status ); | 
| 4003 | 0 |  |  |  |  | 0 | next; | 
| 4004 |  |  |  |  |  |  | } | 
| 4005 |  |  |  |  |  |  |  | 
| 4006 | 0 | 0 |  |  |  | 0 | if ( $range == 0 ) {  ## any positive value for actual is acceptable | 
| 4007 | 0 | 0 |  |  |  | 0 | if ( $act > 0 ) { | 
| 4008 | 0 |  |  |  |  | 0 | log_info( $lead . $okay . $status ); | 
| 4009 | 0 |  |  |  |  | 0 | next; | 
| 4010 |  |  |  |  |  |  | } | 
| 4011 | 0 |  |  |  |  | 0 | $warnings++; | 
| 4012 | 0 |  |  |  |  | 0 | log_info( $lead . $outofbounds . $status ); | 
| 4013 | 0 |  |  |  |  | 0 | next; | 
| 4014 |  |  |  |  |  |  | } | 
| 4015 |  |  |  |  |  |  |  | 
| 4016 | 0 | 0 |  |  |  | 0 | if ( $act < $exp ) {  ## actual is below threshold | 
| 4017 | 0 | 0 |  |  |  | 0 | if ( $act < $exp - $dev ) { | 
| 4018 | 0 |  |  |  |  | 0 | log_info( $lead . $outofbounds . $status ); | 
| 4019 | 0 |  |  |  |  | 0 | $warnings++; | 
| 4020 | 0 |  |  |  |  | 0 | next; | 
| 4021 |  |  |  |  |  |  | } | 
| 4022 |  |  |  |  |  |  | } | 
| 4023 |  |  |  |  |  |  |  | 
| 4024 | 0 | 0 |  |  |  | 0 | if ( $act > $exp ) { ## actual is above threshold | 
| 4025 | 0 | 0 |  |  |  | 0 | if ( $act > $exp + $dev ) { | 
| 4026 | 0 |  |  |  |  | 0 | log_info( $lead . $outofbounds . $status ); | 
| 4027 | 0 |  |  |  |  | 0 | $warnings++; | 
| 4028 | 0 |  |  |  |  | 0 | next; | 
| 4029 |  |  |  |  |  |  | } | 
| 4030 |  |  |  |  |  |  | } | 
| 4031 |  |  |  |  |  |  |  | 
| 4032 | 0 |  |  |  |  | 0 | log_info( $lead . $okay . $status ); | 
| 4033 |  |  |  |  |  |  | } | 
| 4034 |  |  |  |  |  |  |  | 
| 4035 |  |  |  |  |  |  | ## send out notifications if there are warnings | 
| 4036 | 0 | 0 | 0 |  |  | 0 | if ( $warnings && $notify ) { | 
| 4037 | 0 |  |  |  |  | 0 | _log_send_notifications( "WARN", 1, "Sanity check threshold exceeded" ); | 
| 4038 |  |  |  |  |  |  | } | 
| 4039 |  |  |  |  |  |  |  | 
| 4040 | 0 |  |  |  |  | 0 | return 0; | 
| 4041 |  |  |  |  |  |  | } | 
| 4042 |  |  |  |  |  |  |  | 
| 4043 |  |  |  |  |  |  | sub db_drop_index { | 
| 4044 |  |  |  |  |  |  | =begin wiki | 
| 4045 |  |  |  |  |  |  |  | 
| 4046 |  |  |  |  |  |  | !3 db_drop_index | 
| 4047 |  |  |  |  |  |  |  | 
| 4048 |  |  |  |  |  |  | Parameters: ( vdn, index_name ) | 
| 4049 |  |  |  |  |  |  |  | 
| 4050 |  |  |  |  |  |  | Accept a virtual database name and an index name. Drop the index identified \ | 
| 4051 |  |  |  |  |  |  | by index name. If there was a database error, we check last error. If the \ | 
| 4052 |  |  |  |  |  |  | last error indicates that the index we are trying to drop did not exist, \ | 
| 4053 |  |  |  |  |  |  | then the error is ignored, otherwise the error is logged. | 
| 4054 |  |  |  |  |  |  |  | 
| 4055 |  |  |  |  |  |  | Returns: | 
| 4056 |  |  |  |  |  |  |  | 
| 4057 |  |  |  |  |  |  | =cut | 
| 4058 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $index_name) = @_; | 
| 4059 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('drop_index', $vdn); | 
| 4060 |  |  |  |  |  |  |  | 
| 4061 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("drop index $index_name") | 
| 4062 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4063 |  |  |  |  |  |  |  | 
| 4064 |  |  |  |  |  |  |  | 
| 4065 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4066 | 0 | 0 | 0 |  |  | 0 | if ( DBI->err && DBI->err != 1418 ) {   ## ORA-00942: specified index does not exist | 
| 4067 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4068 |  |  |  |  |  |  | } | 
| 4069 |  |  |  |  |  |  |  | 
| 4070 | 0 |  |  |  |  | 0 | return 0; | 
| 4071 |  |  |  |  |  |  | } | 
| 4072 |  |  |  |  |  |  |  | 
| 4073 |  |  |  |  |  |  | sub db_drop_table { | 
| 4074 |  |  |  |  |  |  | =begin wiki | 
| 4075 |  |  |  |  |  |  |  | 
| 4076 |  |  |  |  |  |  | !3 db_drop_table | 
| 4077 |  |  |  |  |  |  |  | 
| 4078 |  |  |  |  |  |  | Parameters: ( vdn, table_name ) | 
| 4079 |  |  |  |  |  |  |  | 
| 4080 |  |  |  |  |  |  | Accept a virtual database name and a table name. Drop the table identified \ | 
| 4081 |  |  |  |  |  |  | by table name. If there was a database error, we check last error. If the \ | 
| 4082 |  |  |  |  |  |  | last error indicates that the table we are trying to drop did not exist, \ | 
| 4083 |  |  |  |  |  |  | then the error is ignored, otherwise the error is logged. | 
| 4084 |  |  |  |  |  |  |  | 
| 4085 |  |  |  |  |  |  | Returns: | 
| 4086 |  |  |  |  |  |  |  | 
| 4087 |  |  |  |  |  |  | =cut | 
| 4088 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $table_name) = @_; | 
| 4089 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('drop_table', $vdn); | 
| 4090 |  |  |  |  |  |  |  | 
| 4091 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("drop table $table_name" ) | 
| 4092 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4093 |  |  |  |  |  |  |  | 
| 4094 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4095 | 0 | 0 | 0 |  |  | 0 | if ( DBI->err && DBI->err != 942 ) {   ## ORA-00942: specified table does not exist | 
| 4096 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4097 |  |  |  |  |  |  | } | 
| 4098 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4099 | 0 |  |  |  |  | 0 | return 0; | 
| 4100 |  |  |  |  |  |  | } | 
| 4101 |  |  |  |  |  |  |  | 
| 4102 |  |  |  |  |  |  | sub db_drop_procedure { | 
| 4103 |  |  |  |  |  |  | =begin wiki | 
| 4104 |  |  |  |  |  |  |  | 
| 4105 |  |  |  |  |  |  | !3 db_drop_procedure | 
| 4106 |  |  |  |  |  |  |  | 
| 4107 |  |  |  |  |  |  | Parameters: ( vdn, procedure_name ) | 
| 4108 |  |  |  |  |  |  |  | 
| 4109 |  |  |  |  |  |  | Accept a virtual database name and a procedure name. Drop the procedure \ | 
| 4110 |  |  |  |  |  |  | identified by the given name. Check the last error, if it indicates the \ | 
| 4111 |  |  |  |  |  |  | procedure did not exist, then the error is ignored, otherwise the error is \ | 
| 4112 |  |  |  |  |  |  | logged. | 
| 4113 |  |  |  |  |  |  |  | 
| 4114 |  |  |  |  |  |  | Returns: | 
| 4115 |  |  |  |  |  |  |  | 
| 4116 |  |  |  |  |  |  | =cut | 
| 4117 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $procedure_name) = @_; | 
| 4118 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('drop_procedure', $vdn); | 
| 4119 |  |  |  |  |  |  |  | 
| 4120 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("drop procedure $procedure_name") | 
| 4121 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4122 |  |  |  |  |  |  |  | 
| 4123 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4124 | 0 | 0 | 0 |  |  | 0 | if ( DBI->err && DBI->err != 4043 ) {   ## ORA-04043: object does not exist | 
| 4125 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4126 |  |  |  |  |  |  | } | 
| 4127 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4128 | 0 |  |  |  |  | 0 | return 0; | 
| 4129 |  |  |  |  |  |  | } | 
| 4130 |  |  |  |  |  |  |  | 
| 4131 |  |  |  |  |  |  | sub db_drop_function { | 
| 4132 |  |  |  |  |  |  | =begin wiki | 
| 4133 |  |  |  |  |  |  |  | 
| 4134 |  |  |  |  |  |  | !3 db_drop_function | 
| 4135 |  |  |  |  |  |  |  | 
| 4136 |  |  |  |  |  |  | Parameters: ( $vdn, $function_name ) | 
| 4137 |  |  |  |  |  |  |  | 
| 4138 |  |  |  |  |  |  | Accept a virtual database name and a function name. Drop the function \ | 
| 4139 |  |  |  |  |  |  | identified by the given name. Check the last error, if it indicates the \ | 
| 4140 |  |  |  |  |  |  | function did not exist, then the error is ignored, otherwise the error is \ | 
| 4141 |  |  |  |  |  |  | logged. | 
| 4142 |  |  |  |  |  |  |  | 
| 4143 |  |  |  |  |  |  | Returns: | 
| 4144 |  |  |  |  |  |  |  | 
| 4145 |  |  |  |  |  |  | =cut | 
| 4146 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $function_name) = @_; | 
| 4147 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('drop_function', $vdn); | 
| 4148 |  |  |  |  |  |  |  | 
| 4149 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("drop function $function_name") | 
| 4150 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4151 |  |  |  |  |  |  |  | 
| 4152 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4153 | 0 | 0 | 0 |  |  | 0 | if ( DBI->err && DBI->err != 4043 ) {   ## ORA-04043: object does not exist | 
| 4154 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4155 |  |  |  |  |  |  | } | 
| 4156 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4157 | 0 |  |  |  |  | 0 | return 0; | 
| 4158 |  |  |  |  |  |  | } | 
| 4159 |  |  |  |  |  |  |  | 
| 4160 |  |  |  |  |  |  | sub db_drop_package { | 
| 4161 |  |  |  |  |  |  | =begin wiki | 
| 4162 |  |  |  |  |  |  |  | 
| 4163 |  |  |  |  |  |  | !3 db_drop_package | 
| 4164 |  |  |  |  |  |  |  | 
| 4165 |  |  |  |  |  |  | Parameters: ( vdn, package_name ) | 
| 4166 |  |  |  |  |  |  |  | 
| 4167 |  |  |  |  |  |  | Accept a virtual database name and a package name. Drop the package \ | 
| 4168 |  |  |  |  |  |  | identified by the given name. Check the last error, if it indicates \ | 
| 4169 |  |  |  |  |  |  | that the the package we are trying to drop did not exist, then the error \ | 
| 4170 |  |  |  |  |  |  | is ignored, otherwise the error is logged. | 
| 4171 |  |  |  |  |  |  |  | 
| 4172 |  |  |  |  |  |  | Returns: | 
| 4173 |  |  |  |  |  |  |  | 
| 4174 |  |  |  |  |  |  | =cut | 
| 4175 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $package_name) = @_; | 
| 4176 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('drop_package', $vdn); | 
| 4177 |  |  |  |  |  |  |  | 
| 4178 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("drop package $package_name") | 
| 4179 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4180 |  |  |  |  |  |  |  | 
| 4181 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4182 | 0 | 0 | 0 |  |  | 0 | if ( DBI->err && DBI->err != 4043 ) {   ## ORA-04043: object does not exist | 
| 4183 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4184 |  |  |  |  |  |  | } | 
| 4185 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4186 | 0 |  |  |  |  | 0 | return 0; | 
| 4187 |  |  |  |  |  |  | } | 
| 4188 |  |  |  |  |  |  |  | 
| 4189 |  |  |  |  |  |  | sub db_rename_index { | 
| 4190 |  |  |  |  |  |  | =begin wiki | 
| 4191 |  |  |  |  |  |  |  | 
| 4192 |  |  |  |  |  |  | !3 db_rename_index | 
| 4193 |  |  |  |  |  |  |  | 
| 4194 |  |  |  |  |  |  | Parameters: ( vdn, oldndxname, newndxname ) | 
| 4195 |  |  |  |  |  |  |  | 
| 4196 |  |  |  |  |  |  | Please write the documentation. | 
| 4197 |  |  |  |  |  |  |  | 
| 4198 |  |  |  |  |  |  | Returns: | 
| 4199 |  |  |  |  |  |  |  | 
| 4200 |  |  |  |  |  |  | =cut | 
| 4201 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $oldname, $newname) = @_; | 
| 4202 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('rename_index', $vdn); | 
| 4203 |  |  |  |  |  |  |  | 
| 4204 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("alter index $oldname rename to $newname") | 
| 4205 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4206 |  |  |  |  |  |  |  | 
| 4207 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4208 | 0 | 0 |  |  |  | 0 | if ( DBI->err ) { | 
| 4209 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4210 |  |  |  |  |  |  | } | 
| 4211 |  |  |  |  |  |  |  | 
| 4212 | 0 |  |  |  |  | 0 | return 0; | 
| 4213 |  |  |  |  |  |  | } | 
| 4214 |  |  |  |  |  |  |  | 
| 4215 |  |  |  |  |  |  | sub db_rename_table { | 
| 4216 |  |  |  |  |  |  | =begin wiki | 
| 4217 |  |  |  |  |  |  |  | 
| 4218 |  |  |  |  |  |  | !3 db_rename_table | 
| 4219 |  |  |  |  |  |  |  | 
| 4220 |  |  |  |  |  |  | Parameters: ( vdn, oldtabname, newtabname ) | 
| 4221 |  |  |  |  |  |  |  | 
| 4222 |  |  |  |  |  |  | Please write this documentation. | 
| 4223 |  |  |  |  |  |  |  | 
| 4224 |  |  |  |  |  |  | Returns: | 
| 4225 |  |  |  |  |  |  |  | 
| 4226 |  |  |  |  |  |  | =cut | 
| 4227 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $oldname, $newname) = @_; | 
| 4228 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('rename_table', $vdn); | 
| 4229 |  |  |  |  |  |  |  | 
| 4230 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("alter table $oldname rename to $newname" ) | 
| 4231 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4232 |  |  |  |  |  |  |  | 
| 4233 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4234 | 0 | 0 |  |  |  | 0 | if ( DBI->err ) { | 
| 4235 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4236 |  |  |  |  |  |  | } | 
| 4237 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4238 | 0 |  |  |  |  | 0 | return 0; | 
| 4239 |  |  |  |  |  |  | } | 
| 4240 |  |  |  |  |  |  |  | 
| 4241 |  |  |  |  |  |  | sub db_purge_table { | 
| 4242 |  |  |  |  |  |  | =begin wiki | 
| 4243 |  |  |  |  |  |  |  | 
| 4244 |  |  |  |  |  |  | !3 db_purge_table | 
| 4245 |  |  |  |  |  |  |  | 
| 4246 |  |  |  |  |  |  | Parameters: ( vdn, table_name ) | 
| 4247 |  |  |  |  |  |  |  | 
| 4248 |  |  |  |  |  |  | Please write this documentations. | 
| 4249 |  |  |  |  |  |  |  | 
| 4250 |  |  |  |  |  |  | Returns: | 
| 4251 |  |  |  |  |  |  |  | 
| 4252 |  |  |  |  |  |  | =cut | 
| 4253 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $table_name) = @_; | 
| 4254 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('purge_table', $vdn); | 
| 4255 |  |  |  |  |  |  |  | 
| 4256 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("purge table $table_name" ) | 
| 4257 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4258 |  |  |  |  |  |  |  | 
| 4259 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4260 | 0 | 0 | 0 |  |  | 0 | if ( DBI->err && DBI->err != 38307 ) {   ## ORA-38307: object not in recycle bin | 
| 4261 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4262 |  |  |  |  |  |  | } | 
| 4263 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4264 | 0 |  |  |  |  | 0 | return 0; | 
| 4265 |  |  |  |  |  |  | } | 
| 4266 |  |  |  |  |  |  |  | 
| 4267 |  |  |  |  |  |  | sub db_purge_index { | 
| 4268 |  |  |  |  |  |  | =begin wiki | 
| 4269 |  |  |  |  |  |  |  | 
| 4270 |  |  |  |  |  |  | !3 db_purge_index | 
| 4271 |  |  |  |  |  |  |  | 
| 4272 |  |  |  |  |  |  | Parameters: ( vdn, index_name ) | 
| 4273 |  |  |  |  |  |  |  | 
| 4274 |  |  |  |  |  |  | Please write this documentation. | 
| 4275 |  |  |  |  |  |  |  | 
| 4276 |  |  |  |  |  |  | Returns: | 
| 4277 |  |  |  |  |  |  |  | 
| 4278 |  |  |  |  |  |  | =cut | 
| 4279 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $table_name) = @_; | 
| 4280 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('purge_index', $vdn); | 
| 4281 |  |  |  |  |  |  |  | 
| 4282 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare("purge index $table_name") | 
| 4283 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4284 |  |  |  |  |  |  |  | 
| 4285 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4286 | 0 | 0 | 0 |  |  | 0 | if ( DBI->err && DBI->err != 38307 ) {   ## ORA-38307: object not in recycle bin | 
| 4287 | 0 |  |  |  |  | 0 | sys_die( DBI->errstr ); | 
| 4288 |  |  |  |  |  |  | } | 
| 4289 |  |  |  |  |  |  |  | 
| 4290 | 0 |  |  |  |  | 0 | return 0; | 
| 4291 |  |  |  |  |  |  | } | 
| 4292 |  |  |  |  |  |  |  | 
| 4293 |  |  |  |  |  |  | sub db_grant { | 
| 4294 |  |  |  |  |  |  | =begin wiki | 
| 4295 |  |  |  |  |  |  |  | 
| 4296 |  |  |  |  |  |  | !3 db_grant | 
| 4297 |  |  |  |  |  |  |  | 
| 4298 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 4299 |  |  |  |  |  |  |  | 
| 4300 |  |  |  |  |  |  | Please write this documentation. | 
| 4301 |  |  |  |  |  |  |  | 
| 4302 |  |  |  |  |  |  | Returns: | 
| 4303 |  |  |  |  |  |  |  | 
| 4304 |  |  |  |  |  |  | =cut | 
| 4305 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $priv, $objname, $ag) = @_; | 
| 4306 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('grant', $vdn); | 
| 4307 |  |  |  |  |  |  |  | 
| 4308 | 0 | 0 |  |  |  | 0 | unless ( $priv =~ m/^r$|^u$/x ) { | 
| 4309 | 0 |  |  |  |  | 0 | log_warn( "Privilege to db_grant must be either 'r' or 'u'" ); | 
| 4310 | 0 |  |  |  |  | 0 | return 1; | 
| 4311 |  |  |  |  |  |  | } | 
| 4312 | 0 |  |  |  |  | 0 | my $sql; | 
| 4313 | 0 | 0 |  |  |  | 0 | if ( $priv eq 'r' ) { | 
| 4314 | 0 |  |  |  |  | 0 | $sql = qq{begin execute immediate 'grant select on $objname to $ag'; end;}; | 
| 4315 |  |  |  |  |  |  | } | 
| 4316 | 0 | 0 |  |  |  | 0 | if ( $priv eq 'u' ) { | 
| 4317 | 0 |  |  |  |  | 0 | $sql = qq{begin execute immediate 'grant update, insert, delete on $objname to $ag'; end;}; | 
| 4318 |  |  |  |  |  |  | } | 
| 4319 |  |  |  |  |  |  |  | 
| 4320 | 0 | 0 |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ) | 
| 4321 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4322 | 0 | 0 |  |  |  | 0 | $tmp_sth->execute | 
| 4323 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4324 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4325 | 0 |  |  |  |  | 0 | return 0; | 
| 4326 |  |  |  |  |  |  | } | 
| 4327 |  |  |  |  |  |  |  | 
| 4328 |  |  |  |  |  |  | sub db_update_statistics { | 
| 4329 |  |  |  |  |  |  | =begin wiki | 
| 4330 |  |  |  |  |  |  |  | 
| 4331 |  |  |  |  |  |  | !3 db_update_statistics | 
| 4332 |  |  |  |  |  |  |  | 
| 4333 |  |  |  |  |  |  | Parameters: ( vdn, table_name ) | 
| 4334 |  |  |  |  |  |  |  | 
| 4335 |  |  |  |  |  |  | Please write this documentation. | 
| 4336 |  |  |  |  |  |  |  | 
| 4337 |  |  |  |  |  |  | Returns: | 
| 4338 |  |  |  |  |  |  |  | 
| 4339 |  |  |  |  |  |  | =cut | 
| 4340 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $table_name) = @_; | 
| 4341 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('update_statistics', $vdn); | 
| 4342 |  |  |  |  |  |  |  | 
| 4343 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 4344 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_update_statistics', 0 ); | 
| 4345 |  |  |  |  |  |  | } | 
| 4346 |  |  |  |  |  |  |  | 
| 4347 | 0 |  |  |  |  | 0 | my $sql = "BEGIN dbms_stats.gather_table_stats('','" | 
| 4348 |  |  |  |  |  |  | . "$table_name',NULL,NULL,FALSE,'FOR ALL COLUMNS SIZE 1'" | 
| 4349 |  |  |  |  |  |  | . ",NULL,'DEFAULT',TRUE); END;"; | 
| 4350 |  |  |  |  |  |  |  | 
| 4351 | 0 |  |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ); | 
| 4352 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4353 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4354 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4355 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4356 | 0 |  |  |  |  | 0 | return 0; | 
| 4357 |  |  |  |  |  |  | } | 
| 4358 |  |  |  |  |  |  |  | 
| 4359 |  |  |  |  |  |  | sub db_insert_from_file { | 
| 4360 |  |  |  |  |  |  | =begin wiki | 
| 4361 |  |  |  |  |  |  |  | 
| 4362 |  |  |  |  |  |  | !3 db_insert_from_file | 
| 4363 |  |  |  |  |  |  |  | 
| 4364 |  |  |  |  |  |  | Parameters: ( vdn, file_name, delim ) | 
| 4365 |  |  |  |  |  |  |  | 
| 4366 |  |  |  |  |  |  | * /vdn/       - Virtual Database Name | 
| 4367 |  |  |  |  |  |  | * /file_name/ - File containing data to read | 
| 4368 |  |  |  |  |  |  | * /delim/     - Field delimiter (can be a regex) | 
| 4369 |  |  |  |  |  |  |  | 
| 4370 |  |  |  |  |  |  | Accept a virtual database name, file name, and field delimiter. Insert records \ | 
| 4371 |  |  |  |  |  |  | from specified file into the database table using the statement handle tied \ | 
| 4372 |  |  |  |  |  |  | to the virtual database name. The file name should include full path \ | 
| 4373 |  |  |  |  |  |  | information. | 
| 4374 |  |  |  |  |  |  |  | 
| 4375 |  |  |  |  |  |  | It is desireable to call db_init before using this function. There are several \ | 
| 4376 |  |  |  |  |  |  | advanced options implemented by this function that can be configured by call \ | 
| 4377 |  |  |  |  |  |  | db_init first. | 
| 4378 |  |  |  |  |  |  |  | 
| 4379 |  |  |  |  |  |  | By default the field delimiter is not interpreted as a Regular Expression, \ | 
| 4380 |  |  |  |  |  |  | however by calling db_init first, you can make this function treat your \ | 
| 4381 |  |  |  |  |  |  | delimiter as a regex, in that case the delimiter can be more than one \ | 
| 4382 |  |  |  |  |  |  | character in length. | 
| 4383 |  |  |  |  |  |  |  | 
| 4384 |  |  |  |  |  |  | SQL used by this function should be prepared before calling this function. | 
| 4385 |  |  |  |  |  |  |  | 
| 4386 |  |  |  |  |  |  | Returns: | 
| 4387 |  |  |  |  |  |  |  | 
| 4388 |  |  |  |  |  |  | =cut | 
| 4389 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $file_name, $delim) = @_; | 
| 4390 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('insert_from_file', $vdn); | 
| 4391 |  |  |  |  |  |  |  | 
| 4392 | 0 |  |  |  |  | 0 | my $id = 'db_insert_from_file'; | 
| 4393 | 0 |  |  |  |  | 0 | my $TrimLead       = _is_yes($db_func_params{$id}{'TrimLead'}); | 
| 4394 | 0 |  |  |  |  | 0 | my $TrimFieldLead  = _is_yes($db_func_params{$id}{'TrimFieldLead'}); | 
| 4395 | 0 |  |  |  |  | 0 | my $TrimFieldTrail = _is_yes($db_func_params{$id}{'TrimFieldTrail'}); | 
| 4396 | 0 |  |  |  |  | 0 | my $SkipComments   = _is_yes($db_func_params{$id}{'SkipComments'}); | 
| 4397 | 0 |  |  |  |  | 0 | my $SkipLastField  = _is_yes($db_func_params{$id}{'SkipLastField'}); | 
| 4398 | 0 |  |  |  |  | 0 | my $UseRegex       = _is_yes($db_func_params{$id}{'UseRegex'}); | 
| 4399 | 0 |  |  |  |  | 0 | my $CommentChar    = $db_func_params{$id}{'CommentChar'}; | 
| 4400 |  |  |  |  |  |  |  | 
| 4401 | 0 |  |  |  |  | 0 | my ($count, @row); | 
| 4402 | 0 | 0 |  |  |  | 0 | open my $fh, "<", $file_name or sys_die( "Error opening $file_name" ); | 
| 4403 |  |  |  |  |  |  |  | 
| 4404 | 0 |  |  |  |  | 0 | my $regex = "\Q$delim\E";  # escape regex meta chars | 
| 4405 | 0 | 0 |  |  |  | 0 | if ( $UseRegex ) { | 
| 4406 | 0 |  |  |  |  | 0 | $regex = $delim;  # do escaping meta chars | 
| 4407 |  |  |  |  |  |  | } | 
| 4408 |  |  |  |  |  |  |  | 
| 4409 | 0 |  |  |  |  | 0 | while ( <$fh> ) { | 
| 4410 | 0 |  |  |  |  | 0 | my $line = $_; | 
| 4411 | 0 |  |  |  |  | 0 | chomp $line; | 
| 4412 | 0 | 0 |  |  |  | 0 | if ( $TrimLead ) { | 
| 4413 | 0 |  |  |  |  | 0 | $line = _trim_lead($line); | 
| 4414 |  |  |  |  |  |  | } | 
| 4415 | 0 | 0 |  |  |  | 0 | if ( $SkipComments ) { | 
| 4416 | 0 | 0 |  |  |  | 0 | if ( substr($line,0,1) eq $CommentChar ) { next; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4417 |  |  |  |  |  |  | } | 
| 4418 |  |  |  |  |  |  |  | 
| 4419 | 0 |  |  |  |  | 0 | @row = split($regex,$line,-1);  # -1 preserves trailing null fields | 
| 4420 |  |  |  |  |  |  |  | 
| 4421 | 0 | 0 |  |  |  | 0 | if ( $SkipLastField ){ | 
| 4422 | 0 |  |  |  |  | 0 | pop @row; | 
| 4423 |  |  |  |  |  |  | } | 
| 4424 | 0 | 0 |  |  |  | 0 | if ( $TrimFieldLead ) { | 
| 4425 | 0 |  |  |  |  | 0 | for (my $i=0;$i<@row;$i++) { | 
| 4426 | 0 |  |  |  |  | 0 | $row[$i]=_trim_lead($row[$i]); | 
| 4427 |  |  |  |  |  |  | } | 
| 4428 |  |  |  |  |  |  | } | 
| 4429 | 0 | 0 |  |  |  | 0 | if ( $TrimFieldTrail ) { | 
| 4430 | 0 |  |  |  |  | 0 | for (my $i=0;$i<@row;$i++) { | 
| 4431 | 0 |  |  |  |  | 0 | $row[$i]=_trim_trail($row[$i]); | 
| 4432 |  |  |  |  |  |  | } | 
| 4433 |  |  |  |  |  |  | } | 
| 4434 |  |  |  |  |  |  |  | 
| 4435 | 0 |  |  |  |  | 0 | $sth->execute( @row ); | 
| 4436 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { | 
| 4437 | 0 |  |  |  |  | 0 | print DBI->errstr; | 
| 4438 | 0 |  |  |  |  | 0 | log_warn( DBI->errstr ); | 
| 4439 | 0 |  |  |  |  | 0 | my $errrec = 'RECORD: ' . join "~", @row; | 
| 4440 | 0 |  |  |  |  | 0 | log_warn( $errrec ); | 
| 4441 | 0 |  |  |  |  | 0 | sys_die( 'Aborting' ); | 
| 4442 |  |  |  |  |  |  | } | 
| 4443 | 0 |  |  |  |  | 0 | $count++; | 
| 4444 |  |  |  |  |  |  | } | 
| 4445 |  |  |  |  |  |  |  | 
| 4446 | 0 |  |  |  |  | 0 | db_commit( $vdn ); | 
| 4447 | 0 | 0 |  |  |  | 0 | close $fh or sys_die( "Error closing $file_name" ); | 
| 4448 |  |  |  |  |  |  |  | 
| 4449 | 0 |  |  |  |  | 0 | return $count; | 
| 4450 |  |  |  |  |  |  | } | 
| 4451 |  |  |  |  |  |  |  | 
| 4452 |  |  |  |  |  |  | sub db_insert_from_query { | 
| 4453 |  |  |  |  |  |  | =begin wiki | 
| 4454 |  |  |  |  |  |  |  | 
| 4455 |  |  |  |  |  |  | !3 db_insert_from_query | 
| 4456 |  |  |  |  |  |  |  | 
| 4457 |  |  |  |  |  |  | Parameters: ( source_vdn, target_vdn ) | 
| 4458 |  |  |  |  |  |  |  | 
| 4459 |  |  |  |  |  |  | Accept a virtual database name for a source and target databases and insert \ | 
| 4460 |  |  |  |  |  |  | rows into the target database from the source database. | 
| 4461 |  |  |  |  |  |  |  | 
| 4462 |  |  |  |  |  |  | Note: This needs to be rewritten to use fetchrow_arrayref() instead for \ | 
| 4463 |  |  |  |  |  |  | better performance. | 
| 4464 |  |  |  |  |  |  |  | 
| 4465 |  |  |  |  |  |  | Returns: | 
| 4466 |  |  |  |  |  |  |  | 
| 4467 |  |  |  |  |  |  | =cut | 
| 4468 | 0 |  |  | 0 | 0 | 0 | my ($src_vdn, $des_vdn, $plugin) = @_; | 
| 4469 | 0 | 0 |  |  |  | 0 | $plugin = 0 unless $plugin; | 
| 4470 |  |  |  |  |  |  |  | 
| 4471 |  |  |  |  |  |  | ## set up array of plugins | 
| 4472 | 0 |  |  |  |  | 0 | my @plugins; | 
| 4473 | 0 | 0 |  |  |  | 0 | if ( ref $plugin eq 'ARRAY' ) { | 
| 4474 | 0 |  |  |  |  | 0 | @plugins = map { $_ } @{$plugin};  ## copy plugin list to plugin array | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 4475 |  |  |  |  |  |  | } else { | 
| 4476 | 0 |  |  |  |  | 0 | push @plugins, $plugin;  ## copy single plugin entry to plugin array | 
| 4477 |  |  |  |  |  |  | } | 
| 4478 |  |  |  |  |  |  |  | 
| 4479 | 0 |  |  |  |  | 0 | my ($src_dbh, $src_sth) = _db_vdn('insert_from_query', $src_vdn); | 
| 4480 | 0 |  |  |  |  | 0 | my ($des_dbh, $des_sth) = _db_vdn('insert_from_query', $des_vdn); | 
| 4481 |  |  |  |  |  |  |  | 
| 4482 | 0 |  |  |  |  | 0 | my $count = 0; | 
| 4483 | 0 |  |  |  |  | 0 | while ( my $row = $src_sth->fetchrow_arrayref() ) {   ## fetch insert loop | 
| 4484 | 0 |  |  |  |  | 0 | my @tmprow = @{$row}; | 
|  | 0 |  |  |  |  | 0 |  | 
| 4485 |  |  |  |  |  |  |  | 
| 4486 | 0 |  |  |  |  | 0 | my $plugin_result = 0; | 
| 4487 | 0 |  |  |  |  | 0 | foreach my $plugin ( @plugins ) {  ## call each plugin | 
| 4488 | 0 | 0 |  |  |  | 0 | my $result = $plugin->( \@tmprow ) if $plugin; | 
| 4489 | 0 | 0 |  |  |  | 0 | if ( $result > 1000 ) { $plugin_result = 1; }  ## plugin bad return | 
|  | 0 |  |  |  |  | 0 |  | 
| 4490 |  |  |  |  |  |  | } | 
| 4491 | 0 | 0 |  |  |  | 0 | next if $plugin_result;  ## if any plugin complains, skip the record | 
| 4492 |  |  |  |  |  |  |  | 
| 4493 | 0 |  |  |  |  | 0 | $des_sth->execute( @tmprow ); | 
| 4494 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { | 
| 4495 | 0 |  |  |  |  | 0 | log_warn( DBI->errstr ); | 
| 4496 | 0 |  |  |  |  | 0 | my $errrec = 'RECORD: ' . join "~", @{$row}; | 
|  | 0 |  |  |  |  | 0 |  | 
| 4497 | 0 |  |  |  |  | 0 | log_warn( $errrec ); | 
| 4498 | 0 |  |  |  |  | 0 | sys_die( 'Aborting' ); | 
| 4499 |  |  |  |  |  |  | } | 
| 4500 | 0 |  |  |  |  | 0 | $count++; | 
| 4501 |  |  |  |  |  |  | } | 
| 4502 | 0 |  |  |  |  | 0 | return $count; | 
| 4503 |  |  |  |  |  |  | } | 
| 4504 |  |  |  |  |  |  |  | 
| 4505 |  |  |  |  |  |  | sub db_query_to_file { | 
| 4506 |  |  |  |  |  |  | =begin wiki | 
| 4507 |  |  |  |  |  |  |  | 
| 4508 |  |  |  |  |  |  | !3 db_query_to_file | 
| 4509 |  |  |  |  |  |  |  | 
| 4510 |  |  |  |  |  |  | Parameters: ( vdn, file_name, delim ) | 
| 4511 |  |  |  |  |  |  |  | 
| 4512 |  |  |  |  |  |  | Accept a virtual database name and a file name and write the result set to \ | 
| 4513 |  |  |  |  |  |  | the requested file. This function should be passed a file name that includes \ | 
| 4514 |  |  |  |  |  |  | full path information. The specified delimiter is used as a field separator \ | 
| 4515 |  |  |  |  |  |  | when writing the result set to the file. | 
| 4516 |  |  |  |  |  |  |  | 
| 4517 |  |  |  |  |  |  | Plugins | 
| 4518 |  |  |  |  |  |  |  | 
| 4519 |  |  |  |  |  |  | Plugins can be called for each row returned in the record set. Plugins can \ | 
| 4520 |  |  |  |  |  |  | return a value, any value returned that is greater than 1000 will cause the \ | 
| 4521 |  |  |  |  |  |  | current record to be skiped rather than written to the output file. | 
| 4522 |  |  |  |  |  |  |  | 
| 4523 |  |  |  |  |  |  | Returns: | 
| 4524 |  |  |  |  |  |  |  | 
| 4525 |  |  |  |  |  |  | =cut | 
| 4526 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $file_name, $delim, $append, $plugin, $protect) = @_; | 
| 4527 | 0 | 0 |  |  |  | 0 | $delim = '~' unless $delim; | 
| 4528 | 0 | 0 |  |  |  | 0 | $append  = 0 unless $append; | 
| 4529 | 0 | 0 |  |  |  | 0 | $plugin  = 0 unless $plugin;   ## unblessed ref to a plugin or ref to array | 
| 4530 | 0 | 0 |  |  |  | 0 | $protect = 0 unless $protect;  ## ref to array of cols to protect | 
| 4531 |  |  |  |  |  |  |  | 
| 4532 |  |  |  |  |  |  | ## set up array of plugins | 
| 4533 | 0 |  |  |  |  | 0 | my @plugins; | 
| 4534 | 0 | 0 |  |  |  | 0 | if ( ref $plugin eq 'ARRAY' ) { | 
| 4535 | 0 |  |  |  |  | 0 | @plugins = map { $_ } @{$plugin};  ## copy plugin list to plugin array | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 4536 |  |  |  |  |  |  | } else { | 
| 4537 | 0 |  |  |  |  | 0 | push @plugins, $plugin;  ## copy single plugin entry to plugin array | 
| 4538 |  |  |  |  |  |  | } | 
| 4539 |  |  |  |  |  |  |  | 
| 4540 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('query_to_file', $vdn); | 
| 4541 |  |  |  |  |  |  |  | 
| 4542 | 0 |  |  |  |  | 0 | my $mode; | 
| 4543 | 0 | 0 |  |  |  | 0 | if ( $append ) { | 
| 4544 | 0 |  |  |  |  | 0 | $mode = '>>'; | 
| 4545 |  |  |  |  |  |  | } else { | 
| 4546 | 0 |  |  |  |  | 0 | $mode = '>'; | 
| 4547 |  |  |  |  |  |  | } | 
| 4548 |  |  |  |  |  |  |  | 
| 4549 | 0 |  |  |  |  | 0 | my $count = 0; | 
| 4550 | 0 | 0 |  |  |  | 0 | open my $fh, $mode, $file_name or sys_die( "Error opening $file_name" ); | 
| 4551 | 0 |  |  |  |  | 0 | while ( my $row = $sth->fetchrow_arrayref() ) { | 
| 4552 | 0 |  |  |  |  | 0 | my @outrow = @{$row}; | 
|  | 0 |  |  |  |  | 0 |  | 
| 4553 |  |  |  |  |  |  |  | 
| 4554 | 0 |  |  |  |  | 0 | my $plugin_result = 0; | 
| 4555 | 0 |  |  |  |  | 0 | foreach my $plugin ( @plugins ) {  ## call each plugin in turn | 
| 4556 | 0 | 0 |  |  |  | 0 | my $result = $plugin->( \@outrow ) if $plugin; | 
| 4557 | 0 | 0 |  |  |  | 0 | if ( $result > 1000 ) { $plugin_result = 1; }  ## bypass this record | 
|  | 0 |  |  |  |  | 0 |  | 
| 4558 |  |  |  |  |  |  | } | 
| 4559 | 0 | 0 |  |  |  | 0 | next if $plugin_result; | 
| 4560 |  |  |  |  |  |  |  | 
| 4561 | 0 | 0 |  |  |  | 0 | _db_query_to_file_protect( \@outrow, $protect ) if $protect; | 
| 4562 | 0 |  |  |  |  | 0 | print {$fh} join $delim, @outrow; | 
|  | 0 |  |  |  |  | 0 |  | 
| 4563 | 0 |  |  |  |  | 0 | print {$fh} "\n"; | 
|  | 0 |  |  |  |  | 0 |  | 
| 4564 | 0 |  |  |  |  | 0 | $count++; | 
| 4565 |  |  |  |  |  |  | } | 
| 4566 | 0 | 0 |  |  |  | 0 | close $fh or sys_die( "Error closing $file_name" ); | 
| 4567 |  |  |  |  |  |  |  | 
| 4568 | 0 |  |  |  |  | 0 | return $count; | 
| 4569 |  |  |  |  |  |  | } | 
| 4570 |  |  |  |  |  |  |  | 
| 4571 |  |  |  |  |  |  | sub db_dump_query { | 
| 4572 |  |  |  |  |  |  | =begin wiki | 
| 4573 |  |  |  |  |  |  |  | 
| 4574 |  |  |  |  |  |  | !3 db_dump_query | 
| 4575 |  |  |  |  |  |  |  | 
| 4576 |  |  |  |  |  |  | Parameters: ( vdn, columns ) | 
| 4577 |  |  |  |  |  |  |  | 
| 4578 |  |  |  |  |  |  | Accept a virtual database name and a list of column names, dump the \ | 
| 4579 |  |  |  |  |  |  | query showing column names and field values. | 
| 4580 |  |  |  |  |  |  |  | 
| 4581 |  |  |  |  |  |  | Returns: | 
| 4582 |  |  |  |  |  |  |  | 
| 4583 |  |  |  |  |  |  | =cut | 
| 4584 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $cols) = @_; | 
| 4585 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('dump_query', $vdn); | 
| 4586 |  |  |  |  |  |  |  | 
| 4587 | 0 |  |  |  |  | 0 | while ( my @row = $sth->fetchrow_array() ) { | 
| 4588 | 0 |  |  |  |  | 0 | print "RECORD:\n"; | 
| 4589 | 0 |  |  |  |  | 0 | for my $i ( 0 .. $#row ) { | 
| 4590 | 0 |  |  |  |  | 0 | print "\t", $cols->[$i], '=', _db_null( $row[$i] ), "\n"; | 
| 4591 |  |  |  |  |  |  | } | 
| 4592 |  |  |  |  |  |  | } | 
| 4593 |  |  |  |  |  |  |  | 
| 4594 | 0 |  |  |  |  | 0 | return 0; | 
| 4595 |  |  |  |  |  |  | } | 
| 4596 |  |  |  |  |  |  |  | 
| 4597 |  |  |  |  |  |  | sub db_dump_table { | 
| 4598 |  |  |  |  |  |  | =begin wiki | 
| 4599 |  |  |  |  |  |  |  | 
| 4600 |  |  |  |  |  |  | !3 db_dump_table | 
| 4601 |  |  |  |  |  |  |  | 
| 4602 |  |  |  |  |  |  | Parameters: ( vdn, table_name, max_rows ) | 
| 4603 |  |  |  |  |  |  |  | 
| 4604 |  |  |  |  |  |  | Accept a virtual database name and a table name, dump the contents of the \ | 
| 4605 |  |  |  |  |  |  | requested table showing column names and field values. If optional paramater \ | 
| 4606 |  |  |  |  |  |  | max rows is provided, query output will be limited to that many rows. There \ | 
| 4607 |  |  |  |  |  |  | is an upper limit on the number of rows that this query will return, this \ | 
| 4608 |  |  |  |  |  |  | is set rather high, so in most cases you should probably supply a max rows \ | 
| 4609 |  |  |  |  |  |  | limit. | 
| 4610 |  |  |  |  |  |  |  | 
| 4611 |  |  |  |  |  |  | Returns: | 
| 4612 |  |  |  |  |  |  |  | 
| 4613 |  |  |  |  |  |  | =cut | 
| 4614 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $table_name, $max_rows) = @_; | 
| 4615 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('dump_table', $vdn); | 
| 4616 | 0 | 0 |  |  |  | 0 | $max_rows = 999_999 unless defined $max_rows; | 
| 4617 |  |  |  |  |  |  |  | 
| 4618 | 0 |  |  |  |  | 0 | $table_name = uc $table_name; | 
| 4619 | 0 |  |  |  |  | 0 | my $col_sql = "select column_name " . | 
| 4620 |  |  |  |  |  |  | "  from all_tab_columns " . | 
| 4621 |  |  |  |  |  |  | " where table_name = '$table_name'"; | 
| 4622 | 0 |  |  |  |  | 0 | my ( $tmp_sth, @cols ); | 
| 4623 |  |  |  |  |  |  |  | 
| 4624 | 0 | 0 |  |  |  | 0 | $tmp_sth = $dbh->prepare( $col_sql ) | 
| 4625 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4626 | 0 | 0 |  |  |  | 0 | $tmp_sth->execute | 
| 4627 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4628 | 0 |  |  |  |  | 0 | while ( my @row = $tmp_sth->fetchrow_array() ) { | 
| 4629 | 0 |  |  |  |  | 0 | push @cols, $row[0]; | 
| 4630 |  |  |  |  |  |  | } | 
| 4631 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4632 |  |  |  |  |  |  |  | 
| 4633 | 0 |  |  |  |  | 0 | my $columns = join ', ', @cols; | 
| 4634 | 0 |  |  |  |  | 0 | my $tab_sql = "select $columns " . | 
| 4635 |  |  |  |  |  |  | "  from $table_name"; | 
| 4636 | 0 | 0 |  |  |  | 0 | $tmp_sth = $dbh->prepare( $tab_sql ) | 
| 4637 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4638 | 0 | 0 |  |  |  | 0 | $tmp_sth->execute | 
| 4639 |  |  |  |  |  |  | or sys_die( DBI->errstr ); | 
| 4640 |  |  |  |  |  |  |  | 
| 4641 | 0 |  |  |  |  | 0 | my $row_count = 0; | 
| 4642 | 0 |  |  |  |  | 0 | while ( my @row = $tmp_sth->fetchrow_array() ) { | 
| 4643 | 0 |  |  |  |  | 0 | print "RECORD:\n"; | 
| 4644 | 0 |  |  |  |  | 0 | for my $i ( 0 .. $#row ) { | 
| 4645 | 0 |  |  |  |  | 0 | print "\t", $cols[$i], "=", _db_null( $row[$i] ), "\n"; | 
| 4646 |  |  |  |  |  |  | } | 
| 4647 | 0 | 0 |  |  |  | 0 | last if ++$row_count >= $max_rows; | 
| 4648 |  |  |  |  |  |  | } | 
| 4649 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4650 |  |  |  |  |  |  |  | 
| 4651 | 0 |  |  |  |  | 0 | return 0; | 
| 4652 |  |  |  |  |  |  | } | 
| 4653 |  |  |  |  |  |  |  | 
| 4654 |  |  |  |  |  |  | sub db_sqlloader { | 
| 4655 |  |  |  |  |  |  | =begin wiki | 
| 4656 |  |  |  |  |  |  |  | 
| 4657 |  |  |  |  |  |  | !3 db_sqlloader | 
| 4658 |  |  |  |  |  |  |  | 
| 4659 |  |  |  |  |  |  | Parameters: ( vdn, datfile, ctlname, maxerrors ) | 
| 4660 |  |  |  |  |  |  |  | 
| 4661 |  |  |  |  |  |  | * /vdn/       - Virtual Database Name | 
| 4662 |  |  |  |  |  |  | * /datfile/   - SQL*Loader data file | 
| 4663 |  |  |  |  |  |  | * /ctlname/   - Job conf key for control file input | 
| 4664 |  |  |  |  |  |  | * /maxerrors/ - Maximum number of errors allowed | 
| 4665 |  |  |  |  |  |  |  | 
| 4666 |  |  |  |  |  |  | This is a convenience function which provides a simplified method for calling \ | 
| 4667 |  |  |  |  |  |  | the various db_sqlloader functions. This will invoke SQL*Loader and handle \ | 
| 4668 |  |  |  |  |  |  | the various execution and output parsing that whould otherwise have to be \ | 
| 4669 |  |  |  |  |  |  | handled by calling the db_sqlloader functions directly (which certainly you \ | 
| 4670 |  |  |  |  |  |  | can if you prefer). | 
| 4671 |  |  |  |  |  |  |  | 
| 4672 |  |  |  |  |  |  | Execute SQL*Loader using the supplied paramaters. The Virtual Database \ | 
| 4673 |  |  |  |  |  |  | Name is used to obtain login credentials. This will launch SQL*Loader \ | 
| 4674 |  |  |  |  |  |  | and wait for it to finish, returning the SQL*Loader return code to the \ | 
| 4675 |  |  |  |  |  |  | caller. | 
| 4676 |  |  |  |  |  |  |  | 
| 4677 |  |  |  |  |  |  | Data file name must be fully qualified. Path provided by data file name \ | 
| 4678 |  |  |  |  |  |  | will be used for out, bad, and dis files. | 
| 4679 |  |  |  |  |  |  |  | 
| 4680 |  |  |  |  |  |  | Return: One of | 
| 4681 |  |  |  |  |  |  |  | 
| 4682 |  |  |  |  |  |  | * SQLLDR_SUCC | 
| 4683 |  |  |  |  |  |  | * SQLLDR_WARN | 
| 4684 |  |  |  |  |  |  | * SQLLDR_FAIL | 
| 4685 |  |  |  |  |  |  |  | 
| 4686 |  |  |  |  |  |  | =cut | 
| 4687 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $datfile, $ctlname, $maxerrors) = @_; | 
| 4688 |  |  |  |  |  |  |  | 
| 4689 | 0 |  |  |  |  | 0 | my $id = 'db_sqlloader'; | 
| 4690 | 0 |  |  |  |  | 0 | my $datfilepath = $db_func_params{$id}{DatFilePath}; | 
| 4691 | 0 |  |  |  |  | 0 | my $dbenvr = $db_func_params{$id}{DbEnvr}; | 
| 4692 | 0 |  |  |  |  | 0 | my $netservice = $db_func_params{$id}{NetService}; | 
| 4693 |  |  |  |  |  |  |  | 
| 4694 | 0 |  |  |  |  | 0 | my $datfilefull = $datfilepath . $datfile; | 
| 4695 |  |  |  |  |  |  |  | 
| 4696 | 0 |  |  |  |  | 0 | my ($sqlldr_retcd, $sqlldr_result); | 
| 4697 |  |  |  |  |  |  |  | 
| 4698 | 0 |  |  |  |  | 0 | log_info( "Executing SQLLoader" ); | 
| 4699 | 0 | 0 |  |  |  | 0 | if ( $dbenvr =~ /$netservice/ ) { | 
| 4700 | 0 |  |  |  |  | 0 | log_info( "Using netservice db connection symantics" ); | 
| 4701 | 0 |  |  |  |  | 0 | $sqlldr_retcd = db_sqlloaderx( "$vdn:$dbenvr", $datfilefull, $ctlname, $maxerrors ); | 
| 4702 |  |  |  |  |  |  | } else { | 
| 4703 | 0 |  |  |  |  | 0 | log_info( "Using local db connection symantics" ); | 
| 4704 | 0 |  |  |  |  | 0 | $sqlldr_retcd = db_sqlloaderx( $vdn, $datfilefull, $ctlname, $maxerrors ); | 
| 4705 |  |  |  |  |  |  | } | 
| 4706 |  |  |  |  |  |  |  | 
| 4707 | 0 |  |  |  |  | 0 | $sqlldr_result = db_sqlloaderx_parse_logfile( $datfilefull ); | 
| 4708 | 0 |  |  |  |  | 0 | log_info( "SQLLoader Output:", $sqlldr_result ); | 
| 4709 |  |  |  |  |  |  |  | 
| 4710 | 0 | 0 |  |  |  | 0 | if ( $sqlldr_retcd == $SQLLDR_SUCC ) { | 
| 4711 | 0 |  |  |  |  | 0 | log_info( "Load data file $datfile completed successfully" ); | 
| 4712 |  |  |  |  |  |  | } | 
| 4713 | 0 | 0 |  |  |  | 0 | if ( $sqlldr_retcd == $SQLLDR_WARN ) { | 
| 4714 | 0 |  |  |  |  | 0 | log_warn( "Load data file $datfile completed with warnings" ); | 
| 4715 |  |  |  |  |  |  | } | 
| 4716 | 0 | 0 | 0 |  |  | 0 | if ( $sqlldr_retcd == $SQLLDR_FTL || $sqlldr_retcd == $SQLLDR_FAIL ) { | 
| 4717 | 0 |  |  |  |  | 0 | $sqlldr_retcd = $SQLLDR_FAIL; | 
| 4718 | 0 |  |  |  |  | 0 | log_warn( "Load data file $datfile failed" ); | 
| 4719 |  |  |  |  |  |  | } | 
| 4720 |  |  |  |  |  |  |  | 
| 4721 | 0 |  |  |  |  | 0 | my $rej_count = db_sqlloaderx_rejected(); | 
| 4722 | 0 | 0 |  |  |  | 0 | if ( $rej_count > 0 ) { | 
| 4723 | 0 |  |  |  |  | 0 | log_warn( "SQLLoader rejected $rej_count records loading $datfile to " . sys_get_dbinst( $vdn ) ); | 
| 4724 |  |  |  |  |  |  | } | 
| 4725 |  |  |  |  |  |  |  | 
| 4726 | 0 | 0 |  |  |  | 0 | if ( $rej_count > $maxerrors ) { | 
| 4727 | 0 |  |  |  |  | 0 | log_warn( "SQLLoader failed loading $datfile to " . sys_get_dbinst( $vdn ) . " due to max rejected records" ); | 
| 4728 |  |  |  |  |  |  | } | 
| 4729 |  |  |  |  |  |  |  | 
| 4730 | 0 |  |  |  |  | 0 | return $sqlldr_retcd; | 
| 4731 |  |  |  |  |  |  | } | 
| 4732 |  |  |  |  |  |  |  | 
| 4733 |  |  |  |  |  |  | sub db_sqlloaderx { | 
| 4734 |  |  |  |  |  |  | =begin wiki | 
| 4735 |  |  |  |  |  |  |  | 
| 4736 |  |  |  |  |  |  | !3 db_sqlloaderx | 
| 4737 |  |  |  |  |  |  |  | 
| 4738 |  |  |  |  |  |  | See: db_sqlloader for Parameters and Return Values. | 
| 4739 |  |  |  |  |  |  |  | 
| 4740 |  |  |  |  |  |  | =cut | 
| 4741 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $datfile, $ctlname, $maxerrors) = @_; | 
| 4742 |  |  |  |  |  |  |  | 
| 4743 | 0 |  |  |  |  | 0 | my $defenvr = $dbdefenvr{$vdn}; | 
| 4744 | 0 |  |  |  |  | 0 | my $netservice = _db_netservice( $vdn ); | 
| 4745 | 0 |  |  |  |  | 0 | my ($db, $un, $pw) = _db_vdn('connect', $vdn); | 
| 4746 |  |  |  |  |  |  |  | 
| 4747 | 0 |  | 0 |  |  | 0 | $maxerrors = $maxerrors || 50; | 
| 4748 |  |  |  |  |  |  |  | 
| 4749 |  |  |  |  |  |  | ## validate the data file exists | 
| 4750 | 0 | 0 |  |  |  | 0 | if ( ! -e $datfile ) { sys_die( "Data file $datfile not found" ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4751 |  |  |  |  |  |  |  | 
| 4752 |  |  |  |  |  |  | ## get control file input from job conf | 
| 4753 | 0 |  |  |  |  | 0 | my $key = $ctlname; | 
| 4754 | 0 |  |  |  |  | 0 | my $section = 'sqlloader'; | 
| 4755 | 0 | 0 |  |  |  | 0 | if ( ! $conf_job{$section}{$key} ) { | 
| 4756 | 0 |  |  |  |  | 0 | $key = 'control_file:' . $key; | 
| 4757 | 0 | 0 |  |  |  | 0 | if ( ! $conf_job{$section}{$key} ) { | 
| 4758 | 0 |  |  |  |  | 0 | sys_die( "No loader definition found in [$section] for key [$ctlname]", 0 ); | 
| 4759 |  |  |  |  |  |  | } | 
| 4760 |  |  |  |  |  |  | } | 
| 4761 | 0 |  |  |  |  | 0 | my $control = $conf_job{$section}{$key}; | 
| 4762 |  |  |  |  |  |  |  | 
| 4763 | 0 |  |  |  |  | 0 | my ($base,$path,$type) = fileparse($datfile,qr{\.dat|\.txt}); | 
| 4764 | 0 |  |  |  |  | 0 | my $ctlfile = $path.$base.'.ctl'; | 
| 4765 | 0 |  |  |  |  | 0 | my $parfile = $path.$base.'.par'; | 
| 4766 | 0 |  |  |  |  | 0 | my $badfile = $path.$base.'.bad'; | 
| 4767 | 0 |  |  |  |  | 0 | my $disfile = $path.$base.'.dis'; | 
| 4768 | 0 |  |  |  |  | 0 | my $outfile = $path.$base.'.out'; | 
| 4769 |  |  |  |  |  |  |  | 
| 4770 |  |  |  |  |  |  | ## build control file | 
| 4771 | 0 |  | 0 |  |  | 0 | open my $fh, ">", $ctlfile || sys_die( 'Unable to create SQLLoader ctlfile', 0 ); | 
| 4772 | 0 |  |  |  |  | 0 | print $fh $control; | 
| 4773 | 0 |  |  |  |  | 0 | close $fh; | 
| 4774 |  |  |  |  |  |  |  | 
| 4775 |  |  |  |  |  |  | ## build params file | 
| 4776 | 0 |  | 0 |  |  | 0 | open $fh, ">", $parfile || sys_die( 'Unable to create SQLLoader parfile', 0 ); | 
| 4777 | 0 |  |  |  |  | 0 | print $fh "userid=$un/$pw$netservice\n"; | 
| 4778 | 0 |  |  |  |  | 0 | print $fh "control=$ctlfile\n"; | 
| 4779 | 0 |  |  |  |  | 0 | print $fh "silent=(all)\n"; | 
| 4780 | 0 |  |  |  |  | 0 | print $fh "data=$datfile\n"; | 
| 4781 | 0 |  |  |  |  | 0 | print $fh "log=$outfile\n"; | 
| 4782 | 0 |  |  |  |  | 0 | print $fh "bad=$badfile\n"; | 
| 4783 | 0 |  |  |  |  | 0 | print $fh "discard=$disfile\n"; | 
| 4784 | 0 |  |  |  |  | 0 | close $fh; | 
| 4785 |  |  |  |  |  |  |  | 
| 4786 | 0 |  |  |  |  | 0 | my @args = ("sqlldr", "PARFILE=$parfile errors=$maxerrors"); | 
| 4787 | 0 |  |  |  |  | 0 | system @args; | 
| 4788 | 0 |  |  |  |  | 0 | my $sqlldr_retcd = $CHILD_ERROR >> 8; | 
| 4789 |  |  |  |  |  |  |  | 
| 4790 |  |  |  |  |  |  | ## Normalize os dependent return codes. Why Oracle returns an os dependent | 
| 4791 |  |  |  |  |  |  | ## return code from a cross-platform product is a mystery to me... | 
| 4792 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq 'MSWin32' ) { | 
| 4793 | 0 | 0 |  |  |  | 0 | if ( $sqlldr_retcd == 3 ) { $sqlldr_retcd = 1; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4794 | 0 | 0 |  |  |  | 0 | if ( $sqlldr_retcd == 4 ) { $sqlldr_retcd = 3; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4795 |  |  |  |  |  |  | } | 
| 4796 |  |  |  |  |  |  |  | 
| 4797 | 0 |  |  |  |  | 0 | unlink $parfile; | 
| 4798 | 0 |  |  |  |  | 0 | unlink $ctlfile; | 
| 4799 |  |  |  |  |  |  |  | 
| 4800 | 0 |  |  |  |  | 0 | return $sqlldr_retcd; | 
| 4801 |  |  |  |  |  |  | } | 
| 4802 |  |  |  |  |  |  |  | 
| 4803 |  |  |  |  |  |  | sub db_sqlloaderx_parse_logfile { | 
| 4804 |  |  |  |  |  |  | =begin wiki | 
| 4805 |  |  |  |  |  |  |  | 
| 4806 |  |  |  |  |  |  | !3 db_sqlloaderx_parse_logfile | 
| 4807 |  |  |  |  |  |  |  | 
| 4808 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 4809 |  |  |  |  |  |  |  | 
| 4810 |  |  |  |  |  |  | Please write this documentation. | 
| 4811 |  |  |  |  |  |  |  | 
| 4812 |  |  |  |  |  |  | Returns: | 
| 4813 |  |  |  |  |  |  |  | 
| 4814 |  |  |  |  |  |  | =cut | 
| 4815 | 0 |  |  | 0 | 0 | 0 | my $datfile = shift; | 
| 4816 |  |  |  |  |  |  |  | 
| 4817 | 0 |  |  |  |  | 0 | my ($base,$path,$type) = fileparse($datfile,qr{\.dat|\.txt}); | 
| 4818 | 0 |  |  |  |  | 0 | my $outfile = $path.$base.'.out'; | 
| 4819 |  |  |  |  |  |  |  | 
| 4820 | 0 |  |  |  |  | 0 | return _db_sqlloaderx_parse_logfile( $outfile ); | 
| 4821 |  |  |  |  |  |  | } | 
| 4822 |  |  |  |  |  |  |  | 
| 4823 |  |  |  |  |  |  | sub db_sqlloaderx_skipped { | 
| 4824 |  |  |  |  |  |  | =begin wiki | 
| 4825 |  |  |  |  |  |  |  | 
| 4826 |  |  |  |  |  |  | !3 db_sqlloaderx_skipped | 
| 4827 |  |  |  |  |  |  |  | 
| 4828 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 4829 |  |  |  |  |  |  |  | 
| 4830 |  |  |  |  |  |  | Please write this documentation. | 
| 4831 |  |  |  |  |  |  |  | 
| 4832 |  |  |  |  |  |  | Returns: | 
| 4833 |  |  |  |  |  |  |  | 
| 4834 |  |  |  |  |  |  | =cut | 
| 4835 | 0 | 0 |  | 0 | 0 | 0 | if ( defined $sqlloader_results{'skipped'} ) { | 
| 4836 | 0 |  |  |  |  | 0 | return $sqlloader_results{'skipped'} | 
| 4837 |  |  |  |  |  |  | } else { | 
| 4838 | 0 |  |  |  |  | 0 | return -1; | 
| 4839 |  |  |  |  |  |  | } | 
| 4840 |  |  |  |  |  |  | } | 
| 4841 |  |  |  |  |  |  |  | 
| 4842 |  |  |  |  |  |  | sub db_sqlloaderx_read { | 
| 4843 |  |  |  |  |  |  | =begin wiki | 
| 4844 |  |  |  |  |  |  |  | 
| 4845 |  |  |  |  |  |  | !3 db_sqlloaderx_read | 
| 4846 |  |  |  |  |  |  |  | 
| 4847 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 4848 |  |  |  |  |  |  |  | 
| 4849 |  |  |  |  |  |  | Please write this documentation. | 
| 4850 |  |  |  |  |  |  |  | 
| 4851 |  |  |  |  |  |  | Returns: | 
| 4852 |  |  |  |  |  |  |  | 
| 4853 |  |  |  |  |  |  | =cut | 
| 4854 | 0 | 0 |  | 0 | 0 | 0 | if ( defined $sqlloader_results{'read'} ) { | 
| 4855 | 0 |  |  |  |  | 0 | return $sqlloader_results{'read'} | 
| 4856 |  |  |  |  |  |  | } else { | 
| 4857 | 0 |  |  |  |  | 0 | return -1; | 
| 4858 |  |  |  |  |  |  | } | 
| 4859 |  |  |  |  |  |  | } | 
| 4860 |  |  |  |  |  |  |  | 
| 4861 |  |  |  |  |  |  | sub db_sqlloaderx_rejected { | 
| 4862 |  |  |  |  |  |  | =begin wiki | 
| 4863 |  |  |  |  |  |  |  | 
| 4864 |  |  |  |  |  |  | !3 db_sqlloaderx_rejected | 
| 4865 |  |  |  |  |  |  |  | 
| 4866 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 4867 |  |  |  |  |  |  |  | 
| 4868 |  |  |  |  |  |  | Please write this documentation. | 
| 4869 |  |  |  |  |  |  |  | 
| 4870 |  |  |  |  |  |  | Returns: | 
| 4871 |  |  |  |  |  |  |  | 
| 4872 |  |  |  |  |  |  | =cut | 
| 4873 | 0 | 0 |  | 0 | 0 | 0 | if ( defined $sqlloader_results{'rejected'} ) { | 
| 4874 | 0 |  |  |  |  | 0 | return $sqlloader_results{'rejected'} | 
| 4875 |  |  |  |  |  |  | } else { | 
| 4876 | 0 |  |  |  |  | 0 | return -1; | 
| 4877 |  |  |  |  |  |  | } | 
| 4878 |  |  |  |  |  |  | } | 
| 4879 |  |  |  |  |  |  |  | 
| 4880 |  |  |  |  |  |  | sub db_sqlloaderx_discarded { | 
| 4881 |  |  |  |  |  |  | =begin wiki | 
| 4882 |  |  |  |  |  |  |  | 
| 4883 |  |  |  |  |  |  | !3 db_sqlloaderx_discarded | 
| 4884 |  |  |  |  |  |  |  | 
| 4885 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 4886 |  |  |  |  |  |  |  | 
| 4887 |  |  |  |  |  |  | Please write this documentation. | 
| 4888 |  |  |  |  |  |  |  | 
| 4889 |  |  |  |  |  |  | Returns: | 
| 4890 |  |  |  |  |  |  |  | 
| 4891 |  |  |  |  |  |  | =cut | 
| 4892 | 0 | 0 |  | 0 | 0 | 0 | if ( defined $sqlloader_results{'discarded'} ) { | 
| 4893 | 0 |  |  |  |  | 0 | return $sqlloader_results{'discarded'} | 
| 4894 |  |  |  |  |  |  | } else { | 
| 4895 | 0 |  |  |  |  | 0 | return -1; | 
| 4896 |  |  |  |  |  |  | } | 
| 4897 |  |  |  |  |  |  | } | 
| 4898 |  |  |  |  |  |  |  | 
| 4899 |  |  |  |  |  |  | sub db_sqlloaderx_elapsed_time { | 
| 4900 |  |  |  |  |  |  | =begin wiki | 
| 4901 |  |  |  |  |  |  |  | 
| 4902 |  |  |  |  |  |  | !3 db_sqlloaderx_elapsed_time | 
| 4903 |  |  |  |  |  |  |  | 
| 4904 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 4905 |  |  |  |  |  |  |  | 
| 4906 |  |  |  |  |  |  | Please write this documentation. | 
| 4907 |  |  |  |  |  |  |  | 
| 4908 |  |  |  |  |  |  | Returns: | 
| 4909 |  |  |  |  |  |  |  | 
| 4910 |  |  |  |  |  |  | =cut | 
| 4911 | 0 | 0 |  | 0 | 0 | 0 | if ( defined $sqlloader_results{'elapsed_time'} ) { | 
| 4912 | 0 |  |  |  |  | 0 | return $sqlloader_results{'elapsed_time'} | 
| 4913 |  |  |  |  |  |  | } else { | 
| 4914 | 0 |  |  |  |  | 0 | return 'error'; | 
| 4915 |  |  |  |  |  |  | } | 
| 4916 |  |  |  |  |  |  | } | 
| 4917 |  |  |  |  |  |  |  | 
| 4918 |  |  |  |  |  |  | sub db_sqlloaderx_cpu_time { | 
| 4919 |  |  |  |  |  |  | =begin wiki | 
| 4920 |  |  |  |  |  |  |  | 
| 4921 |  |  |  |  |  |  | !3 db_sqlloaderx_cpu_time | 
| 4922 |  |  |  |  |  |  |  | 
| 4923 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 4924 |  |  |  |  |  |  |  | 
| 4925 |  |  |  |  |  |  | Please write this documentation. | 
| 4926 |  |  |  |  |  |  |  | 
| 4927 |  |  |  |  |  |  | Returns: | 
| 4928 |  |  |  |  |  |  |  | 
| 4929 |  |  |  |  |  |  | =cut | 
| 4930 | 0 | 0 |  | 0 | 0 | 0 | if ( defined $sqlloader_results{'cpu_time'} ) { | 
| 4931 | 0 |  |  |  |  | 0 | return $sqlloader_results{'cpu_time'} | 
| 4932 |  |  |  |  |  |  | } else { | 
| 4933 | 0 |  |  |  |  | 0 | return 'error'; | 
| 4934 |  |  |  |  |  |  | } | 
| 4935 |  |  |  |  |  |  | } | 
| 4936 |  |  |  |  |  |  |  | 
| 4937 |  |  |  |  |  |  | sub db_func { | 
| 4938 |  |  |  |  |  |  | =begin wiki | 
| 4939 |  |  |  |  |  |  |  | 
| 4940 |  |  |  |  |  |  | !3 db_func | 
| 4941 |  |  |  |  |  |  |  | 
| 4942 |  |  |  |  |  |  | Parameters: ( ) | 
| 4943 |  |  |  |  |  |  |  | 
| 4944 |  |  |  |  |  |  | This function executes an Oracle stored procedure that takes no input \ | 
| 4945 |  |  |  |  |  |  | parameters and returns a result via RETURN. This interface is Oracle \ | 
| 4946 |  |  |  |  |  |  | specific, so a check is performed to make sure that the supplied vdn is \ | 
| 4947 |  |  |  |  |  |  | pointing to an Oracle database. If a database error is raised it is \ | 
| 4948 |  |  |  |  |  |  | trapped and reported. The existing vdn statement handle is preserved. | 
| 4949 |  |  |  |  |  |  |  | 
| 4950 |  |  |  |  |  |  | Returns: | 
| 4951 |  |  |  |  |  |  |  | 
| 4952 |  |  |  |  |  |  | =cut | 
| 4953 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $package, $proc_name) = @_; | 
| 4954 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('funcx', $vdn); | 
| 4955 |  |  |  |  |  |  |  | 
| 4956 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 4957 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_funcx' ); | 
| 4958 |  |  |  |  |  |  | } | 
| 4959 |  |  |  |  |  |  |  | 
| 4960 | 0 | 0 |  |  |  | 0 | if ( $package ) { $proc_name = $package. '.' .$proc_name; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4961 | 0 |  |  |  |  | 0 | my $sql = 'BEGIN :result := ' . $proc_name . '; END;'; | 
| 4962 |  |  |  |  |  |  |  | 
| 4963 | 0 |  |  |  |  | 0 | my $result; | 
| 4964 | 0 |  |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ); | 
| 4965 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4966 |  |  |  |  |  |  |  | 
| 4967 | 0 |  |  |  |  | 0 | $tmp_sth->bind_param_inout( ':result', \$result, 100 ); | 
| 4968 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 4969 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4970 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 4971 |  |  |  |  |  |  |  | 
| 4972 | 0 |  |  |  |  | 0 | return $result; | 
| 4973 |  |  |  |  |  |  | } | 
| 4974 |  |  |  |  |  |  |  | 
| 4975 |  |  |  |  |  |  | sub db_proc { | 
| 4976 |  |  |  |  |  |  | =begin wiki | 
| 4977 |  |  |  |  |  |  |  | 
| 4978 |  |  |  |  |  |  | !3 db_proc | 
| 4979 |  |  |  |  |  |  |  | 
| 4980 |  |  |  |  |  |  | Parameters: ( vdn, package, proc_name ) | 
| 4981 |  |  |  |  |  |  |  | 
| 4982 |  |  |  |  |  |  | This function executes an Oracle stored procedure that takes no input \ | 
| 4983 |  |  |  |  |  |  | parameters and returns no output. This interface is Oracle specific, so a \ | 
| 4984 |  |  |  |  |  |  | check is performed to make sure that the supplied vdn is pointing to an \ | 
| 4985 |  |  |  |  |  |  | Oracle database. If a database error is raised it is trapped and reported. \ | 
| 4986 |  |  |  |  |  |  | The existing vdn statement handle is preserved. | 
| 4987 |  |  |  |  |  |  |  | 
| 4988 |  |  |  |  |  |  | Returns: | 
| 4989 |  |  |  |  |  |  |  | 
| 4990 |  |  |  |  |  |  | =cut | 
| 4991 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $package, $proc_name) = @_; | 
| 4992 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('procx', $vdn); | 
| 4993 |  |  |  |  |  |  |  | 
| 4994 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 4995 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_procx' ); | 
| 4996 |  |  |  |  |  |  | } | 
| 4997 |  |  |  |  |  |  |  | 
| 4998 | 0 | 0 |  |  |  | 0 | if ( $package ) { $proc_name = $package . '.' . $proc_name; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4999 | 0 |  |  |  |  | 0 | my $sql = 'BEGIN ' . $proc_name . '; END;'; | 
| 5000 |  |  |  |  |  |  |  | 
| 5001 | 0 |  |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ); | 
| 5002 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5003 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 5004 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5005 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 5006 |  |  |  |  |  |  |  | 
| 5007 | 0 |  |  |  |  | 0 | return 0; | 
| 5008 |  |  |  |  |  |  | } | 
| 5009 |  |  |  |  |  |  |  | 
| 5010 |  |  |  |  |  |  | sub db_proc_in { | 
| 5011 |  |  |  |  |  |  | =begin wiki | 
| 5012 |  |  |  |  |  |  |  | 
| 5013 |  |  |  |  |  |  | !3 db_proc_in | 
| 5014 |  |  |  |  |  |  |  | 
| 5015 |  |  |  |  |  |  | Parameters: ( vdn, package, proc_name, parameters ) | 
| 5016 |  |  |  |  |  |  |  | 
| 5017 |  |  |  |  |  |  | This function executes an Oracle stored procedure that takes any number of \ | 
| 5018 |  |  |  |  |  |  | IN parameters and returns no output. This interface is Oracle specific, so a \ | 
| 5019 |  |  |  |  |  |  | check is performed to make sure that the supplied vdn is pointing to an \ | 
| 5020 |  |  |  |  |  |  | Oracle database. If a database error is raised it is trapped and reported. \ | 
| 5021 |  |  |  |  |  |  | The existing vdn statement handle is preserved. | 
| 5022 |  |  |  |  |  |  |  | 
| 5023 |  |  |  |  |  |  | Returns: | 
| 5024 |  |  |  |  |  |  |  | 
| 5025 |  |  |  |  |  |  | =cut | 
| 5026 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $package, $proc_name, $params) = @_; | 
| 5027 | 0 | 0 |  |  |  | 0 | unless ( ref $params eq 'ARRAY' ) { | 
| 5028 | 0 |  |  |  |  | 0 | sys_die( 'Invalid type in call to db_procx_in' ); | 
| 5029 |  |  |  |  |  |  | } | 
| 5030 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('procx_in', $vdn); | 
| 5031 |  |  |  |  |  |  |  | 
| 5032 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 5033 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_procx_in' ); | 
| 5034 |  |  |  |  |  |  | } | 
| 5035 |  |  |  |  |  |  |  | 
| 5036 | 0 |  |  |  |  | 0 | my $sql = _db_proc_build_sql( $package, $proc_name, $params ); | 
| 5037 | 0 |  |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ); | 
| 5038 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5039 |  |  |  |  |  |  |  | 
| 5040 | 0 |  |  |  |  | 0 | $tmp_sth = _db_proc_bind_inparams( $tmp_sth, $params ); | 
| 5041 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 5042 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5043 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 5044 |  |  |  |  |  |  |  | 
| 5045 | 0 |  |  |  |  | 0 | return 0; | 
| 5046 |  |  |  |  |  |  | } | 
| 5047 |  |  |  |  |  |  |  | 
| 5048 |  |  |  |  |  |  | sub db_proc_out { | 
| 5049 |  |  |  |  |  |  | =begin wiki | 
| 5050 |  |  |  |  |  |  |  | 
| 5051 |  |  |  |  |  |  | !3 db_proc_out | 
| 5052 |  |  |  |  |  |  |  | 
| 5053 |  |  |  |  |  |  | Parameters: ( vdn, package, proc_name, parameters ) | 
| 5054 |  |  |  |  |  |  |  | 
| 5055 |  |  |  |  |  |  | This function executes an Oracle stored procedure that takes no input and \ | 
| 5056 |  |  |  |  |  |  | returns any number of OUT parameters. This interface is Oracle specific, so \ | 
| 5057 |  |  |  |  |  |  | a check is performed to make sure that the supplied vdn is pointing to an \ | 
| 5058 |  |  |  |  |  |  | Oracle database. If a database error is raised it is trapped and reported. \ | 
| 5059 |  |  |  |  |  |  | The existing vdn statement handle is preserved. | 
| 5060 |  |  |  |  |  |  |  | 
| 5061 |  |  |  |  |  |  | Returns: | 
| 5062 |  |  |  |  |  |  |  | 
| 5063 |  |  |  |  |  |  | =cut | 
| 5064 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $package, $proc_name, $params) = @_; | 
| 5065 | 0 | 0 |  |  |  | 0 | unless ( ref $params eq 'ARRAY' ) { | 
| 5066 | 0 |  |  |  |  | 0 | sys_die( 'Invalid type in call to db_procx_out' ); | 
| 5067 |  |  |  |  |  |  | } | 
| 5068 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('procx_out', $vdn); | 
| 5069 |  |  |  |  |  |  |  | 
| 5070 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 5071 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_procx_out' ); | 
| 5072 |  |  |  |  |  |  | } | 
| 5073 |  |  |  |  |  |  |  | 
| 5074 | 0 |  |  |  |  | 0 | my $sql = _db_proc_build_sql( $package, $proc_name, $params ); | 
| 5075 | 0 |  |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ); | 
| 5076 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5077 |  |  |  |  |  |  |  | 
| 5078 | 0 |  |  |  |  | 0 | $tmp_sth = _db_proc_bind_outparams( $tmp_sth, $params); | 
| 5079 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 5080 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5081 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 5082 |  |  |  |  |  |  |  | 
| 5083 | 0 |  |  |  |  | 0 | return 0; | 
| 5084 |  |  |  |  |  |  | } | 
| 5085 |  |  |  |  |  |  |  | 
| 5086 |  |  |  |  |  |  | sub db_proc_inout { | 
| 5087 |  |  |  |  |  |  | =begin wiki | 
| 5088 |  |  |  |  |  |  |  | 
| 5089 |  |  |  |  |  |  | !3 db_proc_inout | 
| 5090 |  |  |  |  |  |  |  | 
| 5091 |  |  |  |  |  |  | Parameters: ( vdn, package, proc_name, parameters ) | 
| 5092 |  |  |  |  |  |  |  | 
| 5093 |  |  |  |  |  |  | This function executes an Oracle stored procedure that takes any combination \ | 
| 5094 |  |  |  |  |  |  | of IN, IN OUT, or OUT parameters. This interface is Oracle specific, so a \ | 
| 5095 |  |  |  |  |  |  | check is performed to make sure that the supplied vdn is pointing to an \ | 
| 5096 |  |  |  |  |  |  | Oracle database. If a database error is raised it is trapped and reported. \ | 
| 5097 |  |  |  |  |  |  | The existing vdn statement handle is preserved. | 
| 5098 |  |  |  |  |  |  |  | 
| 5099 |  |  |  |  |  |  | Returns: | 
| 5100 |  |  |  |  |  |  |  | 
| 5101 |  |  |  |  |  |  | =cut | 
| 5102 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $package, $proc_name, $params) = @_; | 
| 5103 | 0 | 0 |  |  |  | 0 | unless ( ref $params eq 'ARRAY' ) { | 
| 5104 | 0 |  |  |  |  | 0 | sys_die( 'Invalid type in call to db_procx_inout' ); | 
| 5105 |  |  |  |  |  |  | } | 
| 5106 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('procx_inout', $vdn); | 
| 5107 |  |  |  |  |  |  |  | 
| 5108 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 5109 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_procx_inout' ); | 
| 5110 |  |  |  |  |  |  | } | 
| 5111 |  |  |  |  |  |  |  | 
| 5112 | 0 |  |  |  |  | 0 | my $sql = _db_proc_build_sql( $package, $proc_name, $params ); | 
| 5113 | 0 |  |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ); | 
| 5114 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5115 |  |  |  |  |  |  |  | 
| 5116 | 0 |  |  |  |  | 0 | $tmp_sth = _db_proc_bind_inoutparams( $tmp_sth, $params); | 
| 5117 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 5118 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5119 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 5120 |  |  |  |  |  |  |  | 
| 5121 | 0 |  |  |  |  | 0 | return 0; | 
| 5122 |  |  |  |  |  |  | } | 
| 5123 |  |  |  |  |  |  |  | 
| 5124 |  |  |  |  |  |  | sub db_dbms_output_enable { | 
| 5125 |  |  |  |  |  |  | =begin wiki | 
| 5126 |  |  |  |  |  |  |  | 
| 5127 |  |  |  |  |  |  | !3 db_dbms_output_enable | 
| 5128 |  |  |  |  |  |  |  | 
| 5129 |  |  |  |  |  |  | Parameters: ( vdn, output_buffer_size) | 
| 5130 |  |  |  |  |  |  |  | 
| 5131 |  |  |  |  |  |  | This function enables dbms_output in the database. You may send this \ | 
| 5132 |  |  |  |  |  |  | function an output buffer size if desired. If no buffersize is provided, \ | 
| 5133 |  |  |  |  |  |  | a default buffer size of 1000000 is used. This interface is Oracle specific, \ | 
| 5134 |  |  |  |  |  |  | so a check is performed to make sure that the supplied vdn is pointing to \ | 
| 5135 |  |  |  |  |  |  | an Oracle database. | 
| 5136 |  |  |  |  |  |  |  | 
| 5137 |  |  |  |  |  |  | Returns: | 
| 5138 |  |  |  |  |  |  |  | 
| 5139 |  |  |  |  |  |  | =cut | 
| 5140 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $bufsize) = shift; | 
| 5141 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('enable_dbms_output', $vdn); | 
| 5142 |  |  |  |  |  |  |  | 
| 5143 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 5144 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_dbms_output_get' ); | 
| 5145 |  |  |  |  |  |  | } | 
| 5146 |  |  |  |  |  |  |  | 
| 5147 | 0 |  |  |  |  | 0 | $sys_dbms_output = 1; | 
| 5148 | 0 | 0 |  |  |  | 0 | $bufsize = 1_000_000 unless $bufsize; | 
| 5149 | 0 |  |  |  |  | 0 | $dbh->func($bufsize, 'dbms_output_enable'); | 
| 5150 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { log_warn( DBI->errstr ); return 1; } | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 5151 |  |  |  |  |  |  |  | 
| 5152 | 0 |  |  |  |  | 0 | return 0; | 
| 5153 |  |  |  |  |  |  | } | 
| 5154 |  |  |  |  |  |  |  | 
| 5155 |  |  |  |  |  |  | sub db_dbms_output_disable { | 
| 5156 |  |  |  |  |  |  | =begin wiki | 
| 5157 |  |  |  |  |  |  |  | 
| 5158 |  |  |  |  |  |  | !3 db_dbms_output_disable | 
| 5159 |  |  |  |  |  |  |  | 
| 5160 |  |  |  |  |  |  | Parameters: ( vdn ) | 
| 5161 |  |  |  |  |  |  |  | 
| 5162 |  |  |  |  |  |  | This function disables dbms_output retrieval. It does this by setting a \ | 
| 5163 |  |  |  |  |  |  | module flag value. This interface is Oracle specific, so a check is \ | 
| 5164 |  |  |  |  |  |  | performed to make sure that the supplied vdn is pointing to an Oracle \ | 
| 5165 |  |  |  |  |  |  | database. | 
| 5166 |  |  |  |  |  |  |  | 
| 5167 |  |  |  |  |  |  | Returns: | 
| 5168 |  |  |  |  |  |  |  | 
| 5169 |  |  |  |  |  |  | =cut | 
| 5170 | 0 |  |  | 0 | 0 | 0 | my $vdn = shift; | 
| 5171 |  |  |  |  |  |  |  | 
| 5172 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 5173 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_dbms_output_get' ); | 
| 5174 |  |  |  |  |  |  | } | 
| 5175 |  |  |  |  |  |  |  | 
| 5176 | 0 |  |  |  |  | 0 | $sys_dbms_output = 0; | 
| 5177 | 0 |  |  |  |  | 0 | return 0; | 
| 5178 |  |  |  |  |  |  | } | 
| 5179 |  |  |  |  |  |  |  | 
| 5180 |  |  |  |  |  |  | sub db_dbms_output_get { | 
| 5181 |  |  |  |  |  |  | =begin wiki | 
| 5182 |  |  |  |  |  |  |  | 
| 5183 |  |  |  |  |  |  | !3 db_dbms_output_get | 
| 5184 |  |  |  |  |  |  |  | 
| 5185 |  |  |  |  |  |  | Parameters: ( vdn ) | 
| 5186 |  |  |  |  |  |  |  | 
| 5187 |  |  |  |  |  |  | This function retrieves the current dbms_output buffer and returns it to \ | 
| 5188 |  |  |  |  |  |  | the caller as a reference to an array. This interface is Oracle specific, \ | 
| 5189 |  |  |  |  |  |  | so a check is performed to make sure that the supplied vdn is pointing to \ | 
| 5190 |  |  |  |  |  |  | an Oracle database. You need to call db_dbms_output_enable first. | 
| 5191 |  |  |  |  |  |  |  | 
| 5192 |  |  |  |  |  |  | Returns: | 
| 5193 |  |  |  |  |  |  |  | 
| 5194 |  |  |  |  |  |  | =cut | 
| 5195 | 0 |  |  | 0 | 0 | 0 | my $vdn = shift; | 
| 5196 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('get_dbms_output', $vdn); | 
| 5197 |  |  |  |  |  |  |  | 
| 5198 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 5199 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in db_dbms_output_get' ); | 
| 5200 |  |  |  |  |  |  | } | 
| 5201 |  |  |  |  |  |  |  | 
| 5202 | 0 |  |  |  |  | 0 | my @arr; | 
| 5203 | 0 | 0 |  |  |  | 0 | unless ( $sys_dbms_output ) { | 
| 5204 | 0 |  |  |  |  | 0 | log_warn( 'Output option has not been enabled' ); | 
| 5205 | 0 |  |  |  |  | 0 | return \@arr; | 
| 5206 |  |  |  |  |  |  | } | 
| 5207 |  |  |  |  |  |  |  | 
| 5208 | 0 |  |  |  |  | 0 | @arr = $dbh->func('dbms_output_get'); | 
| 5209 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { log_warn( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5210 |  |  |  |  |  |  |  | 
| 5211 | 0 |  |  |  |  | 0 | return \@arr; | 
| 5212 |  |  |  |  |  |  | } | 
| 5213 |  |  |  |  |  |  |  | 
| 5214 |  |  |  |  |  |  | sub db_index_rebuild { | 
| 5215 |  |  |  |  |  |  | =begin wiki | 
| 5216 |  |  |  |  |  |  |  | 
| 5217 |  |  |  |  |  |  | !3 db_index_rebuild | 
| 5218 |  |  |  |  |  |  |  | 
| 5219 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5220 |  |  |  |  |  |  |  | 
| 5221 |  |  |  |  |  |  | Please write this documentation. | 
| 5222 |  |  |  |  |  |  |  | 
| 5223 |  |  |  |  |  |  | Returns: | 
| 5224 |  |  |  |  |  |  |  | 
| 5225 |  |  |  |  |  |  | =cut | 
| 5226 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $index_name) = @_; | 
| 5227 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('ora_index_rebuild', $vdn); | 
| 5228 |  |  |  |  |  |  |  | 
| 5229 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 5230 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in function index_rebuild', 0 ); | 
| 5231 |  |  |  |  |  |  | } | 
| 5232 |  |  |  |  |  |  |  | 
| 5233 | 0 |  |  |  |  | 0 | my $sql = "ALTER INDEX $index_name REBUILD"; | 
| 5234 |  |  |  |  |  |  |  | 
| 5235 | 0 |  |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ); | 
| 5236 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5237 |  |  |  |  |  |  |  | 
| 5238 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 5239 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5240 |  |  |  |  |  |  |  | 
| 5241 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 5242 | 0 |  |  |  |  | 0 | return 0; | 
| 5243 |  |  |  |  |  |  | } | 
| 5244 |  |  |  |  |  |  |  | 
| 5245 |  |  |  |  |  |  | sub db_exchange_partition { | 
| 5246 |  |  |  |  |  |  | =begin wiki | 
| 5247 |  |  |  |  |  |  |  | 
| 5248 |  |  |  |  |  |  | !3 db_exchange_partition | 
| 5249 |  |  |  |  |  |  |  | 
| 5250 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5251 |  |  |  |  |  |  |  | 
| 5252 |  |  |  |  |  |  | Please write this documentation. | 
| 5253 |  |  |  |  |  |  |  | 
| 5254 |  |  |  |  |  |  | Returns: | 
| 5255 |  |  |  |  |  |  |  | 
| 5256 |  |  |  |  |  |  | =cut | 
| 5257 | 0 |  |  | 0 | 0 | 0 | my ($vdn, $to_table, $from_table, $partition) = @_; | 
| 5258 | 0 |  |  |  |  | 0 | my ($dbh, $sth) = _db_vdn('ora_swap_partition', $vdn); | 
| 5259 |  |  |  |  |  |  |  | 
| 5260 | 0 | 0 |  |  |  | 0 | unless ( _db_is_oracle($vdn) ) { | 
| 5261 | 0 |  |  |  |  | 0 | sys_die( 'Not an Oracle database connection in function swap_partition', 0 ); | 
| 5262 |  |  |  |  |  |  | } | 
| 5263 |  |  |  |  |  |  |  | 
| 5264 |  |  |  |  |  |  | ## REPAIR REQUIRED need to figure out why this is required... | 
| 5265 | 0 |  |  |  |  | 0 | db_commit( $vdn ); | 
| 5266 | 0 |  |  |  |  | 0 | sleep 3; | 
| 5267 |  |  |  |  |  |  |  | 
| 5268 | 0 |  |  |  |  | 0 | my $sql = "ALTER TABLE $to_table " | 
| 5269 |  |  |  |  |  |  | . "EXCHANGE PARTITION $partition " | 
| 5270 |  |  |  |  |  |  | . "WITH TABLE $from_table " | 
| 5271 |  |  |  |  |  |  | . "INCLUDING INDEXES " | 
| 5272 |  |  |  |  |  |  | . "WITH VALIDATION"; | 
| 5273 |  |  |  |  |  |  |  | 
| 5274 | 0 |  |  |  |  | 0 | my $tmp_sth = $dbh->prepare( $sql ); | 
| 5275 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5276 |  |  |  |  |  |  |  | 
| 5277 | 0 |  |  |  |  | 0 | $tmp_sth->execute; | 
| 5278 | 0 | 0 |  |  |  | 0 | if ( DBI->errstr ) { sys_die( DBI->errstr ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5279 |  |  |  |  |  |  |  | 
| 5280 | 0 |  |  |  |  | 0 | $tmp_sth->finish; | 
| 5281 | 0 |  |  |  |  | 0 | return 0; | 
| 5282 |  |  |  |  |  |  | } | 
| 5283 |  |  |  |  |  |  |  | 
| 5284 |  |  |  |  |  |  | =begin wiki | 
| 5285 |  |  |  |  |  |  |  | 
| 5286 |  |  |  |  |  |  | !2 Utility Functions | 
| 5287 |  |  |  |  |  |  |  | 
| 5288 |  |  |  |  |  |  | These functions provide the general purpose file access capabilities. | 
| 5289 |  |  |  |  |  |  |  | 
| 5290 |  |  |  |  |  |  | =cut | 
| 5291 |  |  |  |  |  |  |  | 
| 5292 |  |  |  |  |  |  | sub util_get_filename_load { | 
| 5293 |  |  |  |  |  |  | =begin wiki | 
| 5294 |  |  |  |  |  |  |  | 
| 5295 |  |  |  |  |  |  | !3 util_get_filename_load | 
| 5296 |  |  |  |  |  |  |  | 
| 5297 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5298 |  |  |  |  |  |  |  | 
| 5299 |  |  |  |  |  |  | Please write this documentation. | 
| 5300 |  |  |  |  |  |  |  | 
| 5301 |  |  |  |  |  |  | Returns: | 
| 5302 |  |  |  |  |  |  |  | 
| 5303 |  |  |  |  |  |  | =cut | 
| 5304 | 0 |  |  | 0 | 0 | 0 | my ($base, $ext) = @_; | 
| 5305 | 0 |  |  |  |  | 0 | my $filename = $base . '.' . $ext; | 
| 5306 | 0 | 0 |  |  |  | 0 | if ( $osuser ) { | 
| 5307 | 0 |  |  |  |  | 0 | $filename = $base . '_' . $osuser . '.' . $ext; | 
| 5308 |  |  |  |  |  |  | } | 
| 5309 | 0 |  |  |  |  | 0 | return $path_load_dir . $filename; | 
| 5310 |  |  |  |  |  |  | } | 
| 5311 |  |  |  |  |  |  |  | 
| 5312 |  |  |  |  |  |  | sub util_get_filename_extr { | 
| 5313 |  |  |  |  |  |  | =begin wiki | 
| 5314 |  |  |  |  |  |  |  | 
| 5315 |  |  |  |  |  |  | !3 util_get_filename_extr | 
| 5316 |  |  |  |  |  |  |  | 
| 5317 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5318 |  |  |  |  |  |  |  | 
| 5319 |  |  |  |  |  |  | Please write this documentation. | 
| 5320 |  |  |  |  |  |  |  | 
| 5321 |  |  |  |  |  |  | Returns: | 
| 5322 |  |  |  |  |  |  |  | 
| 5323 |  |  |  |  |  |  | =cut | 
| 5324 | 0 |  |  | 0 | 0 | 0 | my ($base, $ext) = @_; | 
| 5325 | 0 |  |  |  |  | 0 | my $filename = $base . '.' . $ext; | 
| 5326 | 0 | 0 |  |  |  | 0 | if ( $osuser ) { | 
| 5327 | 0 |  |  |  |  | 0 | $filename = $base . '_' . $osuser . '.' . $ext; | 
| 5328 |  |  |  |  |  |  | } | 
| 5329 | 0 |  |  |  |  | 0 | return $path_extr_dir . $filename; | 
| 5330 |  |  |  |  |  |  | } | 
| 5331 |  |  |  |  |  |  |  | 
| 5332 |  |  |  |  |  |  | sub util_get_filename_log { | 
| 5333 |  |  |  |  |  |  | =begin wiki | 
| 5334 |  |  |  |  |  |  |  | 
| 5335 |  |  |  |  |  |  | !3 util_get_filename_log | 
| 5336 |  |  |  |  |  |  |  | 
| 5337 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5338 |  |  |  |  |  |  |  | 
| 5339 |  |  |  |  |  |  | Please write this documentation. | 
| 5340 |  |  |  |  |  |  |  | 
| 5341 |  |  |  |  |  |  | Returns: | 
| 5342 |  |  |  |  |  |  |  | 
| 5343 |  |  |  |  |  |  | =cut | 
| 5344 | 0 |  |  | 0 | 0 | 0 | my $base = shift; | 
| 5345 | 0 |  |  |  |  | 0 | return $path_log_dir . $base . $log_ext; | 
| 5346 |  |  |  |  |  |  | } | 
| 5347 |  |  |  |  |  |  |  | 
| 5348 |  |  |  |  |  |  | sub util_read_header { | 
| 5349 |  |  |  |  |  |  | =begin wiki | 
| 5350 |  |  |  |  |  |  |  | 
| 5351 |  |  |  |  |  |  | !3 util_read_header | 
| 5352 |  |  |  |  |  |  |  | 
| 5353 |  |  |  |  |  |  | Parameters: ( filename, format ) | 
| 5354 |  |  |  |  |  |  |  | 
| 5355 |  |  |  |  |  |  | Please write this documentation. | 
| 5356 |  |  |  |  |  |  |  | 
| 5357 |  |  |  |  |  |  | Returns: | 
| 5358 |  |  |  |  |  |  |  | 
| 5359 |  |  |  |  |  |  | =cut | 
| 5360 | 0 |  |  | 0 | 0 | 0 | my ($filename, $format) = @_; | 
| 5361 | 0 | 0 |  |  |  | 0 | my $fh = File::Bidirectional->new($filename, {origin => 1} ) | 
| 5362 |  |  |  |  |  |  | or sys_die( "Unable to open file $filename" ); | 
| 5363 | 0 |  |  |  |  | 0 | my $head = $fh->readline(); | 
| 5364 | 0 |  |  |  |  | 0 | $fh->close; | 
| 5365 | 0 |  |  |  |  | 0 | return $head; | 
| 5366 |  |  |  |  |  |  | } | 
| 5367 |  |  |  |  |  |  |  | 
| 5368 |  |  |  |  |  |  | sub util_read_footer { | 
| 5369 |  |  |  |  |  |  | =begin wiki | 
| 5370 |  |  |  |  |  |  |  | 
| 5371 |  |  |  |  |  |  | !3 util_read_footer | 
| 5372 |  |  |  |  |  |  |  | 
| 5373 |  |  |  |  |  |  | Parameters: ( filename, format_string ) | 
| 5374 |  |  |  |  |  |  |  | 
| 5375 |  |  |  |  |  |  | Please write this documentation. | 
| 5376 |  |  |  |  |  |  |  | 
| 5377 |  |  |  |  |  |  | Returns: | 
| 5378 |  |  |  |  |  |  |  | 
| 5379 |  |  |  |  |  |  | =cut | 
| 5380 | 0 |  |  | 0 | 0 | 0 | my ($filename, $format) = @_; | 
| 5381 | 0 | 0 |  |  |  | 0 | my $fh = File::Bidirectional->new($filename, {origin => -1} ) | 
| 5382 |  |  |  |  |  |  | or sys_die( "Unable to open file $filename" ); | 
| 5383 | 0 |  |  |  |  | 0 | my $foot = $fh->readline(); | 
| 5384 | 0 |  |  |  |  | 0 | $fh->close; | 
| 5385 | 0 |  |  |  |  | 0 | return $foot; | 
| 5386 |  |  |  |  |  |  | } | 
| 5387 |  |  |  |  |  |  |  | 
| 5388 |  |  |  |  |  |  | sub util_read_file { | 
| 5389 |  |  |  |  |  |  | =begin wiki | 
| 5390 |  |  |  |  |  |  |  | 
| 5391 |  |  |  |  |  |  | Parameters: ( ) | 
| 5392 |  |  |  |  |  |  |  | 
| 5393 |  |  |  |  |  |  | Slurp a file in one go and return a return a reference to the text contained \ | 
| 5394 |  |  |  |  |  |  | in the file. | 
| 5395 |  |  |  |  |  |  |  | 
| 5396 |  |  |  |  |  |  | Returns: | 
| 5397 |  |  |  |  |  |  |  | 
| 5398 |  |  |  |  |  |  | =cut | 
| 5399 | 0 |  |  | 0 | 0 | 0 | my $file = shift; | 
| 5400 | 0 | 0 |  |  |  | 0 | open( my $fh, $file ) or return 0; | 
| 5401 | 0 |  |  |  |  | 0 | my $text = do { local( $/ ) ; <$fh> } ; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 5402 | 0 |  |  |  |  | 0 | return \$text; | 
| 5403 |  |  |  |  |  |  | } | 
| 5404 |  |  |  |  |  |  |  | 
| 5405 |  |  |  |  |  |  | sub util_write_header { | 
| 5406 |  |  |  |  |  |  | =begin wiki | 
| 5407 |  |  |  |  |  |  |  | 
| 5408 |  |  |  |  |  |  | !3 util_write_header | 
| 5409 |  |  |  |  |  |  |  | 
| 5410 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5411 |  |  |  |  |  |  |  | 
| 5412 |  |  |  |  |  |  | Please write this documentation. | 
| 5413 |  |  |  |  |  |  |  | 
| 5414 |  |  |  |  |  |  | Returns: | 
| 5415 |  |  |  |  |  |  |  | 
| 5416 |  |  |  |  |  |  | =cut | 
| 5417 | 0 |  |  | 0 | 0 | 0 | my ($filename, $header, $append) = @_; | 
| 5418 | 0 | 0 |  |  |  | 0 | $header = 'HEADER' unless $header; | 
| 5419 | 0 |  |  |  |  | 0 | my $mode = ">>"; | 
| 5420 | 0 | 0 |  |  |  | 0 | $mode = ">" unless $append; | 
| 5421 | 0 | 0 |  |  |  | 0 | open my $fh, $mode, $filename or sys_die( "Error writing header to $filename" ); | 
| 5422 | 0 |  |  |  |  | 0 | print {$fh} "$header\n"; | 
|  | 0 |  |  |  |  | 0 |  | 
| 5423 | 0 | 0 |  |  |  | 0 | close $fh or sys_die( "Error closing $filename" ); | 
| 5424 | 0 |  |  |  |  | 0 | return 0; | 
| 5425 |  |  |  |  |  |  | } | 
| 5426 |  |  |  |  |  |  |  | 
| 5427 |  |  |  |  |  |  | sub util_write_footer { | 
| 5428 |  |  |  |  |  |  | =begin wiki | 
| 5429 |  |  |  |  |  |  |  | 
| 5430 |  |  |  |  |  |  | !3 util_write_footer | 
| 5431 |  |  |  |  |  |  |  | 
| 5432 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5433 |  |  |  |  |  |  |  | 
| 5434 |  |  |  |  |  |  | Please write this documentation. | 
| 5435 |  |  |  |  |  |  |  | 
| 5436 |  |  |  |  |  |  | Returns: | 
| 5437 |  |  |  |  |  |  |  | 
| 5438 |  |  |  |  |  |  | =cut | 
| 5439 | 0 |  |  | 0 | 0 | 0 | my ($filename, $footer) = @_; | 
| 5440 | 0 | 0 |  |  |  | 0 | $footer = 'FOOTER' unless $footer; | 
| 5441 | 0 | 0 |  |  |  | 0 | open my $fh, ">>", $filename or sys_die( "Error writing footer to $filename" ); | 
| 5442 | 0 |  |  |  |  | 0 | print {$fh} "$footer\n"; | 
|  | 0 |  |  |  |  | 0 |  | 
| 5443 | 0 | 0 |  |  |  | 0 | close $fh or sys_die( "Error closing $filename" ); | 
| 5444 | 0 |  |  |  |  | 0 | return 0; | 
| 5445 |  |  |  |  |  |  | } | 
| 5446 |  |  |  |  |  |  |  | 
| 5447 |  |  |  |  |  |  | sub util_move { | 
| 5448 |  |  |  |  |  |  | =begin wiki | 
| 5449 |  |  |  |  |  |  |  | 
| 5450 |  |  |  |  |  |  | Parameters: ( ) | 
| 5451 |  |  |  |  |  |  |  | 
| 5452 |  |  |  |  |  |  | The move function also takes two parameters: the current name and the \ | 
| 5453 |  |  |  |  |  |  | intended name of the file to be moved. If the destination already exists \ | 
| 5454 |  |  |  |  |  |  | and is a directory, and the source is not a directory, then the source \ | 
| 5455 |  |  |  |  |  |  | file will be renamed into the directory specified by the destination. | 
| 5456 |  |  |  |  |  |  |  | 
| 5457 |  |  |  |  |  |  | If possible, move() will simply rename the file. Otherwise, it copies the \ | 
| 5458 |  |  |  |  |  |  | file to the new location and deletes the original. If an error occurs \ | 
| 5459 |  |  |  |  |  |  | during this copy-and-delete process, you may be left with a (possibly \ | 
| 5460 |  |  |  |  |  |  | partial) copy of the file under the destination name. | 
| 5461 |  |  |  |  |  |  |  | 
| 5462 |  |  |  |  |  |  | Returns: | 
| 5463 |  |  |  |  |  |  |  | 
| 5464 |  |  |  |  |  |  | =cut | 
| 5465 | 0 |  |  | 0 | 0 | 0 | my ($from, $to) = @_; | 
| 5466 |  |  |  |  |  |  |  | 
| 5467 | 0 | 0 |  |  |  | 0 | return 0 unless $util_move; | 
| 5468 | 0 |  |  |  |  | 0 | my $result = move($from, $to); | 
| 5469 | 0 |  |  |  |  | 0 | return $result; | 
| 5470 |  |  |  |  |  |  | } | 
| 5471 |  |  |  |  |  |  |  | 
| 5472 |  |  |  |  |  |  | sub util_trim { | 
| 5473 | 0 |  |  | 0 | 0 | 0 | my $str = shift; | 
| 5474 | 0 |  |  |  |  | 0 | $str =~ s/^\s+//; | 
| 5475 | 0 |  |  |  |  | 0 | $str =~ s/\s+$//; | 
| 5476 | 0 |  |  |  |  | 0 | return $str; | 
| 5477 |  |  |  |  |  |  | } | 
| 5478 |  |  |  |  |  |  |  | 
| 5479 |  |  |  |  |  |  | sub util_zsdf { | 
| 5480 |  |  |  |  |  |  | =begin wiki | 
| 5481 |  |  |  |  |  |  |  | 
| 5482 |  |  |  |  |  |  | Parameters: ( ) | 
| 5483 |  |  |  |  |  |  |  | 
| 5484 |  |  |  |  |  |  | This regex was taken from the book "Regular Expression Recipes", by Nathan \ | 
| 5485 |  |  |  |  |  |  | A. Good. The idea for util_zsdf (Zero Supress Decimal Format) came from my \ | 
| 5486 |  |  |  |  |  |  | first mentor, Ed Bowlen. | 
| 5487 |  |  |  |  |  |  |  | 
| 5488 |  |  |  |  |  |  | Returns: | 
| 5489 |  |  |  |  |  |  |  | 
| 5490 |  |  |  |  |  |  | =cut | 
| 5491 | 0 |  |  | 0 | 0 | 0 | my ($number, $width) = @_; | 
| 5492 | 0 |  |  |  |  | 0 | $number =~ s/(?<=\d)(?=(\d{3})+(?!\d))/,/g; | 
| 5493 | 0 |  |  |  |  | 0 | return sprintf '%*s', $width, $number; | 
| 5494 |  |  |  |  |  |  | } | 
| 5495 |  |  |  |  |  |  |  | 
| 5496 |  |  |  |  |  |  | =begin wiki | 
| 5497 |  |  |  |  |  |  |  | 
| 5498 |  |  |  |  |  |  | !2 Testing Functions | 
| 5499 |  |  |  |  |  |  |  | 
| 5500 |  |  |  |  |  |  | These functions some basic test capabilities. These can be used to write simple | 
| 5501 |  |  |  |  |  |  | database test scripts. | 
| 5502 |  |  |  |  |  |  |  | 
| 5503 |  |  |  |  |  |  | =cut | 
| 5504 |  |  |  |  |  |  |  | 
| 5505 |  |  |  |  |  |  | sub test_init { | 
| 5506 |  |  |  |  |  |  | =begin wiki | 
| 5507 |  |  |  |  |  |  |  | 
| 5508 |  |  |  |  |  |  | !3 test_init | 
| 5509 |  |  |  |  |  |  |  | 
| 5510 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5511 |  |  |  |  |  |  |  | 
| 5512 |  |  |  |  |  |  | Please write this documentation. | 
| 5513 |  |  |  |  |  |  |  | 
| 5514 |  |  |  |  |  |  | Returns: | 
| 5515 |  |  |  |  |  |  |  | 
| 5516 |  |  |  |  |  |  | =cut | 
| 5517 | 0 |  |  | 0 | 0 | 0 | $t_ok       = 0; | 
| 5518 | 0 |  |  |  |  | 0 | $t_notok    = 0; | 
| 5519 | 0 |  |  |  |  | 0 | return 0; | 
| 5520 |  |  |  |  |  |  | } | 
| 5521 |  |  |  |  |  |  |  | 
| 5522 |  |  |  |  |  |  | sub test_ok { | 
| 5523 |  |  |  |  |  |  | =begin wiki | 
| 5524 |  |  |  |  |  |  |  | 
| 5525 |  |  |  |  |  |  | !3 test_ok | 
| 5526 |  |  |  |  |  |  |  | 
| 5527 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5528 |  |  |  |  |  |  |  | 
| 5529 |  |  |  |  |  |  | Please write this documentation. | 
| 5530 |  |  |  |  |  |  |  | 
| 5531 |  |  |  |  |  |  | Returns: | 
| 5532 |  |  |  |  |  |  |  | 
| 5533 |  |  |  |  |  |  | =cut | 
| 5534 | 0 |  |  | 0 | 0 | 0 | my ($actual,$expected,$description) = @_; | 
| 5535 |  |  |  |  |  |  |  | 
| 5536 | 0 |  |  |  |  | 0 | $t_num++; | 
| 5537 | 0 | 0 |  |  |  | 0 | if ($actual eq $expected) { | 
| 5538 | 0 |  |  |  |  | 0 | $t_ok++; | 
| 5539 | 0 |  |  |  |  | 0 | log_info("ok $t_num"); | 
| 5540 |  |  |  |  |  |  | } else { | 
| 5541 | 0 |  |  |  |  | 0 | $t_notok++; | 
| 5542 | 0 |  |  |  |  | 0 | sys_set_errorlevel(sys_get_errorlevel()+1); | 
| 5543 | 0 |  |  |  |  | 0 | log_info("not ok $t_num - $description"); | 
| 5544 |  |  |  |  |  |  | } | 
| 5545 |  |  |  |  |  |  |  | 
| 5546 | 0 |  |  |  |  | 0 | return 0; | 
| 5547 |  |  |  |  |  |  | } | 
| 5548 |  |  |  |  |  |  |  | 
| 5549 |  |  |  |  |  |  | sub test_results { | 
| 5550 |  |  |  |  |  |  | =begin wiki | 
| 5551 |  |  |  |  |  |  |  | 
| 5552 |  |  |  |  |  |  | !3 test_results | 
| 5553 |  |  |  |  |  |  |  | 
| 5554 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5555 |  |  |  |  |  |  |  | 
| 5556 |  |  |  |  |  |  | Please write this documentation. | 
| 5557 |  |  |  |  |  |  |  | 
| 5558 |  |  |  |  |  |  | Returns: | 
| 5559 |  |  |  |  |  |  |  | 
| 5560 |  |  |  |  |  |  | =cut | 
| 5561 | 0 |  |  | 0 | 0 | 0 | log_info("Test script: passed $t_ok, failed $t_notok"); | 
| 5562 | 0 | 0 |  |  |  | 0 | if ( $t_notok == 0 ) { | 
| 5563 | 0 |  |  |  |  | 0 | log_info("Test script: PASS"); | 
| 5564 |  |  |  |  |  |  | } else { | 
| 5565 | 0 |  |  |  |  | 0 | log_info("Test script: FAIL"); | 
| 5566 |  |  |  |  |  |  | } | 
| 5567 | 0 |  |  |  |  | 0 | return 0; | 
| 5568 |  |  |  |  |  |  | } | 
| 5569 |  |  |  |  |  |  |  | 
| 5570 |  |  |  |  |  |  | sub test_harness_init { | 
| 5571 |  |  |  |  |  |  | =begin wiki | 
| 5572 |  |  |  |  |  |  |  | 
| 5573 |  |  |  |  |  |  | !3 test_harness_init | 
| 5574 |  |  |  |  |  |  |  | 
| 5575 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5576 |  |  |  |  |  |  |  | 
| 5577 |  |  |  |  |  |  | Please write this documentation. | 
| 5578 |  |  |  |  |  |  |  | 
| 5579 |  |  |  |  |  |  | Returns: | 
| 5580 |  |  |  |  |  |  |  | 
| 5581 |  |  |  |  |  |  | =cut | 
| 5582 | 0 |  |  | 0 | 0 | 0 | $th_num = 0; | 
| 5583 | 0 |  |  |  |  | 0 | return 0; | 
| 5584 |  |  |  |  |  |  | } | 
| 5585 |  |  |  |  |  |  |  | 
| 5586 |  |  |  |  |  |  | sub test_harness_run { | 
| 5587 |  |  |  |  |  |  | =begin wiki | 
| 5588 |  |  |  |  |  |  |  | 
| 5589 |  |  |  |  |  |  | !3 test_harness_run | 
| 5590 |  |  |  |  |  |  |  | 
| 5591 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5592 |  |  |  |  |  |  |  | 
| 5593 |  |  |  |  |  |  | Please write this documentation. | 
| 5594 |  |  |  |  |  |  |  | 
| 5595 |  |  |  |  |  |  | Returns: | 
| 5596 |  |  |  |  |  |  |  | 
| 5597 |  |  |  |  |  |  | =cut | 
| 5598 | 0 |  |  | 0 | 0 | 0 | my $test_scripts = shift; | 
| 5599 |  |  |  |  |  |  |  | 
| 5600 | 0 |  |  |  |  | 0 | foreach my $ts ( @{$test_scripts} ) { | 
|  | 0 |  |  |  |  | 0 |  | 
| 5601 | 0 |  |  |  |  | 0 | $th_num++; | 
| 5602 | 0 |  |  |  |  | 0 | log_info("Test script: $ts"); | 
| 5603 | 0 |  |  |  |  | 0 | my $retcd = sys_run_job($ts, 8, '-r', '-v'); | 
| 5604 | 0 | 0 |  |  |  | 0 | if ( $retcd > 0 ) { | 
| 5605 | 0 |  |  |  |  | 0 | sys_set_errorlevel( sys_get_errorlevel() + $retcd ); | 
| 5606 |  |  |  |  |  |  | } | 
| 5607 |  |  |  |  |  |  | } | 
| 5608 |  |  |  |  |  |  |  | 
| 5609 | 0 |  |  |  |  | 0 | return 0; | 
| 5610 |  |  |  |  |  |  | } | 
| 5611 |  |  |  |  |  |  |  | 
| 5612 |  |  |  |  |  |  | sub test_harness_results { | 
| 5613 |  |  |  |  |  |  | =begin wiki | 
| 5614 |  |  |  |  |  |  |  | 
| 5615 |  |  |  |  |  |  | !3 test_harness_results | 
| 5616 |  |  |  |  |  |  |  | 
| 5617 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5618 |  |  |  |  |  |  |  | 
| 5619 |  |  |  |  |  |  | Please write this documentation. | 
| 5620 |  |  |  |  |  |  |  | 
| 5621 |  |  |  |  |  |  | Returns: | 
| 5622 |  |  |  |  |  |  |  | 
| 5623 |  |  |  |  |  |  | =cut | 
| 5624 | 0 |  |  | 0 | 0 | 0 | my $test_scripts = shift; | 
| 5625 |  |  |  |  |  |  |  | 
| 5626 | 0 |  |  |  |  | 0 | my ($ts_passed, $ts_failed); | 
| 5627 | 0 |  |  |  |  | 0 | my $th_result = 'PASS'; | 
| 5628 | 0 |  |  |  |  | 0 | my $th_passed = 0; | 
| 5629 | 0 |  |  |  |  | 0 | my $th_failed = 0; | 
| 5630 |  |  |  |  |  |  |  | 
| 5631 | 0 |  |  |  |  | 0 | foreach my $ts ( @{$test_scripts} ) { | 
|  | 0 |  |  |  |  | 0 |  | 
| 5632 | 0 |  |  |  |  | 0 | $ts =~ s/\.pl$//; | 
| 5633 | 0 |  |  |  |  | 0 | my $tsfull = util_get_filename_log( $ts ); | 
| 5634 | 0 |  |  |  |  | 0 | my $log = util_read_file( $tsfull ); | 
| 5635 | 0 | 0 |  |  |  | 0 | if ( ! $log ) { | 
| 5636 | 0 |  |  |  |  | 0 | log_info( "Error reading log for test script: $ts" ); | 
| 5637 | 0 |  |  |  |  | 0 | next; | 
| 5638 |  |  |  |  |  |  | } | 
| 5639 |  |  |  |  |  |  |  | 
| 5640 | 0 |  |  |  |  | 0 | $ts_passed = 0; | 
| 5641 | 0 |  |  |  |  | 0 | $ts_failed = 0; | 
| 5642 | 0 |  |  |  |  | 0 | $th_num++; | 
| 5643 |  |  |  |  |  |  |  | 
| 5644 | 0 |  |  |  |  | 0 | $$log =~ m#.{19,19} Test script: (PASS|FAIL|DUBIOUS)#; | 
| 5645 | 0 |  |  |  |  | 0 | my $ts_result = $1; | 
| 5646 |  |  |  |  |  |  |  | 
| 5647 | 0 |  |  |  |  | 0 | $$log =~ m#.{19,19} Test script: passed (\d+), failed (\d+)#; | 
| 5648 | 0 |  |  |  |  | 0 | $ts_passed = $1; | 
| 5649 | 0 |  |  |  |  | 0 | $ts_failed = $2; | 
| 5650 |  |  |  |  |  |  |  | 
| 5651 | 0 | 0 |  |  |  | 0 | if ( $ts_result eq 'PASS' ) { | 
| 5652 | 0 |  |  |  |  | 0 | $th_passed++; | 
| 5653 |  |  |  |  |  |  | } | 
| 5654 | 0 | 0 |  |  |  | 0 | if ( $ts_result eq 'FAIL' ) { | 
| 5655 | 0 |  |  |  |  | 0 | $th_failed++; | 
| 5656 | 0 |  |  |  |  | 0 | $th_result = 'FAIL'; | 
| 5657 |  |  |  |  |  |  | } | 
| 5658 |  |  |  |  |  |  |  | 
| 5659 | 0 |  |  |  |  | 0 | log_info( "Test harness: script $ts, passed $ts_passed, failed $ts_failed, $ts_result" ); | 
| 5660 |  |  |  |  |  |  | } | 
| 5661 |  |  |  |  |  |  |  | 
| 5662 | 0 |  |  |  |  | 0 | log_info( "Test harness: passed $th_passed, failed $th_failed" ); | 
| 5663 | 0 |  |  |  |  | 0 | log_info( "Test harness: $th_result" ); | 
| 5664 |  |  |  |  |  |  |  | 
| 5665 | 0 |  |  |  |  | 0 | return 0; | 
| 5666 |  |  |  |  |  |  | } | 
| 5667 |  |  |  |  |  |  |  | 
| 5668 |  |  |  |  |  |  | sub test_harness_summary { | 
| 5669 |  |  |  |  |  |  | =begin wiki | 
| 5670 |  |  |  |  |  |  |  | 
| 5671 |  |  |  |  |  |  | !3 test_harness_summary | 
| 5672 |  |  |  |  |  |  |  | 
| 5673 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5674 |  |  |  |  |  |  |  | 
| 5675 |  |  |  |  |  |  | Please write this documentation. | 
| 5676 |  |  |  |  |  |  |  | 
| 5677 |  |  |  |  |  |  | Returns: | 
| 5678 |  |  |  |  |  |  |  | 
| 5679 |  |  |  |  |  |  | =cut | 
| 5680 | 0 |  |  | 0 | 0 | 0 | my $test_harnesses = shift; | 
| 5681 |  |  |  |  |  |  |  | 
| 5682 | 0 |  |  |  |  | 0 | foreach my $th ( @{$test_harnesses} ) { | 
|  | 0 |  |  |  |  | 0 |  | 
| 5683 | 0 |  |  |  |  | 0 | $th =~ s/\.pl$//; | 
| 5684 | 0 |  |  |  |  | 0 | my $thfull = util_get_filename_log( $th ); | 
| 5685 | 0 |  |  |  |  | 0 | my $log = util_read_file( $thfull ); | 
| 5686 | 0 | 0 |  |  |  | 0 | if ( ! $log ) { | 
| 5687 | 0 |  |  |  |  | 0 | log_info( "Error reading log for test harness: $th" ); | 
| 5688 | 0 |  |  |  |  | 0 | next; | 
| 5689 |  |  |  |  |  |  | } | 
| 5690 |  |  |  |  |  |  |  | 
| 5691 | 0 |  |  |  |  | 0 | log_info( "Test harness summary: $th" ); | 
| 5692 |  |  |  |  |  |  |  | 
| 5693 |  |  |  |  |  |  | } | 
| 5694 |  |  |  |  |  |  |  | 
| 5695 | 0 |  |  |  |  | 0 | return 0; | 
| 5696 |  |  |  |  |  |  | } | 
| 5697 |  |  |  |  |  |  |  | 
| 5698 |  |  |  |  |  |  | # private methods | 
| 5699 |  |  |  |  |  |  | # ----------------------------------------------------------------------------- | 
| 5700 |  |  |  |  |  |  |  | 
| 5701 |  |  |  |  |  |  | =begin wiki | 
| 5702 |  |  |  |  |  |  |  | 
| 5703 |  |  |  |  |  |  | !2 Private Functions | 
| 5704 |  |  |  |  |  |  |  | 
| 5705 |  |  |  |  |  |  | These functions provide internal module support. | 
| 5706 |  |  |  |  |  |  |  | 
| 5707 |  |  |  |  |  |  | =cut | 
| 5708 |  |  |  |  |  |  |  | 
| 5709 |  |  |  |  |  |  | sub _sys_init_vars { | 
| 5710 |  |  |  |  |  |  | =begin wiki | 
| 5711 |  |  |  |  |  |  |  | 
| 5712 |  |  |  |  |  |  | !3 _sys_init_vars | 
| 5713 |  |  |  |  |  |  |  | 
| 5714 |  |  |  |  |  |  | Parameters: ( ) | 
| 5715 |  |  |  |  |  |  |  | 
| 5716 |  |  |  |  |  |  | This function provides variable initialization for a particular jobname. \ | 
| 5717 |  |  |  |  |  |  | Once sys_init has been called with a jobname, this function is called to \ | 
| 5718 |  |  |  |  |  |  | initialize or reinitialize system variables. It is possible, although not \ | 
| 5719 |  |  |  |  |  |  | recommended, to stack jobs in a single perl script. my callling sys_init with \ | 
| 5720 |  |  |  |  |  |  | different jobnames each time. This feature has not been thoroughly tested. | 
| 5721 |  |  |  |  |  |  |  | 
| 5722 |  |  |  |  |  |  | Returns: | 
| 5723 |  |  |  |  |  |  |  | 
| 5724 |  |  |  |  |  |  | =cut | 
| 5725 | 0 |  |  | 0 |  | 0 | $pid = $PROCESS_ID; | 
| 5726 | 0 |  |  |  |  | 0 | $errorlevel = 0; | 
| 5727 | 0 |  |  |  |  | 0 | @plugins = (); | 
| 5728 | 0 |  |  |  |  | 0 | $sys_dbms_output = 1; | 
| 5729 | 0 |  |  |  |  | 0 | $sys_log_open = 0; | 
| 5730 | 0 |  |  |  |  | 0 | $sys_jobconf_override = 0; | 
| 5731 | 0 |  |  |  |  | 0 | $sys_jobconf_file = ''; | 
| 5732 |  |  |  |  |  |  |  | 
| 5733 | 0 |  |  |  |  | 0 | %log_level_opts = ( | 
| 5734 |  |  |  |  |  |  | FATAL => 'FATAL', | 
| 5735 |  |  |  |  |  |  | ERROR => 'FATAL,ERROR', | 
| 5736 |  |  |  |  |  |  | WARN  => 'FATAL,ERROR,WARN', | 
| 5737 |  |  |  |  |  |  | INFO  => 'FATAL,ERROR,WARN,INFO', | 
| 5738 |  |  |  |  |  |  | DEBUG => 'FATAL,ERROR,WARN,INFO,DEBUG', | 
| 5739 |  |  |  |  |  |  | NONE  => 'NONE', | 
| 5740 |  |  |  |  |  |  | ); | 
| 5741 |  |  |  |  |  |  |  | 
| 5742 | 0 |  |  |  |  | 0 | _sys_read_conf( 'sys_data.conf' ); | 
| 5743 | 0 |  |  |  |  | 0 | _sys_read_conf( 'sys_log.conf' ); | 
| 5744 | 0 |  |  |  |  | 0 | _sys_read_conf( 'sys_mail.conf' ); | 
| 5745 | 0 |  |  |  |  | 0 | _sys_read_conf( 'sys_common.conf' ); | 
| 5746 | 0 |  |  |  |  | 0 | _sys_read_conf( 'sys_util.conf' ); | 
| 5747 | 0 |  |  |  |  | 0 | _sys_read_conf( 'sys_environment.conf' ); | 
| 5748 | 0 |  |  |  |  | 0 | _sys_read_conf( 'sys_de.conf'); | 
| 5749 | 0 |  |  |  |  | 0 | _sys_read_conf( 'sys_run_controls.conf'); | 
| 5750 |  |  |  |  |  |  |  | 
| 5751 | 0 |  |  |  |  | 0 | my $envvar = uc $conf_system{'system'}{'envvar'}; | 
| 5752 | 0 |  |  |  |  | 0 | $dataenvr = lc $ENV{$envvar}; | 
| 5753 | 0 | 0 |  |  |  | 0 | if ( ! defined $dataenvr ) { | 
| 5754 | 0 |  |  |  |  | 0 | sys_die( "Environment variable $dataenvr not set", 0 ); | 
| 5755 |  |  |  |  |  |  | } | 
| 5756 |  |  |  |  |  |  |  | 
| 5757 | 0 |  |  |  |  | 0 | $path_bin_dir       = $conf_system{"$OSNAME directory bin"}{$dataenvr}; | 
| 5758 | 0 |  |  |  |  | 0 | $path_lib_dir       = $conf_system{"$OSNAME directory lib"}{$dataenvr}; | 
| 5759 | 0 |  |  |  |  | 0 | $path_log_dir       = $conf_system{"$OSNAME directory log"}{$dataenvr}; | 
| 5760 | 0 |  |  |  |  | 0 | $path_load_dir      = $conf_system{"$OSNAME directory load"}{$dataenvr}; | 
| 5761 | 0 |  |  |  |  | 0 | $path_extr_dir      = $conf_system{"$OSNAME directory extr"}{$dataenvr}; | 
| 5762 | 0 |  |  |  |  | 0 | $path_prev_dir      = $conf_system{"$OSNAME directory prev"}{$dataenvr}; | 
| 5763 | 0 |  |  |  |  | 0 | $path_scripts_dir   = $conf_system{"$OSNAME directory scripts"}{$dataenvr}; | 
| 5764 | 0 |  |  |  |  | 0 | $mail_server        = $conf_mail{'mail'}{'server'}; | 
| 5765 | 0 |  |  |  |  | 0 | $mail_from          = $conf_mail{'mail'}{'from'}; | 
| 5766 | 0 |  |  |  |  | 0 | $mail_emailto       = $conf_mail{'mail'}{'emailto'}; | 
| 5767 | 0 |  |  |  |  | 0 | $mail_pagerto       = $conf_mail{'mail'}{'pagerto'}; | 
| 5768 | 0 |  | 0 |  |  | 0 | $mail_email_levels  = $conf_mail{'mail'}{'email_levels'} || "FATAL"; | 
| 5769 | 0 |  | 0 |  |  | 0 | $mail_pager_levels  = $conf_mail{'mail'}{'pager_levels'} || "FATAL"; | 
| 5770 | 0 |  |  |  |  | 0 | $log_file           = $conf_log{'log'}{'default_logfile'}; | 
| 5771 | 0 |  |  |  |  | 0 | $log_filefull       = $path_log_dir . $log_file; | 
| 5772 | 0 |  | 0 |  |  | 0 | $log_logging_levels = $conf_log{'log'}{'logging_levels'} || "FATAL,ERROR,WARN,INFO"; | 
| 5773 | 0 |  | 0 |  |  | 0 | $log_console_levels = $conf_log{'log'}{'console_levels'} || "FATAL,ERROR,WARN,INFO"; | 
| 5774 | 0 |  | 0 |  |  | 0 | $log_gdg            = $conf_log{'log'}{'gdg'} || 5; | 
| 5775 |  |  |  |  |  |  |  | 
| 5776 | 0 |  |  |  |  | 0 | $path_plugin_dir = $conf_system{"$OSNAME directory plugin"}{$dataenvr}; | 
| 5777 | 0 | 0 |  |  |  | 0 | if ( $osuser ) { | 
| 5778 | 0 |  |  |  |  | 0 | $dbitrace_file = $dbitrace_base . '_' . $osuser . $log_ext; | 
| 5779 |  |  |  |  |  |  | } | 
| 5780 | 0 |  |  |  |  | 0 | $dbitrace_filefull = $path_log_dir.$dbitrace_file; | 
| 5781 |  |  |  |  |  |  |  | 
| 5782 |  |  |  |  |  |  | ## load data structures | 
| 5783 | 0 |  |  |  |  | 0 | @databases = split m/,/, $conf_data{'databases'}{'databases'}; | 
| 5784 | 0 |  |  |  |  | 0 | @dat_envrs = split m/,/, $conf_system{'system'}{'dat_envrs'}; | 
| 5785 | 0 |  |  |  |  | 0 | @job_acros = split m/,/, $conf_system{'system'}{'job_acros'}; | 
| 5786 |  |  |  |  |  |  |  | 
| 5787 | 0 |  |  |  |  | 0 | foreach my $db ( @databases ) { | 
| 5788 | 0 |  |  |  |  | 0 | $dbname{$db} = $conf_data{'names'}{$db}; | 
| 5789 |  |  |  |  |  |  | } | 
| 5790 | 0 |  |  |  |  | 0 | foreach my $db ( @databases ) { | 
| 5791 | 0 |  |  |  |  | 0 | $dbdefenvr{$db} = $conf_data{'default '.$dataenvr}{$db}; | 
| 5792 |  |  |  |  |  |  | } | 
| 5793 | 0 |  |  |  |  | 0 | foreach my $db ( @databases ) { | 
| 5794 | 0 |  |  |  |  | 0 | $dbhandles{$db}{'dbh'} = 0; | 
| 5795 | 0 |  |  |  |  | 0 | $dbhandles{$db}{'sth'} = 0; | 
| 5796 |  |  |  |  |  |  | } | 
| 5797 | 0 |  |  |  |  | 0 | foreach my $db ( @databases ) { | 
| 5798 | 0 |  |  |  |  | 0 | $dbinst{$db} = $conf_data{'instances'}{$db}; | 
| 5799 |  |  |  |  |  |  | } | 
| 5800 | 0 |  |  |  |  | 0 | foreach my $db ( @databases ) { | 
| 5801 | 0 |  |  |  |  | 0 | foreach my $inst ( split m/,/, $conf_data{'instances'}{$db} ) { | 
| 5802 | 0 |  |  |  |  | 0 | $dbconn{$db}{$inst}{'netservice'} = $conf_data{"$db $inst"}{'netservice'}; | 
| 5803 | 0 |  |  |  |  | 0 | $dbconn{$db}{$inst}{'database'  } = $conf_data{"$db $inst"}{'database'}; | 
| 5804 | 0 |  |  |  |  | 0 | $dbconn{$db}{$inst}{'username'  } = $conf_data{"$db $inst"}{'username'}; | 
| 5805 | 0 |  |  |  |  | 0 | $dbconn{$db}{$inst}{'password'  } = $conf_data{"$db $inst"}{'password'}; | 
| 5806 |  |  |  |  |  |  | } | 
| 5807 |  |  |  |  |  |  | } | 
| 5808 |  |  |  |  |  |  |  | 
| 5809 | 0 |  |  |  |  | 0 | return 0; | 
| 5810 |  |  |  |  |  |  | } | 
| 5811 |  |  |  |  |  |  |  | 
| 5812 |  |  |  |  |  |  | sub _sys_job_init { | 
| 5813 |  |  |  |  |  |  | =begin wiki | 
| 5814 |  |  |  |  |  |  |  | 
| 5815 |  |  |  |  |  |  | !3 _sys_job_init | 
| 5816 |  |  |  |  |  |  |  | 
| 5817 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5818 |  |  |  |  |  |  |  | 
| 5819 |  |  |  |  |  |  | Please write this documentation. | 
| 5820 |  |  |  |  |  |  |  | 
| 5821 |  |  |  |  |  |  | Returns: | 
| 5822 |  |  |  |  |  |  |  | 
| 5823 |  |  |  |  |  |  | =cut | 
| 5824 | 0 |  |  | 0 |  | 0 | my $rtconf = $path_conf_dir.'/'.$jobname.'.'.$pid.'.running'; | 
| 5825 |  |  |  |  |  |  |  | 
| 5826 |  |  |  |  |  |  | ## create runtime conf file | 
| 5827 | 0 | 0 |  |  |  | 0 | open my $cfile, '>', $rtconf or sys_die( "Error creating runtime jobconf file" ); | 
| 5828 | 0 |  |  |  |  | 0 | close $cfile; | 
| 5829 |  |  |  |  |  |  |  | 
| 5830 | 0 |  |  |  |  | 0 | my $conf = new Config::IniFiles( -file => $rtconf ); | 
| 5831 | 0 | 0 |  |  |  | 0 | unless ( defined $conf ) { sys_die( "Error opening runtime jobconf file" ); } | 
|  | 0 |  |  |  |  | 0 |  | 
| 5832 |  |  |  |  |  |  |  | 
| 5833 | 0 |  |  |  |  | 0 | my $starttime = time; | 
| 5834 | 0 |  |  |  |  | 0 | $conf->newval( 'pid', 'pid', $pid ); | 
| 5835 | 0 |  |  |  |  | 0 | $conf->newval( 'starttime', 'starttime', $starttime ); | 
| 5836 | 0 |  |  |  |  | 0 | $conf->newval( 'restart', 'restart', 0 ); | 
| 5837 | 0 |  |  |  |  | 0 | $conf->RewriteConfig; | 
| 5838 | 0 |  |  |  |  | 0 | return 0; | 
| 5839 |  |  |  |  |  |  | } | 
| 5840 |  |  |  |  |  |  |  | 
| 5841 |  |  |  |  |  |  | sub _sys_job_end { | 
| 5842 |  |  |  |  |  |  | =begin wiki | 
| 5843 |  |  |  |  |  |  |  | 
| 5844 |  |  |  |  |  |  | !3 _sys_job_end | 
| 5845 |  |  |  |  |  |  |  | 
| 5846 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5847 |  |  |  |  |  |  |  | 
| 5848 |  |  |  |  |  |  | Please write this documentation. | 
| 5849 |  |  |  |  |  |  |  | 
| 5850 |  |  |  |  |  |  | Returns: | 
| 5851 |  |  |  |  |  |  |  | 
| 5852 |  |  |  |  |  |  | =cut | 
| 5853 | 1 |  |  | 1 |  | 5 | my $rtconf = $path_conf_dir.'/'.$jobname.'.'.$pid.'.running'; | 
| 5854 | 1 | 50 |  |  |  | 30 | if ( -e $rtconf ) { | 
| 5855 | 0 |  |  |  |  | 0 | unlink $rtconf; | 
| 5856 |  |  |  |  |  |  | } | 
| 5857 | 1 |  |  |  |  | 1 | return 0; | 
| 5858 |  |  |  |  |  |  | } | 
| 5859 |  |  |  |  |  |  |  | 
| 5860 |  |  |  |  |  |  | sub _sys_job_dependent { | 
| 5861 |  |  |  |  |  |  | =begin wiki | 
| 5862 |  |  |  |  |  |  |  | 
| 5863 |  |  |  |  |  |  | !3 _sys_job_dependent | 
| 5864 |  |  |  |  |  |  |  | 
| 5865 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5866 |  |  |  |  |  |  |  | 
| 5867 |  |  |  |  |  |  | Please write this documentation. | 
| 5868 |  |  |  |  |  |  |  | 
| 5869 |  |  |  |  |  |  | Returns: | 
| 5870 |  |  |  |  |  |  |  | 
| 5871 |  |  |  |  |  |  | =cut | 
| 5872 | 0 |  |  | 0 |  |  | my $dependent_jobname = shift; | 
| 5873 | 0 | 0 |  |  |  |  | return 0 unless $dependent_jobname; | 
| 5874 |  |  |  |  |  |  |  | 
| 5875 | 0 |  |  |  |  |  | my $conf = new Config::IniFiles( -file => $path_conf_dir.'/sys_environment.conf' ); | 
| 5876 | 0 | 0 |  |  |  |  | unless ( defined $conf ) { sys_die( "Error opening sys_environment.conf (4)" ); } | 
|  | 0 |  |  |  |  |  |  | 
| 5877 | 0 |  |  |  |  |  | my $params = join '~', $conf->Parameters( 'jobs' ); | 
| 5878 | 0 | 0 |  |  |  |  | if ( $params =~ m/$dependent_jobname/x ) {   ## case sensitive | 
| 5879 |  |  |  |  |  |  | ## one or more instances of dependent job is currently running | 
| 5880 | 0 |  |  |  |  |  | log_info( "Job name $dependent_jobname is active in the system, waiting" ); | 
| 5881 | 0 |  |  |  |  |  | return 1; | 
| 5882 |  |  |  |  |  |  | } | 
| 5883 | 0 |  |  |  |  |  | return 0; | 
| 5884 |  |  |  |  |  |  | } | 
| 5885 |  |  |  |  |  |  |  | 
| 5886 |  |  |  |  |  |  | sub _sys_read_conf { | 
| 5887 |  |  |  |  |  |  | =begin wiki | 
| 5888 |  |  |  |  |  |  |  | 
| 5889 |  |  |  |  |  |  | !3 _sys_read_conf | 
| 5890 |  |  |  |  |  |  |  | 
| 5891 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5892 |  |  |  |  |  |  |  | 
| 5893 |  |  |  |  |  |  | Please write this documentation. | 
| 5894 |  |  |  |  |  |  |  | 
| 5895 |  |  |  |  |  |  | Returns: | 
| 5896 |  |  |  |  |  |  |  | 
| 5897 |  |  |  |  |  |  | =cut | 
| 5898 | 0 |  |  | 0 |  |  | my $conf = shift; | 
| 5899 | 0 |  |  |  |  |  | my $conf_filefull = $path_conf_dir . '/' . $conf; | 
| 5900 |  |  |  |  |  |  |  | 
| 5901 | 0 |  |  |  |  |  | my $msg1 = "Probably syntax error, unable to load"; | 
| 5902 |  |  |  |  |  |  |  | 
| 5903 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_data/x ) { | 
| 5904 | 0 | 0 |  |  |  |  | tie %conf_data, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5905 |  |  |  |  |  |  | or sys_die( "$msg1 data conf: $conf", 0 ); | 
| 5906 |  |  |  |  |  |  | } | 
| 5907 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_log/x ) { | 
| 5908 | 0 | 0 |  |  |  |  | tie %conf_log, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5909 |  |  |  |  |  |  | or sys_die( "$msg1 log conf: $conf", 0 ); | 
| 5910 |  |  |  |  |  |  | } | 
| 5911 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_mail/x ) { | 
| 5912 | 0 | 0 |  |  |  |  | tie %conf_mail, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5913 |  |  |  |  |  |  | or sys_die( "$msg1 mail conf: $conf", 0 ); | 
| 5914 |  |  |  |  |  |  | } | 
| 5915 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_common/x ) { | 
| 5916 | 0 | 0 |  |  |  |  | tie %conf_query, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5917 |  |  |  |  |  |  | or sys_die( "$msg1 query conf: $conf", 0 ); | 
| 5918 |  |  |  |  |  |  | } | 
| 5919 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_util/x ) { | 
| 5920 | 0 | 0 |  |  |  |  | tie %conf_util, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5921 |  |  |  |  |  |  | or sys_die( "$msg1 util conf: $conf", 0 ); | 
| 5922 |  |  |  |  |  |  | } | 
| 5923 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_environment/x ) { | 
| 5924 | 0 | 0 |  |  |  |  | tie %conf_system, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5925 |  |  |  |  |  |  | or sys_die( "$msg1 environment conf: $conf", 0 ); | 
| 5926 |  |  |  |  |  |  | } | 
| 5927 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_test/x ) { | 
| 5928 | 0 | 0 |  |  |  |  | tie %conf_job, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5929 |  |  |  |  |  |  | or sys_die( "$msg1 test conf: $conf", 0 ); | 
| 5930 |  |  |  |  |  |  | } | 
| 5931 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_de/x ) { | 
| 5932 | 0 | 0 |  |  |  |  | tie %conf_de, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5933 |  |  |  |  |  |  | or sys_die( "$msg1 de conf: $conf", 0 ); | 
| 5934 |  |  |  |  |  |  | } | 
| 5935 | 0 | 0 |  |  |  |  | if ( $conf =~ m/^sys_run_controls/x ) { | 
| 5936 | 0 | 0 |  |  |  |  | tie %conf_rcontrols, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5937 |  |  |  |  |  |  | or sys_die( "$msg1 run controls conf: $conf", 0 ); | 
| 5938 |  |  |  |  |  |  | } | 
| 5939 |  |  |  |  |  |  | ## job specific conf file | 
| 5940 | 0 | 0 |  |  |  |  | if ( $conf !~ m/^sys_/x ) { | 
| 5941 | 0 | 0 |  |  |  |  | tie %conf_job, 'Config::IniFiles', ( -file => $conf_filefull ) | 
| 5942 |  |  |  |  |  |  | or sys_die( "$msg1 job conf: $conf", 0 ); | 
| 5943 |  |  |  |  |  |  | } | 
| 5944 | 0 |  |  |  |  |  | return 0; | 
| 5945 |  |  |  |  |  |  | } | 
| 5946 |  |  |  |  |  |  |  | 
| 5947 |  |  |  |  |  |  | sub _sys_read_job { | 
| 5948 |  |  |  |  |  |  | =begin wiki | 
| 5949 |  |  |  |  |  |  |  | 
| 5950 |  |  |  |  |  |  | !3 _sys_read_job | 
| 5951 |  |  |  |  |  |  |  | 
| 5952 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5953 |  |  |  |  |  |  |  | 
| 5954 |  |  |  |  |  |  | Please write this documentation. | 
| 5955 |  |  |  |  |  |  |  | 
| 5956 |  |  |  |  |  |  | Returns: | 
| 5957 |  |  |  |  |  |  |  | 
| 5958 |  |  |  |  |  |  | =cut | 
| 5959 | 0 | 0 |  | 0 |  |  | if ( $conf_job{job}{'logfile'} ) { | 
| 5960 | 0 |  |  |  |  |  | $log_file = $conf_job{job}{'logfile'}; | 
| 5961 |  |  |  |  |  |  | } | 
| 5962 | 0 | 0 |  |  |  |  | if ( $conf_job{job}{'logging_levels'} ) { | 
| 5963 | 0 |  |  |  |  |  | $log_logging_levels = $conf_job{job}{'logging_levels'}; | 
| 5964 |  |  |  |  |  |  | } | 
| 5965 | 0 | 0 |  |  |  |  | if ( $conf_job{job}{'console_levels'} ) { | 
| 5966 | 0 |  |  |  |  |  | $log_console_levels = $conf_job{job}{'console_levels'}; | 
| 5967 |  |  |  |  |  |  | } | 
| 5968 | 0 | 0 |  |  |  |  | if ( $conf_job{job}{'log_gdg'} ) { | 
| 5969 | 0 |  |  |  |  |  | $log_gdg = $conf_job{job}{'log_gdg'}; | 
| 5970 |  |  |  |  |  |  | } | 
| 5971 | 0 | 0 |  |  |  |  | if ( $conf_job{job}{'log_prefix'} ) { | 
| 5972 | 0 |  |  |  |  |  | $log_prefix = $conf_job{job}{'log_prefix'}; | 
| 5973 |  |  |  |  |  |  | } | 
| 5974 | 0 | 0 |  |  |  |  | if ( $conf_job{job}{'emailto'} ) { | 
| 5975 | 0 |  |  |  |  |  | $mail_emailto = $conf_job{job}{'emailto'}; | 
| 5976 |  |  |  |  |  |  | } | 
| 5977 | 0 | 0 |  |  |  |  | if ( $conf_job{job}{'pagerto'} ) { | 
| 5978 | 0 |  |  |  |  |  | $mail_pagerto = $conf_job{job}{'pagerto'}; | 
| 5979 |  |  |  |  |  |  | } | 
| 5980 | 0 | 0 |  |  |  |  | if ( $conf_job{job}{'email_levels'} ) { | 
| 5981 | 0 |  |  |  |  |  | $mail_email_levels = $conf_job{job}{'email_levels'}; | 
| 5982 |  |  |  |  |  |  | } | 
| 5983 | 0 | 0 |  |  |  |  | if ( $conf_job{job}{'pager_levels'} ) { | 
| 5984 | 0 |  |  |  |  |  | $mail_pager_levels = $conf_job{job}{'pager_levels'}; | 
| 5985 |  |  |  |  |  |  | } | 
| 5986 | 0 |  |  |  |  |  | return 0; | 
| 5987 |  |  |  |  |  |  | } | 
| 5988 |  |  |  |  |  |  |  | 
| 5989 |  |  |  |  |  |  | sub _sys_init_source_validation { | 
| 5990 |  |  |  |  |  |  | =begin wiki | 
| 5991 |  |  |  |  |  |  |  | 
| 5992 |  |  |  |  |  |  | !3 _sys_init_source_validation | 
| 5993 |  |  |  |  |  |  |  | 
| 5994 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 5995 |  |  |  |  |  |  |  | 
| 5996 |  |  |  |  |  |  | Please write this documentation. | 
| 5997 |  |  |  |  |  |  |  | 
| 5998 |  |  |  |  |  |  | Returns: | 
| 5999 |  |  |  |  |  |  |  | 
| 6000 |  |  |  |  |  |  | =cut | 
| 6001 | 0 |  | 0 | 0 |  |  | open my $fh, "<", $script_filefull | 
| 6002 |  |  |  |  |  |  | || sys_die( "Unable to open $script_file for validatation", 0 ); | 
| 6003 | 0 |  |  |  |  |  | my @r = <$fh>; | 
| 6004 | 0 |  |  |  |  |  | close $fh; | 
| 6005 | 0 |  |  |  |  |  | my $source = join '', @r; | 
| 6006 |  |  |  |  |  |  |  | 
| 6007 | 0 |  |  |  |  |  | my $errm1 = "$script_file failed source validation, id tag "; | 
| 6008 | 0 |  |  |  |  |  | my $errm2 = "$script_file failed source validation, pod section "; | 
| 6009 | 0 |  |  |  |  |  | my $errm3 = " is missing or invalid"; | 
| 6010 | 0 |  |  |  |  |  | my $checkfor; | 
| 6011 |  |  |  |  |  |  |  | 
| 6012 | 0 |  |  |  |  |  | $checkfor = "FILENAME"; | 
| 6013 | 0 | 0 |  |  |  |  | $source =~ m/^\#\#@@.*/m | 
| 6014 |  |  |  |  |  |  | or sys_die( $errm1.$checkfor.$errm3, 0 ); | 
| 6015 |  |  |  |  |  |  |  | 
| 6016 | 0 |  |  |  |  |  | $checkfor = "SOURCETITLE"; | 
| 6017 | 0 | 0 |  |  |  |  | $source =~ m/^\#\#\$\$.*/m | 
| 6018 |  |  |  |  |  |  | or sys_die( $errm1.$checkfor.$errm3, 0 ); | 
| 6019 |  |  |  |  |  |  |  | 
| 6020 | 0 |  |  |  |  |  | $checkfor = "NAME"; | 
| 6021 | 0 | 0 |  |  |  |  | $source =~ m/^!1 $checkfor\n\n[A-Za-z]/m | 
| 6022 |  |  |  |  |  |  | or sys_die( $errm2.$checkfor.$errm3, 1 ); | 
| 6023 |  |  |  |  |  |  |  | 
| 6024 | 0 |  |  |  |  |  | $checkfor = "DESCRIPTION"; | 
| 6025 | 0 | 0 |  |  |  |  | $source =~ m/^!1 $checkfor\n\n[A-Za-z]/m | 
| 6026 |  |  |  |  |  |  | or sys_die( $errm2.$checkfor.$errm3, 1 ); | 
| 6027 |  |  |  |  |  |  |  | 
| 6028 | 0 |  |  |  |  |  | $checkfor = "RECOVERY NOTES"; | 
| 6029 | 0 | 0 |  |  |  |  | $source =~ m/^!1 $checkfor\n\n[A-Za-z]/m | 
| 6030 |  |  |  |  |  |  | or sys_die( $errm2.$checkfor.$errm3, 1 ); | 
| 6031 |  |  |  |  |  |  |  | 
| 6032 | 0 |  |  |  |  |  | $checkfor = "ENVIRONMENT NOTES"; | 
| 6033 | 0 | 0 |  |  |  |  | $source =~ m/^!1 $checkfor\n\n[A-Za-z]/m | 
| 6034 |  |  |  |  |  |  | or sys_die( $errm2.$checkfor.$errm3, 1 ); | 
| 6035 |  |  |  |  |  |  |  | 
| 6036 | 0 |  |  |  |  |  | $checkfor = "DEPENDENCIES"; | 
| 6037 | 0 | 0 |  |  |  |  | $source =~ m/^!1 $checkfor\n\n[A-Za-z]/m | 
| 6038 |  |  |  |  |  |  | or sys_die( $errm2.$checkfor.$errm3, 1 ); | 
| 6039 |  |  |  |  |  |  |  | 
| 6040 | 0 |  |  |  |  |  | $checkfor = "HISTORY"; | 
| 6041 | 0 | 0 |  |  |  |  | $source =~ m/^!1 $checkfor\n\n[A-Za-z0-9\*]/m | 
| 6042 |  |  |  |  |  |  | or sys_die( $errm2.$checkfor.$errm3, 1 ); | 
| 6043 |  |  |  |  |  |  |  | 
| 6044 | 0 |  |  |  |  |  | return 0; | 
| 6045 |  |  |  |  |  |  | } | 
| 6046 |  |  |  |  |  |  |  | 
| 6047 |  |  |  |  |  |  | sub _sys_run_background { | 
| 6048 |  |  |  |  |  |  | =begin wiki | 
| 6049 |  |  |  |  |  |  |  | 
| 6050 |  |  |  |  |  |  | !3 _sys_run_background | 
| 6051 |  |  |  |  |  |  |  | 
| 6052 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6053 |  |  |  |  |  |  |  | 
| 6054 |  |  |  |  |  |  | Please write this documentation. | 
| 6055 |  |  |  |  |  |  |  | 
| 6056 |  |  |  |  |  |  | Returns: | 
| 6057 |  |  |  |  |  |  |  | 
| 6058 |  |  |  |  |  |  | =cut | 
| 6059 | 0 | 0 |  | 0 |  |  | if ( $OSNAME eq 'MSWin32' ) { | 
| 6060 | 0 |  |  |  |  |  | sys_die( 'Background run mode not available on Windows', 0 ); | 
| 6061 |  |  |  |  |  |  | } | 
| 6062 | 0 |  |  |  |  |  | $opt_commandline =~ s{-rb }{-r }; | 
| 6063 | 0 |  |  |  |  |  | $opt_commandline =~ s{-rb$}{-r}; | 
| 6064 | 0 |  |  |  |  |  | print "$script_filefull $opt_commandline".' &'; | 
| 6065 | 0 |  |  |  |  |  | exit 0; | 
| 6066 |  |  |  |  |  |  | } | 
| 6067 |  |  |  |  |  |  |  | 
| 6068 |  |  |  |  |  |  | sub _sys_run_scheduled { | 
| 6069 |  |  |  |  |  |  | =begin wiki | 
| 6070 |  |  |  |  |  |  |  | 
| 6071 |  |  |  |  |  |  | !3 _sys_run_scheduled | 
| 6072 |  |  |  |  |  |  |  | 
| 6073 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6074 |  |  |  |  |  |  |  | 
| 6075 |  |  |  |  |  |  | Please write this documentation. | 
| 6076 |  |  |  |  |  |  |  | 
| 6077 |  |  |  |  |  |  | Returns: | 
| 6078 |  |  |  |  |  |  |  | 
| 6079 |  |  |  |  |  |  | =cut | 
| 6080 |  |  |  |  |  |  | ## this die is temporary should use sys_die | 
| 6081 | 0 |  |  | 0 |  |  | die "Not yet implemented\n\n"; | 
| 6082 |  |  |  |  |  |  | } | 
| 6083 |  |  |  |  |  |  |  | 
| 6084 |  |  |  |  |  |  | sub _sys_run_de { | 
| 6085 |  |  |  |  |  |  | =begin wiki | 
| 6086 |  |  |  |  |  |  |  | 
| 6087 |  |  |  |  |  |  | !3 _sys_run_de | 
| 6088 |  |  |  |  |  |  |  | 
| 6089 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6090 |  |  |  |  |  |  |  | 
| 6091 |  |  |  |  |  |  | Please write this documentation. | 
| 6092 |  |  |  |  |  |  |  | 
| 6093 |  |  |  |  |  |  | Returns: | 
| 6094 |  |  |  |  |  |  |  | 
| 6095 |  |  |  |  |  |  | =cut | 
| 6096 | 0 |  |  | 0 |  |  | my $de = shift; | 
| 6097 | 0 |  |  |  |  |  | my $conf_file = $jobname . '.' . $de . '.conf'; | 
| 6098 | 0 |  |  |  |  |  | _sys_read_conf( $conf_file );  ## tie %conf_job to job specific conf file | 
| 6099 | 0 |  |  |  |  |  | _sys_read_job();  ## read job specific settings from %conf_job | 
| 6100 | 0 |  |  |  |  |  | return 0; | 
| 6101 |  |  |  |  |  |  | } | 
| 6102 |  |  |  |  |  |  |  | 
| 6103 |  |  |  |  |  |  | sub _sys_run_restart { | 
| 6104 |  |  |  |  |  |  | =begin wiki | 
| 6105 |  |  |  |  |  |  |  | 
| 6106 |  |  |  |  |  |  | !3 _sys_run_restart | 
| 6107 |  |  |  |  |  |  |  | 
| 6108 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6109 |  |  |  |  |  |  |  | 
| 6110 |  |  |  |  |  |  | Please write this documentation. | 
| 6111 |  |  |  |  |  |  |  | 
| 6112 |  |  |  |  |  |  | Returns: | 
| 6113 |  |  |  |  |  |  |  | 
| 6114 |  |  |  |  |  |  | =cut | 
| 6115 |  |  |  |  |  |  | ## this die is temporary should use sys_die | 
| 6116 | 0 |  |  | 0 |  |  | die "Not yet implemented\n\n"; | 
| 6117 |  |  |  |  |  |  | } | 
| 6118 |  |  |  |  |  |  |  | 
| 6119 |  |  |  |  |  |  | sub _sys_forkexec { | 
| 6120 |  |  |  |  |  |  | =begin wiki | 
| 6121 |  |  |  |  |  |  |  | 
| 6122 |  |  |  |  |  |  | !3 _sys_forkexec | 
| 6123 |  |  |  |  |  |  |  | 
| 6124 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6125 |  |  |  |  |  |  |  | 
| 6126 |  |  |  |  |  |  | Please write this documentation. | 
| 6127 |  |  |  |  |  |  |  | 
| 6128 |  |  |  |  |  |  | Returns: | 
| 6129 |  |  |  |  |  |  |  | 
| 6130 |  |  |  |  |  |  | =cut | 
| 6131 | 0 |  |  | 0 |  |  | my ($jobname, @params) = @_; | 
| 6132 | 0 |  |  |  |  |  | my $pid; | 
| 6133 | 0 | 0 |  |  |  |  | if ( $pid = fork ) { | 
|  |  | 0 |  |  |  |  |  | 
| 6134 | 0 |  |  |  |  |  | return $pid; | 
| 6135 |  |  |  |  |  |  | ## this is the parent, so return the pid, everything below here is | 
| 6136 |  |  |  |  |  |  | ## either the child or a major system failure | 
| 6137 |  |  |  |  |  |  | } | 
| 6138 |  |  |  |  |  |  | elsif ( defined $pid ) { | 
| 6139 | 0 |  |  |  |  |  | exec $jobname, @params; | 
| 6140 |  |  |  |  |  |  | ## shouldn't reach this unless exec fails, we exit here (not return) | 
| 6141 |  |  |  |  |  |  | ## becuase we are in the child | 
| 6142 | 0 |  |  |  |  |  | exit 0; | 
| 6143 |  |  |  |  |  |  | } else { | 
| 6144 | 0 |  |  |  |  |  | log_warn( "Could not fork $!" ); | 
| 6145 | 0 |  |  |  |  |  | return 0; | 
| 6146 |  |  |  |  |  |  | } | 
| 6147 |  |  |  |  |  |  | } | 
| 6148 |  |  |  |  |  |  |  | 
| 6149 |  |  |  |  |  |  | sub _sys_reap_child { | 
| 6150 |  |  |  |  |  |  | =begin wiki | 
| 6151 |  |  |  |  |  |  |  | 
| 6152 |  |  |  |  |  |  | !3 _sys_reap_child | 
| 6153 |  |  |  |  |  |  |  | 
| 6154 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6155 |  |  |  |  |  |  |  | 
| 6156 |  |  |  |  |  |  | Please write this documentation. | 
| 6157 |  |  |  |  |  |  |  | 
| 6158 |  |  |  |  |  |  | Returns: | 
| 6159 |  |  |  |  |  |  |  | 
| 6160 |  |  |  |  |  |  | =cut | 
| 6161 | 0 |  |  | 0 |  |  | my $pid = 0; | 
| 6162 | 0 | 0 |  |  |  |  | if ( ($pid = waitpid(-1, 0)) > 0 ) { | 
| 6163 | 0 |  |  |  |  |  | $pidlib{$pid}{retcd} = $? >> 8; | 
| 6164 |  |  |  |  |  |  | } | 
| 6165 | 0 |  |  |  |  |  | return $pid; | 
| 6166 |  |  |  |  |  |  | } | 
| 6167 |  |  |  |  |  |  |  | 
| 6168 |  |  |  |  |  |  | sub _sys_test_dbcon { | 
| 6169 |  |  |  |  |  |  | =begin wiki | 
| 6170 |  |  |  |  |  |  |  | 
| 6171 |  |  |  |  |  |  | !3 _sys_test_dbcon | 
| 6172 |  |  |  |  |  |  |  | 
| 6173 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6174 |  |  |  |  |  |  |  | 
| 6175 |  |  |  |  |  |  | Please write this documentation. | 
| 6176 |  |  |  |  |  |  |  | 
| 6177 |  |  |  |  |  |  | Returns: | 
| 6178 |  |  |  |  |  |  |  | 
| 6179 |  |  |  |  |  |  | =cut | 
| 6180 | 0 |  |  | 0 |  |  | my $connections = shift; | 
| 6181 |  |  |  |  |  |  | ## open dbi trace file | 
| 6182 | 0 |  |  |  |  |  | DBI->trace(1, $dbitrace_filefull ); | 
| 6183 | 0 |  |  |  |  |  | foreach my $connectdef ( split m/,/, $connections ) { | 
| 6184 | 0 |  |  |  |  |  | my ($db, $inst) = split m/:/, $connectdef; | 
| 6185 | 0 | 0 |  |  |  |  | _check_array_val( $db, \@databases ) | 
| 6186 |  |  |  |  |  |  | || sys_die( "Invalid database: [$db]", 0 ); | 
| 6187 | 0 | 0 |  |  |  |  | _check_array_val( $inst, [split m/,/, $dbinst{$db}] ) | 
| 6188 |  |  |  |  |  |  | || sys_die( "Invalid database instance: [$db.$inst]", 0 ); | 
| 6189 | 0 |  |  |  |  |  | my $database = $dbconn{$db}{$inst}{'database'}; | 
| 6190 | 0 |  |  |  |  |  | my $username = $dbconn{$db}{$inst}{'username'}; | 
| 6191 | 0 |  |  |  |  |  | my $password = $dbconn{$db}{$inst}{'password'}; | 
| 6192 | 0 |  |  |  |  |  | print "Connecting to: $db/$inst\n"; | 
| 6193 | 0 | 0 |  |  |  |  | my $dbh = DBI->connect( $database, $username, $password, { RaiseError => 0, AutoCommit => 0 } ) | 
| 6194 |  |  |  |  |  |  | or sys_die( DBI->errstr, 0 ); | 
| 6195 |  |  |  |  |  |  | ## push resulting handle onto handle stack for cleanup on exit | 
| 6196 | 0 |  |  |  |  |  | $dbhandles{$db}{'dbh'} = $dbh; | 
| 6197 | 0 |  |  |  |  |  | print "Success\n\n"; | 
| 6198 |  |  |  |  |  |  | } | 
| 6199 | 0 |  |  |  |  |  | exit 0; | 
| 6200 |  |  |  |  |  |  | } | 
| 6201 |  |  |  |  |  |  |  | 
| 6202 |  |  |  |  |  |  | sub _sys_check_severity_levels { | 
| 6203 |  |  |  |  |  |  | =begin wiki | 
| 6204 |  |  |  |  |  |  |  | 
| 6205 |  |  |  |  |  |  | !3 _sys_check_severity_levels | 
| 6206 |  |  |  |  |  |  |  | 
| 6207 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6208 |  |  |  |  |  |  |  | 
| 6209 |  |  |  |  |  |  | Please write this documentation. | 
| 6210 |  |  |  |  |  |  |  | 
| 6211 |  |  |  |  |  |  | Returns: | 
| 6212 |  |  |  |  |  |  |  | 
| 6213 |  |  |  |  |  |  | =cut | 
| 6214 | 0 |  |  | 0 |  |  | my $lvls_str = shift; | 
| 6215 |  |  |  |  |  |  |  | 
| 6216 |  |  |  |  |  |  | ## levls_str can be either a single value or a comma delimited list | 
| 6217 | 0 | 0 |  |  |  |  | if ( $lvls_str =~ /,/ ) { | 
| 6218 |  |  |  |  |  |  | ## received a list of severity levels | 
| 6219 | 0 |  |  |  |  |  | my @loglvls = split m/,/, $lvls_str; | 
| 6220 | 0 |  |  |  |  |  | foreach my $level ( @loglvls ) { | 
| 6221 | 0 | 0 |  |  |  |  | if ( $level !~ /FATAL|ERROR|WARN|INFO|DEBUG|NONE/ ) { | 
| 6222 | 0 |  |  |  |  |  | sys_die( 'Invalid logging/notification severity list', 0 ); | 
| 6223 |  |  |  |  |  |  | } | 
| 6224 |  |  |  |  |  |  | } | 
| 6225 | 0 |  |  |  |  |  | return $lvls_str; | 
| 6226 |  |  |  |  |  |  | } else { | 
| 6227 |  |  |  |  |  |  | ## received a single severity level to be translated to a list | 
| 6228 | 0 | 0 |  |  |  |  | if ( $lvls_str =~ /^FATAL$/i ) { | 
| 6229 | 0 |  |  |  |  |  | $lvls_str = 'FATAL'; | 
| 6230 | 0 |  |  |  |  |  | return $lvls_str; | 
| 6231 |  |  |  |  |  |  | } | 
| 6232 | 0 | 0 |  |  |  |  | if ( $lvls_str =~ /^ERROR$/i ) { | 
| 6233 | 0 |  |  |  |  |  | $lvls_str = 'FATAL,ERROR'; | 
| 6234 | 0 |  |  |  |  |  | return $lvls_str; | 
| 6235 |  |  |  |  |  |  | } | 
| 6236 | 0 | 0 |  |  |  |  | if ( $lvls_str =~ /^WARN$/i ) { | 
| 6237 | 0 |  |  |  |  |  | $lvls_str = 'FATAL,ERROR,WARN'; | 
| 6238 | 0 |  |  |  |  |  | return $lvls_str; | 
| 6239 |  |  |  |  |  |  | } | 
| 6240 | 0 | 0 |  |  |  |  | if ( $lvls_str =~ /^INFO$/i ) { | 
| 6241 | 0 |  |  |  |  |  | $lvls_str = 'FATAL,ERROR,WARN,INFO'; | 
| 6242 | 0 |  |  |  |  |  | return $lvls_str; | 
| 6243 |  |  |  |  |  |  | } | 
| 6244 | 0 | 0 |  |  |  |  | if ( $lvls_str =~ /^DEBUG$/i ) { | 
| 6245 | 0 |  |  |  |  |  | $lvls_str = 'FATAL,ERROR,WARN,INFO,DEBUG'; | 
| 6246 | 0 |  |  |  |  |  | return $lvls_str; | 
| 6247 |  |  |  |  |  |  | } | 
| 6248 | 0 | 0 |  |  |  |  | if ( $lvls_str =~ /^NONE$/i ) { | 
| 6249 | 0 |  |  |  |  |  | $lvls_str = ''; | 
| 6250 | 0 |  |  |  |  |  | return $lvls_str; | 
| 6251 |  |  |  |  |  |  | } | 
| 6252 | 0 |  |  |  |  |  | sys_die( 'Invalid logging/notification severity level', 0 ); | 
| 6253 |  |  |  |  |  |  | } | 
| 6254 | 0 |  |  |  |  |  | return 0; | 
| 6255 |  |  |  |  |  |  | } | 
| 6256 |  |  |  |  |  |  |  | 
| 6257 |  |  |  |  |  |  | sub _sys_check_log_gdg { | 
| 6258 |  |  |  |  |  |  | =begin wiki | 
| 6259 |  |  |  |  |  |  |  | 
| 6260 |  |  |  |  |  |  | !3 _sys_check_log_gdg | 
| 6261 |  |  |  |  |  |  |  | 
| 6262 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6263 |  |  |  |  |  |  |  | 
| 6264 |  |  |  |  |  |  | Please write this documentation. | 
| 6265 |  |  |  |  |  |  |  | 
| 6266 |  |  |  |  |  |  | Returns: | 
| 6267 |  |  |  |  |  |  |  | 
| 6268 |  |  |  |  |  |  | =cut | 
| 6269 | 0 | 0 |  | 0 |  |  | if ( $opt_log_gdg =~ /[0-9]{1,3}/ ) { | 
| 6270 | 0 |  |  |  |  |  | sys_die( 'Invalid log gdg specified', 0 ); | 
| 6271 |  |  |  |  |  |  | } | 
| 6272 | 0 |  |  |  |  |  | return $opt_log_gdg; | 
| 6273 |  |  |  |  |  |  | } | 
| 6274 |  |  |  |  |  |  |  | 
| 6275 |  |  |  |  |  |  | sub _sys_check_log_radix { | 
| 6276 |  |  |  |  |  |  | =begin wiki | 
| 6277 |  |  |  |  |  |  |  | 
| 6278 |  |  |  |  |  |  | !3 _sys_check_log_radix | 
| 6279 |  |  |  |  |  |  |  | 
| 6280 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6281 |  |  |  |  |  |  |  | 
| 6282 |  |  |  |  |  |  | Please write this documentation. | 
| 6283 |  |  |  |  |  |  |  | 
| 6284 |  |  |  |  |  |  | Returns: | 
| 6285 |  |  |  |  |  |  |  | 
| 6286 |  |  |  |  |  |  | =cut | 
| 6287 | 0 | 0 | 0 | 0 |  |  | if ( $opt_log_radix < 1 || $opt_log_radix > 4 ) { | 
| 6288 | 0 |  |  |  |  |  | sys_die( 'Invalid log radix specified', 0 ); | 
| 6289 |  |  |  |  |  |  | } | 
| 6290 | 0 |  |  |  |  |  | return $opt_log_radix; | 
| 6291 |  |  |  |  |  |  | } | 
| 6292 |  |  |  |  |  |  |  | 
| 6293 |  |  |  |  |  |  | sub _sys_check_de_override { | 
| 6294 |  |  |  |  |  |  | =begin wiki | 
| 6295 |  |  |  |  |  |  |  | 
| 6296 |  |  |  |  |  |  | !3 _sys_check_de_override | 
| 6297 |  |  |  |  |  |  |  | 
| 6298 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6299 |  |  |  |  |  |  |  | 
| 6300 |  |  |  |  |  |  | Please write this documentation. | 
| 6301 |  |  |  |  |  |  |  | 
| 6302 |  |  |  |  |  |  | Returns: | 
| 6303 |  |  |  |  |  |  |  | 
| 6304 |  |  |  |  |  |  | =cut | 
| 6305 | 0 |  |  | 0 |  |  | my $tmp_jobname = shift; | 
| 6306 | 0 |  |  |  |  |  | my $tmp_jobconf_file = $tmp_jobname; | 
| 6307 | 0 |  |  |  |  |  | my $delist = $conf_de{jobname}{$tmp_jobname}; | 
| 6308 | 0 | 0 |  |  |  |  | if ( $delist ) {   ## possible override of job conf | 
| 6309 | 0 |  |  |  |  |  | my $de = '0000'; | 
| 6310 | 0 | 0 |  |  |  |  | if ( $delist =~ /(\d\d\d\d\d)\s?$/ ) { | 
| 6311 | 0 |  |  |  |  |  | $de = $1; | 
| 6312 |  |  |  |  |  |  | } | 
| 6313 | 0 |  |  |  |  |  | my $overenvs = $conf_de{$de}{'env'}; | 
| 6314 | 0 | 0 |  |  |  |  | if ( $overenvs =~ /$dataenvr/i ) { | 
| 6315 |  |  |  |  |  |  | ## as a side-effect, sys_jobconf_override gets set here... | 
| 6316 | 0 |  |  |  |  |  | $sys_jobconf_override = 1;   ## so we know override is effective | 
| 6317 | 0 |  |  |  |  |  | $tmp_jobconf_file .= ".$de"; | 
| 6318 |  |  |  |  |  |  | } | 
| 6319 |  |  |  |  |  |  | } | 
| 6320 | 0 |  |  |  |  |  | return $tmp_jobconf_file; | 
| 6321 |  |  |  |  |  |  | } | 
| 6322 |  |  |  |  |  |  |  | 
| 6323 |  |  |  |  |  |  | sub _sys_disp_logprev { | 
| 6324 |  |  |  |  |  |  | =begin wiki | 
| 6325 |  |  |  |  |  |  |  | 
| 6326 |  |  |  |  |  |  | !3 _sys_disp_logprev | 
| 6327 |  |  |  |  |  |  |  | 
| 6328 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6329 |  |  |  |  |  |  |  | 
| 6330 |  |  |  |  |  |  | Please write this documentation. | 
| 6331 |  |  |  |  |  |  |  | 
| 6332 |  |  |  |  |  |  | Returns: | 
| 6333 |  |  |  |  |  |  |  | 
| 6334 |  |  |  |  |  |  | =cut | 
| 6335 | 0 | 0 |  | 0 |  |  | if ( $opt_log_file ) { $log_file = $opt_log_file; } | 
|  | 0 |  |  |  |  |  |  | 
| 6336 | 0 |  |  |  |  |  | $log_filefull = $path_log_dir . $log_file; | 
| 6337 | 0 | 0 |  |  |  |  | if ( -e $log_filefull ) { | 
| 6338 | 0 |  |  |  |  |  | print "Log: $log_filefull\n"; | 
| 6339 | 0 |  |  |  |  |  | system "cat $log_filefull"; | 
| 6340 | 0 |  |  |  |  |  | print "\n"; | 
| 6341 | 0 |  |  |  |  |  | exit 0; | 
| 6342 |  |  |  |  |  |  | } | 
| 6343 | 0 |  |  |  |  |  | print "No previous log file found\n\n"; | 
| 6344 | 0 |  |  |  |  |  | return 0; | 
| 6345 |  |  |  |  |  |  | } | 
| 6346 |  |  |  |  |  |  |  | 
| 6347 |  |  |  |  |  |  | sub _sys_disp_logarch { | 
| 6348 |  |  |  |  |  |  | =begin wiki | 
| 6349 |  |  |  |  |  |  |  | 
| 6350 |  |  |  |  |  |  | !3 _sys_disp_logarch | 
| 6351 |  |  |  |  |  |  |  | 
| 6352 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6353 |  |  |  |  |  |  |  | 
| 6354 |  |  |  |  |  |  | Please write this documentation. | 
| 6355 |  |  |  |  |  |  |  | 
| 6356 |  |  |  |  |  |  | Returns: | 
| 6357 |  |  |  |  |  |  |  | 
| 6358 |  |  |  |  |  |  | =cut | 
| 6359 | 0 | 0 |  | 0 |  |  | if ( $opt_log_file ) { $log_file = $opt_log_file; } | 
|  | 0 |  |  |  |  |  |  | 
| 6360 | 0 |  |  |  |  |  | $log_filefull = $path_log_dir . $log_file; | 
| 6361 | 0 |  |  |  |  |  | my @logs = glob $log_filefull . '.*'; | 
| 6362 | 0 | 0 |  |  |  |  | if ( @logs ) { | 
| 6363 | 0 |  |  |  |  |  | foreach my $log ( sort @logs ) { | 
| 6364 | 0 |  |  |  |  |  | print "Log: $log\n"; | 
| 6365 | 0 |  |  |  |  |  | system "cat $log"; | 
| 6366 |  |  |  |  |  |  | } | 
| 6367 | 0 |  |  |  |  |  | print "\n"; | 
| 6368 | 0 |  |  |  |  |  | exit 0; | 
| 6369 |  |  |  |  |  |  | } | 
| 6370 | 0 |  |  |  |  |  | print "No archived log files found\n\n"; | 
| 6371 | 0 |  |  |  |  |  | return 0; | 
| 6372 |  |  |  |  |  |  | } | 
| 6373 |  |  |  |  |  |  |  | 
| 6374 |  |  |  |  |  |  | sub _sys_disp_jobs { | 
| 6375 |  |  |  |  |  |  | =begin wiki | 
| 6376 |  |  |  |  |  |  |  | 
| 6377 |  |  |  |  |  |  | !3 _sys_disp_jobs | 
| 6378 |  |  |  |  |  |  |  | 
| 6379 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6380 |  |  |  |  |  |  |  | 
| 6381 |  |  |  |  |  |  | Please write this documentation. | 
| 6382 |  |  |  |  |  |  |  | 
| 6383 |  |  |  |  |  |  | Returns: | 
| 6384 |  |  |  |  |  |  |  | 
| 6385 |  |  |  |  |  |  | =cut | 
| 6386 | 0 |  |  | 0 |  |  | my @jobs = glob $path_bin_dir.'*.pl'; | 
| 6387 | 0 | 0 |  |  |  |  | if ( @jobs ) { | 
| 6388 | 0 |  |  |  |  |  | foreach my $job ( sort @jobs ) { | 
| 6389 | 0 |  |  |  |  |  | my $description = 'No description found'; | 
| 6390 | 0 | 0 |  |  |  |  | open my $fh, "<", $job or sys_die( "Unable to open $job", 0 ); | 
| 6391 | 0 |  |  |  |  |  | while ( <$fh> ) { | 
| 6392 | 0 |  |  |  |  |  | chomp; | 
| 6393 | 0 | 0 |  |  |  |  | if ( /^\#\#\$\$/ ) { | 
| 6394 | 0 |  |  |  |  |  | $description = substr $_, 4; | 
| 6395 |  |  |  |  |  |  | } | 
| 6396 |  |  |  |  |  |  | } | 
| 6397 | 0 |  |  |  |  |  | close $fh; | 
| 6398 | 0 |  |  |  |  |  | $job =~ s{^\/.*\/}{}; | 
| 6399 | 0 |  |  |  |  |  | print "Job: $job\n"; | 
| 6400 | 0 |  |  |  |  |  | print "     $description\n"; | 
| 6401 |  |  |  |  |  |  | } | 
| 6402 | 0 |  |  |  |  |  | print "\n"; | 
| 6403 | 0 |  |  |  |  |  | exit 0; | 
| 6404 |  |  |  |  |  |  | } | 
| 6405 | 0 |  |  |  |  |  | print "No archived job files found\n\n"; | 
| 6406 | 0 |  |  |  |  |  | return 0; | 
| 6407 |  |  |  |  |  |  | } | 
| 6408 |  |  |  |  |  |  |  | 
| 6409 |  |  |  |  |  |  | sub _sys_disp_active_jobs { | 
| 6410 |  |  |  |  |  |  | =begin wiki | 
| 6411 |  |  |  |  |  |  |  | 
| 6412 |  |  |  |  |  |  | !3 _sys_disp_active_jobs | 
| 6413 |  |  |  |  |  |  |  | 
| 6414 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6415 |  |  |  |  |  |  |  | 
| 6416 |  |  |  |  |  |  | Please write this documentation. | 
| 6417 |  |  |  |  |  |  |  | 
| 6418 |  |  |  |  |  |  | Returns: | 
| 6419 |  |  |  |  |  |  |  | 
| 6420 |  |  |  |  |  |  | =cut | 
| 6421 | 0 |  |  | 0 |  |  | my $logging = shift;  ## needs implementing | 
| 6422 |  |  |  |  |  |  |  | 
| 6423 | 0 |  |  |  |  |  | my @actjobs = glob $path_conf_dir.'/*.running'; | 
| 6424 | 0 |  |  |  |  |  | print 'Jobs currently active: ' . scalar @actjobs . "\n"; | 
| 6425 | 0 | 0 |  |  |  |  | if ( @actjobs ) { | 
| 6426 | 0 |  |  |  |  |  | foreach my $job ( sort @actjobs ) { | 
| 6427 | 0 |  |  |  |  |  | my $conf = new Config::IniFiles( -file => $job ); | 
| 6428 | 0 | 0 |  |  |  |  | unless ( defined $conf ) { sys_die( "Error opening $job" ); } | 
|  | 0 |  |  |  |  |  |  | 
| 6429 | 0 |  |  |  |  |  | my $pid = $conf->val( 'pid', 'pid' ); | 
| 6430 |  |  |  |  |  |  | ## NOTE: use Unix::PID to determine if pid is still runninng... | 
| 6431 |  |  |  |  |  |  | ## If pid is no longer running, replace "Job:" with "???:". | 
| 6432 | 0 |  |  |  |  |  | my $starttime = $conf->val( 'starttime', 'starttime' ); | 
| 6433 | 0 |  |  |  |  |  | my $fmtdtime = time2str( '%Y/%m/%d %T', $starttime ); | 
| 6434 | 0 |  |  |  |  |  | $job =~ s{^\/.*\/}{}; | 
| 6435 | 0 |  |  |  |  |  | $job =~ s{\.\d+\.running$}{}; | 
| 6436 | 0 |  |  |  |  |  | print "Job: $job\n"; | 
| 6437 | 0 |  |  |  |  |  | print "     pid=$pid\n"; | 
| 6438 | 0 |  |  |  |  |  | print "     starttime=$fmtdtime\n"; | 
| 6439 | 0 |  |  |  |  |  | $conf = undef; | 
| 6440 |  |  |  |  |  |  | } | 
| 6441 |  |  |  |  |  |  | } | 
| 6442 | 0 |  |  |  |  |  | print "\n"; | 
| 6443 | 0 |  |  |  |  |  | exit 0; | 
| 6444 |  |  |  |  |  |  | } | 
| 6445 |  |  |  |  |  |  |  | 
| 6446 |  |  |  |  |  |  | sub _sys_disp_doc { | 
| 6447 |  |  |  |  |  |  | =begin wiki | 
| 6448 |  |  |  |  |  |  |  | 
| 6449 |  |  |  |  |  |  | !3 _sys_disp_doc | 
| 6450 |  |  |  |  |  |  |  | 
| 6451 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6452 |  |  |  |  |  |  |  | 
| 6453 |  |  |  |  |  |  | Please write this documentation. | 
| 6454 |  |  |  |  |  |  |  | 
| 6455 |  |  |  |  |  |  | Returns: | 
| 6456 |  |  |  |  |  |  |  | 
| 6457 |  |  |  |  |  |  | =cut | 
| 6458 | 0 | 0 |  | 0 |  |  | if ( -e $script_filefull ) { | 
| 6459 | 0 |  |  |  |  |  | my %podparams = ( | 
| 6460 |  |  |  |  |  |  | infile  => $script_filefull, | 
| 6461 |  |  |  |  |  |  | outfile => "STDOUT", | 
| 6462 |  |  |  |  |  |  | ); | 
| 6463 | 0 |  |  |  |  |  | wikipod2text( %podparams ); | 
| 6464 |  |  |  |  |  |  | } else { | 
| 6465 | 0 |  |  |  |  |  | print "File not found $script_filefull\n\n"; | 
| 6466 |  |  |  |  |  |  | } | 
| 6467 | 0 |  |  |  |  |  | exit 0; | 
| 6468 |  |  |  |  |  |  | } | 
| 6469 |  |  |  |  |  |  |  | 
| 6470 |  |  |  |  |  |  | sub _sys_disp_sql { | 
| 6471 |  |  |  |  |  |  | =begin wiki | 
| 6472 |  |  |  |  |  |  |  | 
| 6473 |  |  |  |  |  |  | !3 _sys_disp_sql | 
| 6474 |  |  |  |  |  |  |  | 
| 6475 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6476 |  |  |  |  |  |  |  | 
| 6477 |  |  |  |  |  |  | Please write this documentation. | 
| 6478 |  |  |  |  |  |  |  | 
| 6479 |  |  |  |  |  |  | Returns: | 
| 6480 |  |  |  |  |  |  |  | 
| 6481 |  |  |  |  |  |  | =cut | 
| 6482 | 0 |  |  | 0 |  |  | my @query_names = keys %{$conf_query{$jobname}}; | 
|  | 0 |  |  |  |  |  |  | 
| 6483 | 0 | 0 |  |  |  |  | if ( @query_names ) { | 
| 6484 | 0 |  |  |  |  |  | foreach my $query_name ( sort @query_names ) { | 
| 6485 | 0 |  |  |  |  |  | my $query = $conf_query{$jobname}{$query_name}; | 
| 6486 | 0 |  |  |  |  |  | print "Query: $query_name\n"; | 
| 6487 | 0 |  |  |  |  |  | print $query; | 
| 6488 | 0 |  |  |  |  |  | print "\n\n"; | 
| 6489 |  |  |  |  |  |  | } | 
| 6490 |  |  |  |  |  |  | } else { | 
| 6491 | 0 |  |  |  |  |  | print "No querys found\n\n"; | 
| 6492 |  |  |  |  |  |  | } | 
| 6493 | 0 |  |  |  |  |  | exit 0; | 
| 6494 |  |  |  |  |  |  | } | 
| 6495 |  |  |  |  |  |  |  | 
| 6496 |  |  |  |  |  |  | sub _sys_disp_params { | 
| 6497 |  |  |  |  |  |  | =begin wiki | 
| 6498 |  |  |  |  |  |  |  | 
| 6499 |  |  |  |  |  |  | !3 _sys_disp_params | 
| 6500 |  |  |  |  |  |  |  | 
| 6501 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6502 |  |  |  |  |  |  |  | 
| 6503 |  |  |  |  |  |  | Please write this documentation. | 
| 6504 |  |  |  |  |  |  |  | 
| 6505 |  |  |  |  |  |  | Returns: | 
| 6506 |  |  |  |  |  |  |  | 
| 6507 |  |  |  |  |  |  | =cut | 
| 6508 | 0 |  |  | 0 |  |  | my $dblen = 0; | 
| 6509 | 0 |  |  |  |  |  | foreach my $db ( @databases ) { | 
| 6510 | 0 | 0 |  |  |  |  | if ( length $dbname{$db} > $dblen ) { $dblen = length $dbname{$db}; } | 
|  | 0 |  |  |  |  |  |  | 
| 6511 |  |  |  |  |  |  | } | 
| 6512 | 0 |  |  |  |  |  | print "\n" . uc($dataenvr) . " Database Connections:\n"; | 
| 6513 | 0 |  |  |  |  |  | foreach my $db ( @databases ) { | 
| 6514 | 0 |  |  |  |  |  | my $dbstr =  sprintf "%-${dblen}s", $dbname{$db}; | 
| 6515 | 0 |  |  |  |  |  | $dbstr .= ' = ' . $db . '/' . $dbdefenvr{$db}; | 
| 6516 | 0 |  |  |  |  |  | print "    $dbstr\n",; | 
| 6517 |  |  |  |  |  |  | } | 
| 6518 |  |  |  |  |  |  |  | 
| 6519 | 0 |  |  |  |  |  | print "\n" . uc($dataenvr) . " Job Settings:\n"; | 
| 6520 | 0 |  |  |  |  |  | print "    Job Name           = ", $jobname, "\n"; | 
| 6521 | 0 |  |  |  |  |  | print "    Log File           = ", $log_file, "\n"; | 
| 6522 | 0 |  |  |  |  |  | print "    Log Logging Levels = ", $log_logging_levels, "\n"; | 
| 6523 | 0 |  |  |  |  |  | print "    Log Console Levels = ", $log_console_levels, "\n"; | 
| 6524 | 0 |  |  |  |  |  | print "    Log Gdg            = ", $log_gdg, "\n"; | 
| 6525 | 0 |  |  |  |  |  | print "    Path Bin Dir       = ", $path_bin_dir, "\n"; | 
| 6526 | 0 |  |  |  |  |  | print "    Path Log Dir       = ", $path_log_dir, "\n"; | 
| 6527 | 0 |  |  |  |  |  | print "    Path Lib Dir       = ", $path_lib_dir, "\n"; | 
| 6528 | 0 |  |  |  |  |  | print "    Path Conf Dir      = ", $path_conf_dir, "\n"; | 
| 6529 | 0 |  |  |  |  |  | print "    Path Plugin Dir    = ", $path_plugin_dir, "\n"; | 
| 6530 | 0 |  |  |  |  |  | print "    Path Load Dir      = ", $path_load_dir, "\n"; | 
| 6531 | 0 |  |  |  |  |  | print "    path Extract Dir   = ", $path_extr_dir, "\n"; | 
| 6532 | 0 |  |  |  |  |  | print "    path Prev Dir      = ", $path_prev_dir, "\n"; | 
| 6533 | 0 |  |  |  |  |  | print "    path Scripts Dir   = ", $path_scripts_dir, "\n"; | 
| 6534 | 0 |  |  |  |  |  | print "    Mail Server        = ", $mail_server, "\n"; | 
| 6535 | 0 |  |  |  |  |  | print "    Mail Email From    = ", $mail_from, "\n"; | 
| 6536 | 0 |  |  |  |  |  | print "    Mail Email To      = ", $mail_emailto, "\n"; | 
| 6537 | 0 |  |  |  |  |  | print "    Mail Pager To      = ", $mail_pagerto, "\n"; | 
| 6538 | 0 |  |  |  |  |  | print "    Mail Email Levels  = ", $mail_email_levels, "\n"; | 
| 6539 | 0 |  |  |  |  |  | print "    Mail Pager Levels  = ", $mail_pager_levels, "\n"; | 
| 6540 | 0 |  |  |  |  |  | print "\n"; | 
| 6541 | 0 |  |  |  |  |  | exit 0; | 
| 6542 |  |  |  |  |  |  | } | 
| 6543 |  |  |  |  |  |  |  | 
| 6544 |  |  |  |  |  |  | sub _sys_send_email_message { | 
| 6545 |  |  |  |  |  |  | =begin wiki | 
| 6546 |  |  |  |  |  |  |  | 
| 6547 |  |  |  |  |  |  | !3 _sys_send_email_message | 
| 6548 |  |  |  |  |  |  |  | 
| 6549 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6550 |  |  |  |  |  |  |  | 
| 6551 |  |  |  |  |  |  | Please write this documentation. | 
| 6552 |  |  |  |  |  |  |  | 
| 6553 |  |  |  |  |  |  | Returns: | 
| 6554 |  |  |  |  |  |  |  | 
| 6555 |  |  |  |  |  |  | =cut | 
| 6556 | 0 |  |  | 0 |  |  | my $params = shift; | 
| 6557 | 0 |  |  |  |  |  | my ($addrlist, $message) = split m/~/, $params; | 
| 6558 | 0 |  |  |  |  |  | $mail_emailto = $addrlist; | 
| 6559 | 0 |  |  |  |  |  | _log_send_mail($message, 'MESSAGE'); | 
| 6560 | 0 |  |  |  |  |  | exit 0; | 
| 6561 |  |  |  |  |  |  | } | 
| 6562 |  |  |  |  |  |  |  | 
| 6563 |  |  |  |  |  |  | sub _sys_send_pager_message { | 
| 6564 |  |  |  |  |  |  | =begin wiki | 
| 6565 |  |  |  |  |  |  |  | 
| 6566 |  |  |  |  |  |  | !3 _sys_send_pager_message | 
| 6567 |  |  |  |  |  |  |  | 
| 6568 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6569 |  |  |  |  |  |  |  | 
| 6570 |  |  |  |  |  |  | Please write this documentation. | 
| 6571 |  |  |  |  |  |  |  | 
| 6572 |  |  |  |  |  |  | Returns: | 
| 6573 |  |  |  |  |  |  |  | 
| 6574 |  |  |  |  |  |  | =cut | 
| 6575 | 0 |  |  | 0 |  |  | my $params = shift; | 
| 6576 | 0 |  |  |  |  |  | my ($addrlist, $message) = split m/~/, $params; | 
| 6577 | 0 |  |  |  |  |  | $mail_pagerto = $addrlist; | 
| 6578 | 0 |  |  |  |  |  | _log_send_page($message, 'MESSAGE'); | 
| 6579 | 0 |  |  |  |  |  | exit 0; | 
| 6580 |  |  |  |  |  |  | } | 
| 6581 |  |  |  |  |  |  |  | 
| 6582 |  |  |  |  |  |  | sub _sys_help { | 
| 6583 |  |  |  |  |  |  | =begin wiki | 
| 6584 |  |  |  |  |  |  |  | 
| 6585 |  |  |  |  |  |  | !3 _sys_help | 
| 6586 |  |  |  |  |  |  |  | 
| 6587 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6588 |  |  |  |  |  |  |  | 
| 6589 |  |  |  |  |  |  | Please write this documentation. | 
| 6590 |  |  |  |  |  |  |  | 
| 6591 |  |  |  |  |  |  | Returns: | 
| 6592 |  |  |  |  |  |  |  | 
| 6593 |  |  |  |  |  |  | =cut | 
| 6594 | 0 |  |  | 0 |  |  | my $verbose = shift; | 
| 6595 | 0 | 0 |  |  |  |  | $verbose = 0 unless $verbose; | 
| 6596 | 0 |  |  |  |  |  | my $section; | 
| 6597 |  |  |  |  |  |  |  | 
| 6598 | 0 | 0 |  |  |  |  | if ( $verbose == 0 ) { | 
| 6599 | 0 |  |  |  |  |  | print "\nUSAGE\n      $script_file [options]\n\n"; | 
| 6600 | 0 |  |  |  |  |  | print "Use option -h   for help with options\n"; | 
| 6601 | 0 |  |  |  |  |  | print "Use option -hp  for help with option parameters\n"; | 
| 6602 | 0 |  |  |  |  |  | print "Use option -man for system documentation\n"; | 
| 6603 | 0 |  |  |  |  |  | exit 1; | 
| 6604 |  |  |  |  |  |  | } | 
| 6605 |  |  |  |  |  |  |  | 
| 6606 | 0 | 0 |  |  |  |  | if ( $verbose == 1 ) { $section = 'OPTIONS'; }; | 
|  | 0 |  |  |  |  |  |  | 
| 6607 | 0 | 0 |  |  |  |  | if ( $verbose == 2 ) { $section = 'ARGUMENTS'; }; | 
|  | 0 |  |  |  |  |  |  | 
| 6608 |  |  |  |  |  |  |  | 
| 6609 | 0 |  |  |  |  |  | print "\n"; | 
| 6610 | 0 |  |  |  |  |  | my %podparams = ( | 
| 6611 |  |  |  |  |  |  | infile  => $path_lib_dir."DBIx/JCL.pm", | 
| 6612 |  |  |  |  |  |  | outfile => "STDOUT", | 
| 6613 |  |  |  |  |  |  | section => $section, | 
| 6614 |  |  |  |  |  |  | ); | 
| 6615 | 0 |  |  |  |  |  | wikipod2text( %podparams ); | 
| 6616 | 0 |  |  |  |  |  | exit 1; | 
| 6617 |  |  |  |  |  |  | } | 
| 6618 |  |  |  |  |  |  |  | 
| 6619 |  |  |  |  |  |  | sub _log_init_log_file { | 
| 6620 |  |  |  |  |  |  | =begin wiki | 
| 6621 |  |  |  |  |  |  |  | 
| 6622 |  |  |  |  |  |  | !3 _log_init_log_file | 
| 6623 |  |  |  |  |  |  |  | 
| 6624 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6625 |  |  |  |  |  |  |  | 
| 6626 |  |  |  |  |  |  | Please write this documentation. | 
| 6627 |  |  |  |  |  |  |  | 
| 6628 |  |  |  |  |  |  | Returns: | 
| 6629 |  |  |  |  |  |  |  | 
| 6630 |  |  |  |  |  |  | =cut | 
| 6631 |  |  |  |  |  |  | ## log file rotation if generations > 0 | 
| 6632 | 0 | 0 | 0 | 0 |  |  | if ( -e $log_filefull && $log_gdg > 0 ) { | 
| 6633 | 0 |  |  |  |  |  | _log_rotate(); | 
| 6634 |  |  |  |  |  |  | } | 
| 6635 |  |  |  |  |  |  |  | 
| 6636 |  |  |  |  |  |  | ## create new locked log file | 
| 6637 |  |  |  |  |  |  | ## if the file is already locked, will wait until the file is unlocked | 
| 6638 | 0 | 0 |  |  |  |  | my $fh = new IO::LockedFile(">$log_filefull") | 
| 6639 |  |  |  |  |  |  | or sys_die( 'Failed opening log file', 0 ); | 
| 6640 |  |  |  |  |  |  | ## close and unlock the file | 
| 6641 | 0 |  |  |  |  |  | $fh->close(); | 
| 6642 |  |  |  |  |  |  |  | 
| 6643 | 0 |  |  |  |  |  | $sys_log_open = 1; | 
| 6644 |  |  |  |  |  |  |  | 
| 6645 | 0 |  |  |  |  |  | return 0; | 
| 6646 |  |  |  |  |  |  | } | 
| 6647 |  |  |  |  |  |  |  | 
| 6648 |  |  |  |  |  |  | sub _log_write_to_log { | 
| 6649 |  |  |  |  |  |  | =begin wiki | 
| 6650 |  |  |  |  |  |  |  | 
| 6651 |  |  |  |  |  |  | !3 _log_write_to_log | 
| 6652 |  |  |  |  |  |  |  | 
| 6653 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6654 |  |  |  |  |  |  |  | 
| 6655 |  |  |  |  |  |  | Please write this documentation. | 
| 6656 |  |  |  |  |  |  |  | 
| 6657 |  |  |  |  |  |  | Returns: | 
| 6658 |  |  |  |  |  |  |  | 
| 6659 |  |  |  |  |  |  | =cut | 
| 6660 | 0 |  |  | 0 |  |  | my ($level, $force, $msg, $exmsg) = @_; | 
| 6661 | 0 |  |  |  |  |  | my ($message,$exmessage); | 
| 6662 |  |  |  |  |  |  |  | 
| 6663 | 0 | 0 |  |  |  |  | if ( ref $exmsg eq 'ARRAY' ) { | 
| 6664 | 0 |  |  |  |  |  | my $lead = ' ' x 18; | 
| 6665 | 0 |  |  |  |  |  | $lead .= '+ '; | 
| 6666 | 0 |  |  |  |  |  | my @output = map { $lead . $_ . "\n" } @{$exmsg}; | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
| 6667 | 0 |  |  |  |  |  | my $exmessage = join '', @output; | 
| 6668 | 0 |  |  |  |  |  | $exmessage =~ s/\n$//ms; | 
| 6669 | 0 |  |  |  |  |  | $message = $msg . "\n" . $exmessage; | 
| 6670 |  |  |  |  |  |  | } else { | 
| 6671 | 0 |  |  |  |  |  | $message = $msg; | 
| 6672 | 0 |  |  |  |  |  | $message =~ s/\n/ /g; | 
| 6673 |  |  |  |  |  |  | } | 
| 6674 |  |  |  |  |  |  |  | 
| 6675 | 0 | 0 | 0 |  |  |  | if ( $log_logging_levels =~ /$level/ || $force ) { | 
| 6676 | 0 |  |  |  |  |  | _log_print_log( $level, $message ); | 
| 6677 |  |  |  |  |  |  | } | 
| 6678 |  |  |  |  |  |  |  | 
| 6679 | 0 |  |  |  |  |  | _log_send_notifications( $level, $force, $msg ); | 
| 6680 |  |  |  |  |  |  |  | 
| 6681 | 0 |  |  |  |  |  | return 0; | 
| 6682 |  |  |  |  |  |  | } | 
| 6683 |  |  |  |  |  |  |  | 
| 6684 |  |  |  |  |  |  | sub _log_write_to_screen { | 
| 6685 |  |  |  |  |  |  | =begin wiki | 
| 6686 |  |  |  |  |  |  |  | 
| 6687 |  |  |  |  |  |  | !3 _log_write_to_screen | 
| 6688 |  |  |  |  |  |  |  | 
| 6689 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6690 |  |  |  |  |  |  |  | 
| 6691 |  |  |  |  |  |  | Please write this documentation. | 
| 6692 |  |  |  |  |  |  |  | 
| 6693 |  |  |  |  |  |  | Returns: | 
| 6694 |  |  |  |  |  |  |  | 
| 6695 |  |  |  |  |  |  | =cut | 
| 6696 | 0 |  |  | 0 |  |  | my ($level, $force, $msg, $exmsg) = @_; | 
| 6697 | 0 |  |  |  |  |  | my ($message,$exmessage); | 
| 6698 |  |  |  |  |  |  |  | 
| 6699 | 0 | 0 |  |  |  |  | if ( ref $exmsg eq 'ARRAY' ) { | 
| 6700 | 0 |  |  |  |  |  | my $lead = ' ' x 18; | 
| 6701 | 0 |  |  |  |  |  | $lead .= '+ '; | 
| 6702 | 0 |  |  |  |  |  | my @output = map { $lead . $_ . "\n" } @{$exmsg}; | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
| 6703 | 0 |  |  |  |  |  | my $exmessage = join '', @output; | 
| 6704 | 0 |  |  |  |  |  | $message = $msg . "\n" . $exmessage; | 
| 6705 |  |  |  |  |  |  | } else { | 
| 6706 | 0 |  |  |  |  |  | $message = $msg; | 
| 6707 | 0 |  |  |  |  |  | $message =~ s/\n/ /g; | 
| 6708 |  |  |  |  |  |  | } | 
| 6709 |  |  |  |  |  |  |  | 
| 6710 | 0 |  |  |  |  |  | $message = _log_trim_msg( $message ); | 
| 6711 |  |  |  |  |  |  |  | 
| 6712 | 0 | 0 |  |  |  |  | if ( $opt_verbose ) { | 
| 6713 | 0 |  |  |  |  |  | print "$message\n"; | 
| 6714 |  |  |  |  |  |  | } else { | 
| 6715 | 0 | 0 | 0 |  |  |  | if ( $log_console_levels =~ /$level/ || $force ) { | 
| 6716 | 0 |  |  |  |  |  | print "$message\n"; | 
| 6717 |  |  |  |  |  |  | } | 
| 6718 |  |  |  |  |  |  | } | 
| 6719 |  |  |  |  |  |  |  | 
| 6720 | 0 |  |  |  |  |  | return 0; | 
| 6721 |  |  |  |  |  |  | } | 
| 6722 |  |  |  |  |  |  |  | 
| 6723 |  |  |  |  |  |  | sub _log_print_log { | 
| 6724 |  |  |  |  |  |  | =begin wiki | 
| 6725 |  |  |  |  |  |  |  | 
| 6726 |  |  |  |  |  |  | !3 _log_print_log | 
| 6727 |  |  |  |  |  |  |  | 
| 6728 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6729 |  |  |  |  |  |  |  | 
| 6730 |  |  |  |  |  |  | Please write this documentation. | 
| 6731 |  |  |  |  |  |  |  | 
| 6732 |  |  |  |  |  |  | Returns: | 
| 6733 |  |  |  |  |  |  |  | 
| 6734 |  |  |  |  |  |  | =cut | 
| 6735 | 0 |  |  | 0 |  |  | my ($level, $message) = @_; | 
| 6736 |  |  |  |  |  |  |  | 
| 6737 | 0 |  |  |  |  |  | my $preamble = time2str( '%Y/%m/%d %T', time ); | 
| 6738 | 0 | 0 |  |  |  |  | if ( $level eq 'FATAL' ) { $preamble .= ' FATAL'; } | 
|  | 0 |  |  |  |  |  |  | 
| 6739 | 0 | 0 |  |  |  |  | if ( $level eq 'ERROR' ) { $preamble .= ' ERROR'; } | 
|  | 0 |  |  |  |  |  |  | 
| 6740 | 0 | 0 |  |  |  |  | if ( $level eq 'WARN'  ) { $preamble .= ' WARNING'; } | 
|  | 0 |  |  |  |  |  |  | 
| 6741 |  |  |  |  |  |  |  | 
| 6742 |  |  |  |  |  |  | ## open locked log file for appending | 
| 6743 |  |  |  |  |  |  | ## if the file is already locked, will wait until the file is unlocked | 
| 6744 | 0 | 0 |  |  |  |  | my $fh = new IO::LockedFile(">>$log_filefull") | 
| 6745 |  |  |  |  |  |  | or sys_die( 'Failed opening log file', 0 ); | 
| 6746 | 0 |  |  |  |  |  | print {$fh} "$preamble $message\n"; | 
|  | 0 |  |  |  |  |  |  | 
| 6747 |  |  |  |  |  |  | ## close and unlock the file | 
| 6748 | 0 |  |  |  |  |  | $fh->close(); | 
| 6749 | 0 |  |  |  |  |  | return 0; | 
| 6750 |  |  |  |  |  |  | } | 
| 6751 |  |  |  |  |  |  |  | 
| 6752 |  |  |  |  |  |  | sub _log_trim_msg { | 
| 6753 |  |  |  |  |  |  | =begin wiki | 
| 6754 |  |  |  |  |  |  |  | 
| 6755 |  |  |  |  |  |  | !3 _log_trim_msg | 
| 6756 |  |  |  |  |  |  |  | 
| 6757 |  |  |  |  |  |  | Parameters: ( message ) | 
| 6758 |  |  |  |  |  |  |  | 
| 6759 |  |  |  |  |  |  | Format log file text so that it looks good when printed to STDOUT.  This \ | 
| 6760 |  |  |  |  |  |  | function is only called from the logging functions. This takes message \ | 
| 6761 |  |  |  |  |  |  | text that was previously retrieved by dbms_output_get and stringified by \ | 
| 6762 |  |  |  |  |  |  | a logging function and removes the leading whitespace from each line of \ | 
| 6763 |  |  |  |  |  |  | text, if there is any. This is made necessary due to the fact that this \ | 
| 6764 |  |  |  |  |  |  | text started life as an array of lines retrieved from dbms_output_get(), \ | 
| 6765 |  |  |  |  |  |  | and each of these lines had leading whitespace to make them more readable \ | 
| 6766 |  |  |  |  |  |  | in the log file. | 
| 6767 |  |  |  |  |  |  |  | 
| 6768 |  |  |  |  |  |  | Returns: | 
| 6769 |  |  |  |  |  |  |  | 
| 6770 |  |  |  |  |  |  | =cut | 
| 6771 | 0 |  |  | 0 |  |  | my $msg = shift; | 
| 6772 | 0 |  |  |  |  |  | my $trimmed = ''; | 
| 6773 | 0 | 0 |  |  |  |  | if ( $msg =~ /\n/ms ) {   ## trim leading spaces from multi-line messages | 
| 6774 | 0 |  |  |  |  |  | foreach my $m ( split m/\n/, $msg ) { | 
| 6775 | 0 |  |  |  |  |  | $m =~ s/^\s+//; | 
| 6776 | 0 |  |  |  |  |  | $trimmed .= $m."\n"; | 
| 6777 |  |  |  |  |  |  | } | 
| 6778 | 0 |  |  |  |  |  | $trimmed =~ s/\n$//ms; | 
| 6779 |  |  |  |  |  |  | } else { | 
| 6780 | 0 |  |  |  |  |  | $trimmed = $msg; | 
| 6781 |  |  |  |  |  |  | } | 
| 6782 | 0 |  |  |  |  |  | return $trimmed; | 
| 6783 |  |  |  |  |  |  | } | 
| 6784 |  |  |  |  |  |  |  | 
| 6785 |  |  |  |  |  |  | sub _log_send_notifications { | 
| 6786 |  |  |  |  |  |  | =begin wiki | 
| 6787 |  |  |  |  |  |  |  | 
| 6788 |  |  |  |  |  |  | !3 _log_send_notifications | 
| 6789 |  |  |  |  |  |  |  | 
| 6790 |  |  |  |  |  |  | Parameters: ( message, severity_level ) | 
| 6791 |  |  |  |  |  |  |  | 
| 6792 |  |  |  |  |  |  | Send email and pager notifications based on supplied severity. If the \ | 
| 6793 |  |  |  |  |  |  | severity levels for email and or pager notifications are at or below the \ | 
| 6794 |  |  |  |  |  |  | severity level supplied to this function, a notification will be sent. | 
| 6795 |  |  |  |  |  |  |  | 
| 6796 |  |  |  |  |  |  | Note: if running under test harness (different than test mode), all \ | 
| 6797 |  |  |  |  |  |  | messages are logged, but no notifications of any severity will be generated. \ | 
| 6798 |  |  |  |  |  |  | Generation of actual email and pager notices is not testable using the test \ | 
| 6799 |  |  |  |  |  |  | harness. | 
| 6800 |  |  |  |  |  |  |  | 
| 6801 |  |  |  |  |  |  | Returns: | 
| 6802 |  |  |  |  |  |  |  | 
| 6803 |  |  |  |  |  |  | =cut | 
| 6804 | 0 |  |  | 0 |  |  | my ($level, $force, $message) = @_; | 
| 6805 |  |  |  |  |  |  |  | 
| 6806 |  |  |  |  |  |  | #    if ( $tst_harness ) { | 
| 6807 |  |  |  |  |  |  | #        return 0; | 
| 6808 |  |  |  |  |  |  | #    } | 
| 6809 |  |  |  |  |  |  |  | 
| 6810 | 0 | 0 | 0 |  |  |  | if ( $mail_email_levels =~ /$level/ || $force ) { | 
| 6811 | 0 |  |  |  |  |  | _log_send_mail( $message, $level ); | 
| 6812 |  |  |  |  |  |  | } | 
| 6813 | 0 | 0 | 0 |  |  |  | if ( $mail_pager_levels =~ /$level/ || $force ) { | 
| 6814 | 0 |  |  |  |  |  | _log_send_page( $message, $level ); | 
| 6815 |  |  |  |  |  |  | } | 
| 6816 | 0 |  |  |  |  |  | return 0; | 
| 6817 |  |  |  |  |  |  | } | 
| 6818 |  |  |  |  |  |  |  | 
| 6819 |  |  |  |  |  |  | sub _log_send_mail { | 
| 6820 |  |  |  |  |  |  | =begin wiki | 
| 6821 |  |  |  |  |  |  |  | 
| 6822 |  |  |  |  |  |  | !3 _log_send_mail | 
| 6823 |  |  |  |  |  |  |  | 
| 6824 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6825 |  |  |  |  |  |  |  | 
| 6826 |  |  |  |  |  |  | Please write this documentation. | 
| 6827 |  |  |  |  |  |  |  | 
| 6828 |  |  |  |  |  |  | Returns: | 
| 6829 |  |  |  |  |  |  |  | 
| 6830 |  |  |  |  |  |  | =cut | 
| 6831 | 0 |  |  | 0 |  |  | my ($message, $severity) = @_; | 
| 6832 | 0 | 0 |  |  |  |  | return 0 unless $mail_emailto; | 
| 6833 | 0 | 0 |  |  |  |  | return 0 if $mail_emailto =~ /NONE/i; | 
| 6834 |  |  |  |  |  |  |  | 
| 6835 | 0 |  |  |  |  |  | my ($subject, $job); | 
| 6836 |  |  |  |  |  |  |  | 
| 6837 | 0 | 0 |  |  |  |  | if ( $severity eq 'MESSAGE' ) { | 
| 6838 | 0 |  |  |  |  |  | $subject = 'Message from ' . uc $dataenvr; | 
| 6839 |  |  |  |  |  |  | } else { | 
| 6840 | 0 |  |  |  |  |  | $subject = uc($dataenvr). ' Batch Notice'; | 
| 6841 | 0 |  |  |  |  |  | $message = time2str("%Y/%m/%d %H:%M:%S : ", time) . uc($severity) . " : $script_file : $message"; | 
| 6842 |  |  |  |  |  |  | } | 
| 6843 |  |  |  |  |  |  |  | 
| 6844 |  |  |  |  |  |  | ## get the log file contents and append to message | 
| 6845 | 0 | 0 |  |  |  |  | if ( ! $severity eq 'MESSAGE' ) { | 
| 6846 | 0 | 0 |  |  |  |  | if ( -e $log_filefull ) { | 
| 6847 | 0 |  |  |  |  |  | $message .= "\nLog Entries:\n"; | 
| 6848 | 0 |  |  |  |  |  | open my $fh, "<", $log_filefull; | 
| 6849 | 0 |  |  |  |  |  | while ( <$fh> ) { | 
| 6850 | 0 |  |  |  |  |  | $message .= $_; | 
| 6851 |  |  |  |  |  |  | } | 
| 6852 | 0 |  |  |  |  |  | close $fh; | 
| 6853 |  |  |  |  |  |  | } | 
| 6854 |  |  |  |  |  |  | } | 
| 6855 |  |  |  |  |  |  |  | 
| 6856 | 0 |  |  |  |  |  | MIME::Lite->send('smtp', $mail_server, Timeout => 60); | 
| 6857 |  |  |  |  |  |  |  | 
| 6858 | 0 |  |  |  |  |  | my $msg = MIME::Lite->new( | 
| 6859 |  |  |  |  |  |  | From     => $mail_from, | 
| 6860 |  |  |  |  |  |  | To       => $mail_emailto, | 
| 6861 |  |  |  |  |  |  | Subject  => $subject, | 
| 6862 |  |  |  |  |  |  | Data     => $message | 
| 6863 |  |  |  |  |  |  | ); | 
| 6864 | 0 |  |  |  |  |  | $msg->send; | 
| 6865 | 0 |  |  |  |  |  | return 0; | 
| 6866 |  |  |  |  |  |  | } | 
| 6867 |  |  |  |  |  |  |  | 
| 6868 |  |  |  |  |  |  | sub _log_send_page { | 
| 6869 |  |  |  |  |  |  | =begin wiki | 
| 6870 |  |  |  |  |  |  |  | 
| 6871 |  |  |  |  |  |  | !3 _log_send_page | 
| 6872 |  |  |  |  |  |  |  | 
| 6873 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6874 |  |  |  |  |  |  |  | 
| 6875 |  |  |  |  |  |  | Please write this documentation. | 
| 6876 |  |  |  |  |  |  |  | 
| 6877 |  |  |  |  |  |  | Returns: | 
| 6878 |  |  |  |  |  |  |  | 
| 6879 |  |  |  |  |  |  | =cut | 
| 6880 | 0 |  |  | 0 |  |  | my ($message, $severity) = @_; | 
| 6881 | 0 | 0 |  |  |  |  | return 0 unless $mail_pagerto; | 
| 6882 | 0 | 0 |  |  |  |  | return 0 if $mail_pagerto =~ /NONE/i; | 
| 6883 |  |  |  |  |  |  |  | 
| 6884 | 0 |  |  |  |  |  | my ($subject, $job); | 
| 6885 |  |  |  |  |  |  |  | 
| 6886 | 0 | 0 |  |  |  |  | if ( $severity eq 'MESSAGE' ) { | 
| 6887 | 0 |  |  |  |  |  | $subject = 'Message from ' . uc $dataenvr; | 
| 6888 |  |  |  |  |  |  | } else { | 
| 6889 | 0 |  |  |  |  |  | my $subject = uc($dataenvr). ' Batch Notice'; | 
| 6890 | 0 |  |  |  |  |  | $message = time2str("%Y/%m/%d %H:%M:%S : ", time) . uc($severity) . " : $script_file : $message"; | 
| 6891 |  |  |  |  |  |  | } | 
| 6892 |  |  |  |  |  |  |  | 
| 6893 | 0 |  |  |  |  |  | MIME::Lite->send('smtp', $mail_server, Timeout => 60); | 
| 6894 |  |  |  |  |  |  |  | 
| 6895 | 0 |  |  |  |  |  | my $msg = MIME::Lite->new( | 
| 6896 |  |  |  |  |  |  | From     => $mail_from, | 
| 6897 |  |  |  |  |  |  | To       => $mail_pagerto, | 
| 6898 |  |  |  |  |  |  | Subject  => $subject, | 
| 6899 |  |  |  |  |  |  | Data     => $message | 
| 6900 |  |  |  |  |  |  | ); | 
| 6901 | 0 |  |  |  |  |  | $msg->send; | 
| 6902 | 0 |  |  |  |  |  | return 0; | 
| 6903 |  |  |  |  |  |  | } | 
| 6904 |  |  |  |  |  |  |  | 
| 6905 |  |  |  |  |  |  | sub _log_rotate { | 
| 6906 |  |  |  |  |  |  | =begin wiki | 
| 6907 |  |  |  |  |  |  |  | 
| 6908 |  |  |  |  |  |  | !3 _log_rotate | 
| 6909 |  |  |  |  |  |  |  | 
| 6910 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6911 |  |  |  |  |  |  |  | 
| 6912 |  |  |  |  |  |  | Please write this documentation. | 
| 6913 |  |  |  |  |  |  |  | 
| 6914 |  |  |  |  |  |  | Returns: | 
| 6915 |  |  |  |  |  |  |  | 
| 6916 |  |  |  |  |  |  | =cut | 
| 6917 | 0 |  |  | 0 |  |  | my ($prev,$next,$i,$j); | 
| 6918 |  |  |  |  |  |  |  | 
| 6919 | 0 |  |  |  |  |  | my $curr = $log_filefull; | 
| 6920 | 0 |  |  |  |  |  | my $currn = $curr; | 
| 6921 |  |  |  |  |  |  |  | 
| 6922 | 0 |  |  |  |  |  | for ($i = $log_gdg; $i > 1; $i--) { | 
| 6923 | 0 |  |  |  |  |  | $j = $i - 1; | 
| 6924 | 0 |  |  |  |  |  | my $nextgen = sprintf("%0${log_radix}d", $i); | 
| 6925 | 0 |  |  |  |  |  | my $prevgen = sprintf("%0${log_radix}d", $j); | 
| 6926 | 0 |  |  |  |  |  | $next = "${currn}." . $nextgen; ##. $ext; | 
| 6927 | 0 |  |  |  |  |  | $prev = "${currn}." . $prevgen; ##. $ext; | 
| 6928 | 0 | 0 | 0 |  |  |  | if ( -r $prev && -f $prev ) { | 
| 6929 | 0 | 0 |  |  |  |  | move($prev,$next) or sys_die( "Log move failed: ($prev,$next)" ); | 
| 6930 |  |  |  |  |  |  | } | 
| 6931 |  |  |  |  |  |  | } | 
| 6932 |  |  |  |  |  |  |  | 
| 6933 |  |  |  |  |  |  | ## copy current to next incremental | 
| 6934 | 0 |  |  |  |  |  | my $nextgen = sprintf("%0${log_radix}d", 1); | 
| 6935 | 0 |  |  |  |  |  | $next = "${currn}." . $nextgen; | 
| 6936 | 0 |  |  |  |  |  | copy($curr, $next); | 
| 6937 |  |  |  |  |  |  |  | 
| 6938 |  |  |  |  |  |  | ## preserve permissions and status | 
| 6939 | 0 |  |  |  |  |  | my @stat = stat $curr; | 
| 6940 | 0 | 0 |  |  |  |  | chmod( $stat[2], $next )           or sys_warn( "log chmod failed: ($next)" ); | 
| 6941 | 0 | 0 |  |  |  |  | utime( $stat[8], $stat[9], $next ) or sys_warn( "log utime failed: ($next)" ); | 
| 6942 | 0 | 0 |  |  |  |  | chown( $stat[4], $stat[5], $next ) or sys_warn( "log chown failed: ($next)" ); | 
| 6943 |  |  |  |  |  |  |  | 
| 6944 |  |  |  |  |  |  | ## now truncate the file | 
| 6945 | 0 | 0 |  |  |  |  | truncate $curr, 0 or sys_die( "Could not truncate $curr" ); | 
| 6946 |  |  |  |  |  |  |  | 
| 6947 | 0 |  |  |  |  |  | return 0; | 
| 6948 |  |  |  |  |  |  | } | 
| 6949 |  |  |  |  |  |  |  | 
| 6950 |  |  |  |  |  |  | sub _db_connect_check_dependent { | 
| 6951 |  |  |  |  |  |  | =begin wiki | 
| 6952 |  |  |  |  |  |  |  | 
| 6953 |  |  |  |  |  |  | !3 _db_connect_check_dependent | 
| 6954 |  |  |  |  |  |  |  | 
| 6955 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6956 |  |  |  |  |  |  |  | 
| 6957 |  |  |  |  |  |  | Please write this documentation. | 
| 6958 |  |  |  |  |  |  |  | 
| 6959 |  |  |  |  |  |  | Returns: | 
| 6960 |  |  |  |  |  |  |  | 
| 6961 |  |  |  |  |  |  | =cut | 
| 6962 | 0 |  |  | 0 |  |  | my ($dependent_jobname,$wait_duration,$wait_max_secs,$wait_action) = @_; | 
| 6963 | 0 |  |  |  |  |  | my $starttime = time; | 
| 6964 | 0 |  |  |  |  |  | while ( 1 ) { | 
| 6965 | 0 | 0 |  |  |  |  | if ( _sys_job_dependent($dependent_jobname) ) { | 
| 6966 | 0 |  |  |  |  |  | sleep $wait_duration; | 
| 6967 | 0 |  |  |  |  |  | my $curtime = time; | 
| 6968 | 0 | 0 |  |  |  |  | if ( $curtime - $starttime > $wait_max_secs ) { | 
| 6969 | 0 | 0 |  |  |  |  | if ( $wait_action =~ m/^run$/ix ) { | 
| 6970 | 0 |  |  |  |  |  | log_info( "Maximum dependent job wait time exceeded, starting" ); | 
| 6971 | 0 |  |  |  |  |  | last; | 
| 6972 |  |  |  |  |  |  | } else { | 
| 6973 | 0 |  |  |  |  |  | sys_die( "Maximum dependent job wait time exceeded, aborting" ); | 
| 6974 | 0 |  |  |  |  |  | return 1;   ## reachable if $sys_test_harness | 
| 6975 |  |  |  |  |  |  | } | 
| 6976 |  |  |  |  |  |  | } | 
| 6977 |  |  |  |  |  |  | } else { | 
| 6978 | 0 |  |  |  |  |  | last; | 
| 6979 |  |  |  |  |  |  | } | 
| 6980 |  |  |  |  |  |  | } | 
| 6981 | 0 |  |  |  |  |  | return 0; | 
| 6982 |  |  |  |  |  |  | } | 
| 6983 |  |  |  |  |  |  |  | 
| 6984 |  |  |  |  |  |  | sub _db_connect_retry { | 
| 6985 |  |  |  |  |  |  | =begin wiki | 
| 6986 |  |  |  |  |  |  |  | 
| 6987 |  |  |  |  |  |  | !3 _db_connect_retry | 
| 6988 |  |  |  |  |  |  |  | 
| 6989 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 6990 |  |  |  |  |  |  |  | 
| 6991 |  |  |  |  |  |  | Please write this documentation. | 
| 6992 |  |  |  |  |  |  |  | 
| 6993 |  |  |  |  |  |  | Returns: | 
| 6994 |  |  |  |  |  |  |  | 
| 6995 |  |  |  |  |  |  | =cut | 
| 6996 | 0 |  |  | 0 |  |  | my ($db,$un,$pw,$retry_duration,$retry_max_secs) = @_; | 
| 6997 | 0 |  |  |  |  |  | my $dbh = 0; | 
| 6998 | 0 |  |  |  |  |  | my $starttime = time; | 
| 6999 | 0 |  |  |  |  |  | while ( 1 ) { | 
| 7000 | 0 |  |  |  |  |  | $dbh = DBI->connect( $db, $un, $pw, { RaiseError => 0, AutoCommit => 0 } ); | 
| 7001 | 0 | 0 |  |  |  |  | if ( DBI->errstr ) { | 
| 7002 | 0 | 0 |  |  |  |  | if ( $retry_max_secs < 1 ) { | 
| 7003 | 0 |  |  |  |  |  | sys_die( DBI->errstr ); | 
| 7004 | 0 |  |  |  |  |  | return 1;   ## reachable if $sys_test_harness | 
| 7005 |  |  |  |  |  |  | } | 
| 7006 | 0 | 0 |  |  |  |  | if ( DBI->err == 1017 ) {   ## ora invalid account or password | 
| 7007 | 0 |  |  |  |  |  | sys_die( DBI->errstr ); | 
| 7008 | 0 |  |  |  |  |  | return 1;   ## reachable if $sys_test_harness | 
| 7009 |  |  |  |  |  |  | } | 
| 7010 | 0 |  |  |  |  |  | log_info( DBI->errstr ); | 
| 7011 | 0 |  |  |  |  |  | log_info( "Connection retry requested, waiting" ); | 
| 7012 | 0 |  |  |  |  |  | sleep $retry_duration; | 
| 7013 | 0 |  |  |  |  |  | my $curtime = time; | 
| 7014 | 0 | 0 |  |  |  |  | if ( $curtime - $starttime > $retry_max_secs ) { | 
| 7015 | 0 |  |  |  |  |  | sys_die( "Maximum connection retry time exceeded, aborting" ); | 
| 7016 | 0 |  |  |  |  |  | return 1;   ## reachable if $sys_test_harness | 
| 7017 |  |  |  |  |  |  | } | 
| 7018 |  |  |  |  |  |  | } else { | 
| 7019 | 0 |  |  |  |  |  | last; | 
| 7020 |  |  |  |  |  |  | } | 
| 7021 |  |  |  |  |  |  | } | 
| 7022 | 0 |  |  |  |  |  | return $dbh; | 
| 7023 |  |  |  |  |  |  | } | 
| 7024 |  |  |  |  |  |  |  | 
| 7025 |  |  |  |  |  |  | sub _db_vdn { | 
| 7026 |  |  |  |  |  |  | =begin wiki | 
| 7027 |  |  |  |  |  |  |  | 
| 7028 |  |  |  |  |  |  | !3 _db_vdn | 
| 7029 |  |  |  |  |  |  |  | 
| 7030 |  |  |  |  |  |  | Parameters: ( caller_id_string, vdn ) | 
| 7031 |  |  |  |  |  |  |  | 
| 7032 |  |  |  |  |  |  | This function accepts a caller id string and a virtual database name. A \ | 
| 7033 |  |  |  |  |  |  | virtual database name is a text string which identifies a database \ | 
| 7034 |  |  |  |  |  |  | connection. If we are running in test mode and the caller is not the \ | 
| 7035 |  |  |  |  |  |  | db_connect function, this function will gracefully shut-down. Otherwise \ | 
| 7036 |  |  |  |  |  |  | it returns either raw database connection information or it returns the \ | 
| 7037 |  |  |  |  |  |  | appropriate database handle and statement handle for the named database. | 
| 7038 |  |  |  |  |  |  |  | 
| 7039 |  |  |  |  |  |  | Returns: | 
| 7040 |  |  |  |  |  |  |  | 
| 7041 |  |  |  |  |  |  | =cut | 
| 7042 | 0 |  |  | 0 |  |  | my ($caller, $vdn) = @_; | 
| 7043 |  |  |  |  |  |  |  | 
| 7044 | 0 |  |  |  |  |  | my $sth_name = 'sth_default';  ## default statement handle name | 
| 7045 |  |  |  |  |  |  |  | 
| 7046 |  |  |  |  |  |  | ## does vdn contains explicit statement handle? | 
| 7047 | 0 | 0 |  |  |  |  | if ( $vdn =~ /\./ ) { | 
| 7048 | 0 |  |  |  |  |  | ($vdn, $sth_name) = split /\./, $vdn; | 
| 7049 |  |  |  |  |  |  | } | 
| 7050 |  |  |  |  |  |  |  | 
| 7051 | 0 |  |  |  |  |  | my ($this_db, $this_inst); | 
| 7052 |  |  |  |  |  |  |  | 
| 7053 | 0 | 0 |  |  |  |  | if ( $vdn =~ m/:/x ) {  ## does vdn contain explicit instance? | 
| 7054 | 0 |  |  |  |  |  | ($this_db, $this_inst) = split m/:/, $vdn; | 
| 7055 |  |  |  |  |  |  | } else { | 
| 7056 | 0 |  |  |  |  |  | $this_db = $vdn; | 
| 7057 | 0 |  |  |  |  |  | $this_inst = $dbdefenvr{$vdn}; | 
| 7058 |  |  |  |  |  |  | } | 
| 7059 |  |  |  |  |  |  |  | 
| 7060 | 0 | 0 |  |  |  |  | if ( ! $dbname{$this_db} ) { | 
| 7061 | 0 |  |  |  |  |  | sys_die( "Virtual database name [$vdn] is invalid" ); | 
| 7062 |  |  |  |  |  |  | } | 
| 7063 |  |  |  |  |  |  |  | 
| 7064 |  |  |  |  |  |  | ## special return values if caller is 'connect' | 
| 7065 | 0 | 0 |  |  |  |  | if ( $caller eq 'connect' ) { | 
| 7066 | 0 |  |  |  |  |  | my $database = $dbconn{$this_db}{$this_inst}{'database'}; | 
| 7067 | 0 |  |  |  |  |  | my $username = $dbconn{$this_db}{$this_inst}{'username'}; | 
| 7068 | 0 |  |  |  |  |  | my $password = $dbconn{$this_db}{$this_inst}{'password'}; | 
| 7069 | 0 |  |  |  |  |  | return ($database, $username, $password); | 
| 7070 |  |  |  |  |  |  | } | 
| 7071 |  |  |  |  |  |  |  | 
| 7072 |  |  |  |  |  |  | #    ## shutdown gracefully if running under the 'test connections' flag | 
| 7073 |  |  |  |  |  |  | #    if ( $opt_test ) { | 
| 7074 |  |  |  |  |  |  | #        log_close( "End connection test: $jobname" ); | 
| 7075 |  |  |  |  |  |  | #        sys_end(); | 
| 7076 |  |  |  |  |  |  | #        exit 0; | 
| 7077 |  |  |  |  |  |  | #    } | 
| 7078 |  |  |  |  |  |  |  | 
| 7079 |  |  |  |  |  |  | ## return database and statement handles for this vdn | 
| 7080 | 0 |  |  |  |  |  | my $dbh = $dbhandles{$this_db}{'dbh'}; | 
| 7081 | 0 |  |  |  |  |  | my $sth = $dbhandles{$vdn}{$sth_name}; | 
| 7082 | 0 |  |  |  |  |  | return ($dbh, $sth); | 
| 7083 |  |  |  |  |  |  | } | 
| 7084 |  |  |  |  |  |  |  | 
| 7085 |  |  |  |  |  |  | sub _db_netservice { | 
| 7086 |  |  |  |  |  |  | =begin wiki | 
| 7087 |  |  |  |  |  |  |  | 
| 7088 |  |  |  |  |  |  | !3 _db_netservice | 
| 7089 |  |  |  |  |  |  |  | 
| 7090 |  |  |  |  |  |  | Parameters: ( vdn ) | 
| 7091 |  |  |  |  |  |  |  | 
| 7092 |  |  |  |  |  |  | This function accepts a virtual database name that contains an explicit \ | 
| 7093 |  |  |  |  |  |  | instance. A virtual database name is a text string which identifies a \ | 
| 7094 |  |  |  |  |  |  | database connection. The "network service", i.e., remote database \ | 
| 7095 |  |  |  |  |  |  | connection string is returned from sys_data.conf for the provided instance. | 
| 7096 |  |  |  |  |  |  |  | 
| 7097 |  |  |  |  |  |  | Returns: | 
| 7098 |  |  |  |  |  |  |  | 
| 7099 |  |  |  |  |  |  | =cut | 
| 7100 | 0 |  |  | 0 |  |  | my ($vdni) = shift; | 
| 7101 |  |  |  |  |  |  |  | 
| 7102 | 0 |  |  |  |  |  | my $netservice = ''; | 
| 7103 |  |  |  |  |  |  |  | 
| 7104 | 0 | 0 |  |  |  |  | if ( $vdni =~ m/:/x ) {  ## vdn contains instance definiton | 
| 7105 | 0 |  |  |  |  |  | my ($db, $inst) = split m/:/, $vdni; | 
| 7106 | 0 | 0 |  |  |  |  | _check_array_val( $db, \@databases ) | 
| 7107 |  |  |  |  |  |  | || sys_die( "Invalid database: [$db]", 0 ); | 
| 7108 | 0 | 0 |  |  |  |  | _check_array_val( $inst, [split m/,/, $dbinst{$db}] ) | 
| 7109 |  |  |  |  |  |  | || sys_die( "Invalid database instance: [$db.$inst]", 0 ); | 
| 7110 | 0 |  |  |  |  |  | $netservice = $dbconn{$db}{$inst}{netservice}; | 
| 7111 |  |  |  |  |  |  | } | 
| 7112 |  |  |  |  |  |  |  | 
| 7113 | 0 |  |  |  |  |  | return $netservice; | 
| 7114 |  |  |  |  |  |  | } | 
| 7115 |  |  |  |  |  |  |  | 
| 7116 |  |  |  |  |  |  | sub _db_proc_build_sql { | 
| 7117 |  |  |  |  |  |  | =begin wiki | 
| 7118 |  |  |  |  |  |  |  | 
| 7119 |  |  |  |  |  |  | !3 _db_proc_build_sql | 
| 7120 |  |  |  |  |  |  |  | 
| 7121 |  |  |  |  |  |  | Parameters: ( package_name, procedure_name, parameters) | 
| 7122 |  |  |  |  |  |  |  | 
| 7123 |  |  |  |  |  |  | * /parameters/ - parameters is a reference to an array | 
| 7124 |  |  |  |  |  |  |  | 
| 7125 |  |  |  |  |  |  | This function builds a sql statement to execute an Oracle Stored Procedure. \ | 
| 7126 |  |  |  |  |  |  | The sql statement uses generated variable names, e.g., :p1, :p2, :p3, etc. \ | 
| 7127 |  |  |  |  |  |  | This works because functions that use this sql statement all pass parameters \ | 
| 7128 |  |  |  |  |  |  | to the requested stored procedure positionally. The function accepts a \ | 
| 7129 |  |  |  |  |  |  | reference to an array of param in parameters. This is used only to get a \ | 
| 7130 |  |  |  |  |  |  | count of the number of parameters in the procedure's signature. | 
| 7131 |  |  |  |  |  |  |  | 
| 7132 |  |  |  |  |  |  | Returns: | 
| 7133 |  |  |  |  |  |  |  | 
| 7134 |  |  |  |  |  |  | =cut | 
| 7135 | 0 |  |  | 0 |  |  | my ($package, $proc_name, $params) = @_; | 
| 7136 | 0 |  |  |  |  |  | my $numparams = scalar @{$params}; | 
|  | 0 |  |  |  |  |  |  | 
| 7137 | 0 | 0 |  |  |  |  | if ( $package ) { $proc_name = $package . '.' . $proc_name; } | 
|  | 0 |  |  |  |  |  |  | 
| 7138 |  |  |  |  |  |  |  | 
| 7139 | 0 |  |  |  |  |  | my $sql = 'BEGIN ' . $proc_name . '('; | 
| 7140 | 0 |  |  |  |  |  | for my $i ( 0 .. $numparams - 1 ) { | 
| 7141 | 0 |  |  |  |  |  | $sql .= ':p'.$i; | 
| 7142 | 0 | 0 |  |  |  |  | if ( $i < $numparams - 1 ) { $sql .= ','; } | 
|  | 0 |  |  |  |  |  |  | 
| 7143 |  |  |  |  |  |  | } | 
| 7144 | 0 |  |  |  |  |  | $sql .= '); END;'; | 
| 7145 | 0 |  |  |  |  |  | return $sql; | 
| 7146 |  |  |  |  |  |  | } | 
| 7147 |  |  |  |  |  |  |  | 
| 7148 |  |  |  |  |  |  | sub _db_sqlloaderx_parse_logfile { | 
| 7149 |  |  |  |  |  |  | =begin wiki | 
| 7150 |  |  |  |  |  |  |  | 
| 7151 |  |  |  |  |  |  | !3 _db_sqlloaderx_parse_logfile | 
| 7152 |  |  |  |  |  |  |  | 
| 7153 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 7154 |  |  |  |  |  |  |  | 
| 7155 |  |  |  |  |  |  | Please write this documentation. | 
| 7156 |  |  |  |  |  |  |  | 
| 7157 |  |  |  |  |  |  | Returns: | 
| 7158 |  |  |  |  |  |  |  | 
| 7159 |  |  |  |  |  |  | =cut | 
| 7160 | 0 |  |  | 0 |  |  | my $logfile = shift; | 
| 7161 | 0 |  |  |  |  |  | %sqlloader_results = ();  ## hash of SQL*Loader results | 
| 7162 |  |  |  |  |  |  |  | 
| 7163 |  |  |  |  |  |  | ## default values | 
| 7164 | 0 |  |  |  |  |  | $sqlloader_results{'skipped'}      = "Problem obtaining value"; | 
| 7165 | 0 |  |  |  |  |  | $sqlloader_results{'read'}         = $sqlloader_results{'skipped'}; | 
| 7166 | 0 |  |  |  |  |  | $sqlloader_results{'rejected'}     = $sqlloader_results{'skipped'}; | 
| 7167 | 0 |  |  |  |  |  | $sqlloader_results{'discarded'}    = $sqlloader_results{'skipped'}; | 
| 7168 | 0 |  |  |  |  |  | $sqlloader_results{'elapsed_time'} = $sqlloader_results{'skipped'}; | 
| 7169 | 0 |  |  |  |  |  | $sqlloader_results{'cpu_time'}     = $sqlloader_results{'skipped'}; | 
| 7170 |  |  |  |  |  |  |  | 
| 7171 | 0 |  |  |  |  |  | my $log = new IO::File "<$logfile"; | 
| 7172 | 0 | 0 |  |  |  |  | if (! defined $log) { | 
| 7173 | 0 |  |  |  |  |  | sys_warn( "Failed to open SQL*Loader log file $logfile" ); | 
| 7174 | 0 |  |  |  |  |  | return 1; | 
| 7175 |  |  |  |  |  |  | } | 
| 7176 |  |  |  |  |  |  |  | 
| 7177 |  |  |  |  |  |  | ## skip the first line, check the second for the SQL*Loader declaration | 
| 7178 | 0 |  |  |  |  |  | my $line = <$log>; | 
| 7179 | 0 |  |  |  |  |  | $line = <$log>; | 
| 7180 | 0 | 0 |  |  |  |  | unless ($line =~ /^SQL\*Loader/) { | 
| 7181 | 0 |  |  |  |  |  | sys_warn( 'File does not appear to be a valid SQL*Loader log file' ); | 
| 7182 | 0 |  |  |  |  |  | return 1; | 
| 7183 |  |  |  |  |  |  | } | 
| 7184 |  |  |  |  |  |  |  | 
| 7185 | 0 |  |  |  |  |  | while (<$log>) { | 
| 7186 | 0 |  |  |  |  |  | chomp; | 
| 7187 | 0 | 0 |  |  |  |  | if ( m/^Total logical records skipped:\s+(\d+)/ ) { | 
| 7188 | 0 |  |  |  |  |  | $sqlloader_results{'skipped'} = $1; | 
| 7189 | 0 |  |  |  |  |  | next; | 
| 7190 |  |  |  |  |  |  | } | 
| 7191 | 0 | 0 |  |  |  |  | if ( m/^Total logical records read:\s+(\d+)/ ) { | 
| 7192 | 0 |  |  |  |  |  | $sqlloader_results{'read'} = $1; | 
| 7193 | 0 |  |  |  |  |  | next; | 
| 7194 |  |  |  |  |  |  | } | 
| 7195 | 0 | 0 |  |  |  |  | if ( m/^Total logical records rejected:\s+(\d+)/ ) { | 
| 7196 | 0 |  |  |  |  |  | $sqlloader_results{'rejected'} = $1; | 
| 7197 | 0 |  |  |  |  |  | next; | 
| 7198 |  |  |  |  |  |  | } | 
| 7199 | 0 | 0 |  |  |  |  | if ( m/^Total logical records discarded:\s+(\d+)/ ) { | 
| 7200 | 0 |  |  |  |  |  | $sqlloader_results{'discarded'} = $1; | 
| 7201 | 0 |  |  |  |  |  | next; | 
| 7202 |  |  |  |  |  |  | } | 
| 7203 | 0 | 0 |  |  |  |  | if( m/^Elapsed time was:\s+(.+)/ ) { | 
| 7204 | 0 |  |  |  |  |  | $sqlloader_results{'elapsed_time'} = $1; | 
| 7205 | 0 |  |  |  |  |  | next; | 
| 7206 |  |  |  |  |  |  | } | 
| 7207 | 0 | 0 |  |  |  |  | if( m/^CPU time was:\s+(.+)/ ) { | 
| 7208 | 0 |  |  |  |  |  | $sqlloader_results{'cpu_time'} = $1; | 
| 7209 | 0 |  |  |  |  |  | next; | 
| 7210 |  |  |  |  |  |  | } | 
| 7211 |  |  |  |  |  |  | } | 
| 7212 |  |  |  |  |  |  |  | 
| 7213 | 0 |  |  |  |  |  | $log->close; | 
| 7214 |  |  |  |  |  |  |  | 
| 7215 | 0 |  |  |  |  |  | my @results; | 
| 7216 |  |  |  |  |  |  |  | 
| 7217 | 0 |  |  |  |  |  | push @results, "Skipped: "      . $sqlloader_results{'skipped'}; | 
| 7218 | 0 |  |  |  |  |  | push @results, "Read: "         . $sqlloader_results{'read'}; | 
| 7219 | 0 |  |  |  |  |  | push @results, "Rejected: "     . $sqlloader_results{'rejected'}; | 
| 7220 | 0 |  |  |  |  |  | push @results, "Discarded: "    . $sqlloader_results{'discarded'}; | 
| 7221 | 0 |  |  |  |  |  | push @results, "Elapsed Time: " . $sqlloader_results{'elapsed_time'}; | 
| 7222 | 0 |  |  |  |  |  | push @results, "CPU Time: "     . $sqlloader_results{'cpu_time'}; | 
| 7223 |  |  |  |  |  |  |  | 
| 7224 |  |  |  |  |  |  | ## return ref to array of results | 
| 7225 | 0 |  |  |  |  |  | return \@results; | 
| 7226 |  |  |  |  |  |  | } | 
| 7227 |  |  |  |  |  |  |  | 
| 7228 |  |  |  |  |  |  | sub _db_proc_bind_inparams { | 
| 7229 |  |  |  |  |  |  | =begin wiki | 
| 7230 |  |  |  |  |  |  |  | 
| 7231 |  |  |  |  |  |  | !3 _db_proc_bind_inparams | 
| 7232 |  |  |  |  |  |  |  | 
| 7233 |  |  |  |  |  |  | Parameters: ( statement_handle, parameters ) | 
| 7234 |  |  |  |  |  |  |  | 
| 7235 |  |  |  |  |  |  | This function binds parameters to a prepared statement. The parameters are \ | 
| 7236 |  |  |  |  |  |  | passed as a ref to an array. This uses the same parameter names as those \ | 
| 7237 |  |  |  |  |  |  | defined by the build_sql function. All parameters are bound as type IN \ | 
| 7238 |  |  |  |  |  |  | parameters. | 
| 7239 |  |  |  |  |  |  |  | 
| 7240 |  |  |  |  |  |  | Returns: | 
| 7241 |  |  |  |  |  |  |  | 
| 7242 |  |  |  |  |  |  | =cut | 
| 7243 | 0 |  |  | 0 |  |  | my ($sth, $params) = @_; | 
| 7244 | 0 |  |  |  |  |  | my $numparams = scalar @{$params}; | 
|  | 0 |  |  |  |  |  |  | 
| 7245 |  |  |  |  |  |  |  | 
| 7246 | 0 |  |  |  |  |  | for my $i ( 0 .. $numparams - 1 ) { | 
| 7247 | 0 |  |  |  |  |  | my $var = ':p'.$i; | 
| 7248 | 0 |  |  |  |  |  | $sth->bind_param( $var, ${$params}[$i] ); | 
|  | 0 |  |  |  |  |  |  | 
| 7249 |  |  |  |  |  |  | } | 
| 7250 | 0 |  |  |  |  |  | return $sth; | 
| 7251 |  |  |  |  |  |  | } | 
| 7252 |  |  |  |  |  |  |  | 
| 7253 |  |  |  |  |  |  | sub _db_proc_bind_outparams { | 
| 7254 |  |  |  |  |  |  | =begin wiki | 
| 7255 |  |  |  |  |  |  |  | 
| 7256 |  |  |  |  |  |  | !3 _db_proc_bind_outparams | 
| 7257 |  |  |  |  |  |  |  | 
| 7258 |  |  |  |  |  |  | Parameters ( ) | 
| 7259 |  |  |  |  |  |  |  | 
| 7260 |  |  |  |  |  |  | This function binds parameters to a prepared statement. The parameters are \ | 
| 7261 |  |  |  |  |  |  | passed as a ref to an array. This uses the same parameter names as those \ | 
| 7262 |  |  |  |  |  |  | defined by the build_sql function. All parameters are bound as type IN \ | 
| 7263 |  |  |  |  |  |  | OUT/OUT parameters. | 
| 7264 |  |  |  |  |  |  |  | 
| 7265 |  |  |  |  |  |  | Returns: | 
| 7266 |  |  |  |  |  |  |  | 
| 7267 |  |  |  |  |  |  | =cut | 
| 7268 | 0 |  |  | 0 |  |  | my ($sth, $params) = @_; | 
| 7269 | 0 |  |  |  |  |  | my $numparams = scalar @{$params}; | 
|  | 0 |  |  |  |  |  |  | 
| 7270 |  |  |  |  |  |  |  | 
| 7271 | 0 |  |  |  |  |  | for my $i ( 0 .. $numparams - 1 ) { | 
| 7272 | 0 |  |  |  |  |  | my $var = ':p'.$i; | 
| 7273 | 0 |  |  |  |  |  | $sth->bind_param_inout( $var, @{$params}[$i], 100 ); | 
|  | 0 |  |  |  |  |  |  | 
| 7274 |  |  |  |  |  |  | } | 
| 7275 | 0 |  |  |  |  |  | return $sth; | 
| 7276 |  |  |  |  |  |  | } | 
| 7277 |  |  |  |  |  |  |  | 
| 7278 |  |  |  |  |  |  | sub _db_proc_bind_inoutparams { | 
| 7279 |  |  |  |  |  |  | =begin wiki | 
| 7280 |  |  |  |  |  |  |  | 
| 7281 |  |  |  |  |  |  | !3 _db_proc_bind_inoutparams | 
| 7282 |  |  |  |  |  |  |  | 
| 7283 |  |  |  |  |  |  | Parameters: ( ) | 
| 7284 |  |  |  |  |  |  |  | 
| 7285 |  |  |  |  |  |  | This function binds parameters to a prepared statement. The parameters are \ | 
| 7286 |  |  |  |  |  |  | passed as a ref to an array. This uses the same parameter names as those \ | 
| 7287 |  |  |  |  |  |  | defined by the build_sql function. All parameters are bound as type IN or \ | 
| 7288 |  |  |  |  |  |  | as type IN OUT/OUT. If the user passes a ref as an array member, that element \ | 
| 7289 |  |  |  |  |  |  | will be bound as IN OUT/OUT. If the users passes a scalar as an array member, \ | 
| 7290 |  |  |  |  |  |  | that element will be bound as a type IN parameter. | 
| 7291 |  |  |  |  |  |  |  | 
| 7292 |  |  |  |  |  |  | Returns: | 
| 7293 |  |  |  |  |  |  |  | 
| 7294 |  |  |  |  |  |  | =cut | 
| 7295 | 0 |  |  | 0 |  |  | my ($sth, $params) = @_; | 
| 7296 | 0 |  |  |  |  |  | my $numparams = scalar @{$params}; | 
|  | 0 |  |  |  |  |  |  | 
| 7297 |  |  |  |  |  |  |  | 
| 7298 | 0 |  |  |  |  |  | for my $i ( 0 .. $numparams - 1 ) { | 
| 7299 | 0 |  |  |  |  |  | my $var = ':p'.$i; | 
| 7300 | 0 | 0 |  |  |  |  | if ( ref @{$params}[$i] eq 'SCALAR' ) { | 
|  | 0 |  |  |  |  |  |  | 
| 7301 | 0 |  |  |  |  |  | $sth->bind_param_inout( $var, @{$params}[$i], 100 ); | 
|  | 0 |  |  |  |  |  |  | 
| 7302 |  |  |  |  |  |  | } else { | 
| 7303 | 0 |  |  |  |  |  | $sth->bind_param( $var, ${$params}[$i] ); | 
|  | 0 |  |  |  |  |  |  | 
| 7304 |  |  |  |  |  |  | } | 
| 7305 |  |  |  |  |  |  | } | 
| 7306 | 0 |  |  |  |  |  | return $sth; | 
| 7307 |  |  |  |  |  |  | } | 
| 7308 |  |  |  |  |  |  |  | 
| 7309 |  |  |  |  |  |  | sub _db_is_oracle { | 
| 7310 |  |  |  |  |  |  | =begin wiki | 
| 7311 |  |  |  |  |  |  |  | 
| 7312 |  |  |  |  |  |  | !3 _db_is_oracle | 
| 7313 |  |  |  |  |  |  |  | 
| 7314 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 7315 |  |  |  |  |  |  |  | 
| 7316 |  |  |  |  |  |  | Please write this documentation. | 
| 7317 |  |  |  |  |  |  |  | 
| 7318 |  |  |  |  |  |  | Returns: | 
| 7319 |  |  |  |  |  |  |  | 
| 7320 |  |  |  |  |  |  | =cut | 
| 7321 | 0 |  |  | 0 |  |  | my $vdn = shift; | 
| 7322 | 0 |  |  |  |  |  | my $inst = $dbdefenvr{$vdn}; | 
| 7323 | 0 |  |  |  |  |  | my $database = $dbconn{$vdn}{$inst}{'database'};  ## e.g., dbi:Oracle:myinst | 
| 7324 | 0 | 0 |  |  |  |  | if ( $database=~ /^dbi:Oracle:/ ) { | 
| 7325 | 0 |  |  |  |  |  | return 1; | 
| 7326 |  |  |  |  |  |  | } | 
| 7327 | 0 |  |  |  |  |  | return 0; | 
| 7328 |  |  |  |  |  |  | } | 
| 7329 |  |  |  |  |  |  |  | 
| 7330 |  |  |  |  |  |  | sub _db_null { | 
| 7331 |  |  |  |  |  |  | =begin wiki | 
| 7332 |  |  |  |  |  |  |  | 
| 7333 |  |  |  |  |  |  | !3 _db_null | 
| 7334 |  |  |  |  |  |  |  | 
| 7335 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 7336 |  |  |  |  |  |  |  | 
| 7337 |  |  |  |  |  |  | Please write this documentation. | 
| 7338 |  |  |  |  |  |  |  | 
| 7339 |  |  |  |  |  |  | Returns: | 
| 7340 |  |  |  |  |  |  |  | 
| 7341 |  |  |  |  |  |  | =cut | 
| 7342 | 0 |  |  | 0 |  |  | my $val = shift; | 
| 7343 | 0 | 0 |  |  |  |  | return '' unless defined $val; | 
| 7344 | 0 |  |  |  |  |  | return $val; | 
| 7345 |  |  |  |  |  |  | } | 
| 7346 |  |  |  |  |  |  |  | 
| 7347 |  |  |  |  |  |  | sub _db_query_to_file_protect { | 
| 7348 |  |  |  |  |  |  | =begin wiki | 
| 7349 |  |  |  |  |  |  |  | 
| 7350 |  |  |  |  |  |  | !3 _db_query_to_file_protect | 
| 7351 |  |  |  |  |  |  |  | 
| 7352 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 7353 |  |  |  |  |  |  |  | 
| 7354 |  |  |  |  |  |  | Please write this documentation. | 
| 7355 |  |  |  |  |  |  |  | 
| 7356 |  |  |  |  |  |  | Returns: | 
| 7357 |  |  |  |  |  |  |  | 
| 7358 |  |  |  |  |  |  | =cut | 
| 7359 | 0 |  |  | 0 |  |  | my ($row, $protect) = @_; | 
| 7360 |  |  |  |  |  |  |  | 
| 7361 | 0 | 0 |  |  |  |  | return 0 if scalar @{$protect} < 1; | 
|  | 0 |  |  |  |  |  |  | 
| 7362 |  |  |  |  |  |  |  | 
| 7363 | 0 |  |  |  |  |  | foreach my $i ( @{$protect} ) { | 
|  | 0 |  |  |  |  |  |  | 
| 7364 | 0 |  |  |  |  |  | my $len = length @{$row}[$i]; | 
|  | 0 |  |  |  |  |  |  | 
| 7365 | 0 |  |  |  |  |  | my $fil = '*'x$len; | 
| 7366 | 0 |  |  |  |  |  | @{$row}[$i] = $fil; | 
|  | 0 |  |  |  |  |  |  | 
| 7367 |  |  |  |  |  |  | } | 
| 7368 |  |  |  |  |  |  |  | 
| 7369 | 0 |  |  |  |  |  | return 0; | 
| 7370 |  |  |  |  |  |  | } | 
| 7371 |  |  |  |  |  |  |  | 
| 7372 |  |  |  |  |  |  | sub _check_array_val { | 
| 7373 |  |  |  |  |  |  | =begin wiki | 
| 7374 |  |  |  |  |  |  |  | 
| 7375 |  |  |  |  |  |  | !3 _check_array_val | 
| 7376 |  |  |  |  |  |  |  | 
| 7377 |  |  |  |  |  |  | Parameters: ( p1, p2, p3 ) | 
| 7378 |  |  |  |  |  |  |  | 
| 7379 |  |  |  |  |  |  | Please write this documentation. | 
| 7380 |  |  |  |  |  |  |  | 
| 7381 |  |  |  |  |  |  | Returns: | 
| 7382 |  |  |  |  |  |  |  | 
| 7383 |  |  |  |  |  |  | =cut | 
| 7384 | 0 |  |  | 0 |  |  | my ($val, $arr) = @_; | 
| 7385 | 0 | 0 |  |  |  |  | if ( grep { $_ eq $val } @{$arr} ) { | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
| 7386 | 0 |  |  |  |  |  | return 1; | 
| 7387 |  |  |  |  |  |  | } | 
| 7388 | 0 |  |  |  |  |  | return 0; | 
| 7389 |  |  |  |  |  |  | } | 
| 7390 |  |  |  |  |  |  |  | 
| 7391 |  |  |  |  |  |  | sub _trim { | 
| 7392 |  |  |  |  |  |  | =begin wiki | 
| 7393 |  |  |  |  |  |  |  | 
| 7394 |  |  |  |  |  |  | !3 _trim | 
| 7395 |  |  |  |  |  |  |  | 
| 7396 |  |  |  |  |  |  | Parameters: ( str ) | 
| 7397 |  |  |  |  |  |  |  | 
| 7398 |  |  |  |  |  |  | Trim leading and trailing spaces from a string. Return the trimmed string. | 
| 7399 |  |  |  |  |  |  |  | 
| 7400 |  |  |  |  |  |  | Returns: | 
| 7401 |  |  |  |  |  |  |  | 
| 7402 |  |  |  |  |  |  | =cut | 
| 7403 | 0 |  |  | 0 |  |  | my $str = shift; | 
| 7404 | 0 |  |  |  |  |  | $str =~ s/^\s+//; | 
| 7405 | 0 |  |  |  |  |  | $str =~ s/\s+$//; | 
| 7406 | 0 |  |  |  |  |  | return $str; | 
| 7407 |  |  |  |  |  |  | } | 
| 7408 |  |  |  |  |  |  |  | 
| 7409 |  |  |  |  |  |  | sub _trim_lead { | 
| 7410 |  |  |  |  |  |  | =begin wiki | 
| 7411 |  |  |  |  |  |  |  | 
| 7412 |  |  |  |  |  |  | !3 _trim_lead | 
| 7413 |  |  |  |  |  |  |  | 
| 7414 |  |  |  |  |  |  | Parameters: ( str ) | 
| 7415 |  |  |  |  |  |  |  | 
| 7416 |  |  |  |  |  |  | Trim leading spaces from a string. Return the trimmed string. | 
| 7417 |  |  |  |  |  |  |  | 
| 7418 |  |  |  |  |  |  | =cut | 
| 7419 | 0 |  |  | 0 |  |  | my $str = shift; | 
| 7420 | 0 |  |  |  |  |  | $str =~ s/^\s+//; | 
| 7421 | 0 |  |  |  |  |  | return $str; | 
| 7422 |  |  |  |  |  |  | } | 
| 7423 |  |  |  |  |  |  |  | 
| 7424 |  |  |  |  |  |  | sub _trim_trail { | 
| 7425 |  |  |  |  |  |  | =begin wiki | 
| 7426 |  |  |  |  |  |  |  | 
| 7427 |  |  |  |  |  |  | !3 _trim_trail | 
| 7428 |  |  |  |  |  |  |  | 
| 7429 |  |  |  |  |  |  | Parameters: ( str ) | 
| 7430 |  |  |  |  |  |  |  | 
| 7431 |  |  |  |  |  |  | Trim trailing spaces from a string. Return the trimmed string. | 
| 7432 |  |  |  |  |  |  |  | 
| 7433 |  |  |  |  |  |  | Results: | 
| 7434 |  |  |  |  |  |  |  | 
| 7435 |  |  |  |  |  |  | =cut | 
| 7436 | 0 |  |  | 0 |  |  | my $str = shift; | 
| 7437 | 0 |  |  |  |  |  | $str =~ s/\s+$//; | 
| 7438 | 0 |  |  |  |  |  | return $str; | 
| 7439 |  |  |  |  |  |  | } | 
| 7440 |  |  |  |  |  |  |  | 
| 7441 |  |  |  |  |  |  | sub _is_yes { | 
| 7442 |  |  |  |  |  |  | =begin wiki | 
| 7443 |  |  |  |  |  |  |  | 
| 7444 |  |  |  |  |  |  | !3 _is_yes | 
| 7445 |  |  |  |  |  |  |  | 
| 7446 |  |  |  |  |  |  | Parameters: ( str ) | 
| 7447 |  |  |  |  |  |  |  | 
| 7448 |  |  |  |  |  |  | Examing a string and determine if the string indicates 'YES'. The string is \ | 
| 7449 |  |  |  |  |  |  | examined as case insensitive and must be either a 'y' or 'yes'. If so, the \ | 
| 7450 |  |  |  |  |  |  | function returns true (1), otherwise it returns false (0). | 
| 7451 |  |  |  |  |  |  |  | 
| 7452 |  |  |  |  |  |  | You can use this as a conversion function to make tests simpler using a \ | 
| 7453 |  |  |  |  |  |  | technique like this: | 
| 7454 |  |  |  |  |  |  |  | 
| 7455 |  |  |  |  |  |  | % language=Perl | 
| 7456 |  |  |  |  |  |  | % my $truth = 'Y'; | 
| 7457 |  |  |  |  |  |  | % $truth = _is_yes( $truth ); | 
| 7458 |  |  |  |  |  |  | % # later | 
| 7459 |  |  |  |  |  |  | % if ( $truth ) { | 
| 7460 |  |  |  |  |  |  | %     # do something | 
| 7461 |  |  |  |  |  |  | % } | 
| 7462 |  |  |  |  |  |  | %% | 
| 7463 |  |  |  |  |  |  |  | 
| 7464 |  |  |  |  |  |  | =cut | 
| 7465 | 0 |  |  | 0 |  |  | my $str = shift; | 
| 7466 | 0 | 0 |  |  |  |  | if ( $str =~ /^y$|^yes$/i ) { return 1; } | 
|  | 0 |  |  |  |  |  |  | 
| 7467 | 0 |  |  |  |  |  | return 0; | 
| 7468 |  |  |  |  |  |  | } | 
| 7469 |  |  |  |  |  |  |  | 
| 7470 |  |  |  |  |  |  | sub _is_no { | 
| 7471 |  |  |  |  |  |  | =begin wiki | 
| 7472 |  |  |  |  |  |  |  | 
| 7473 |  |  |  |  |  |  | !3 _is_no | 
| 7474 |  |  |  |  |  |  |  | 
| 7475 |  |  |  |  |  |  | Parameters: ( str ) | 
| 7476 |  |  |  |  |  |  |  | 
| 7477 |  |  |  |  |  |  | Examing a string and determine if the string indicates 'NO'. The string is \ | 
| 7478 |  |  |  |  |  |  | examined as case insensitive and must be either a 'n' or 'no' exactly. If so, \ | 
| 7479 |  |  |  |  |  |  | the function returns true (1), otherwise it returns false (0). | 
| 7480 |  |  |  |  |  |  |  | 
| 7481 |  |  |  |  |  |  | Returns: | 
| 7482 |  |  |  |  |  |  |  | 
| 7483 |  |  |  |  |  |  | =cut | 
| 7484 | 0 |  |  | 0 |  |  | my $str = shift; | 
| 7485 | 0 | 0 |  |  |  |  | if ( $str =~ /^n$|^no$/i ) { return 1; } | 
|  | 0 |  |  |  |  |  |  | 
| 7486 | 0 |  |  |  |  |  | return 0; | 
| 7487 |  |  |  |  |  |  | } | 
| 7488 |  |  |  |  |  |  |  | 
| 7489 |  |  |  |  |  |  | sub END { | 
| 7490 |  |  |  |  |  |  | =begin wiki | 
| 7491 |  |  |  |  |  |  |  | 
| 7492 |  |  |  |  |  |  | !3 END | 
| 7493 |  |  |  |  |  |  |  | 
| 7494 |  |  |  |  |  |  | Parameters: None | 
| 7495 |  |  |  |  |  |  |  | 
| 7496 |  |  |  |  |  |  | Close all open statement handles and database handles. Statement handles and \ | 
| 7497 |  |  |  |  |  |  | Database handles are stored for us by the database connection function. The \ | 
| 7498 |  |  |  |  |  |  | end function in each loaded plugin is also called here. They are called in \ | 
| 7499 |  |  |  |  |  |  | reverse load order. Send exit notifications if any have been requested. | 
| 7500 |  |  |  |  |  |  |  | 
| 7501 |  |  |  |  |  |  | Returns: | 
| 7502 |  |  |  |  |  |  |  | 
| 7503 |  |  |  |  |  |  | =cut | 
| 7504 |  |  |  |  |  |  | ## remove job information from sys_environment.conf | 
| 7505 | 1 |  |  | 1 |  | 854 | _sys_job_end(); | 
| 7506 |  |  |  |  |  |  |  | 
| 7507 |  |  |  |  |  |  | ## disconnect any open database handles | 
| 7508 | 1 |  |  |  |  | 4 | foreach my $vdn ( keys %dbhandles ) { | 
| 7509 | 0 |  |  |  |  | 0 | my $dbh = $dbhandles{$vdn}{'dbh'}; | 
| 7510 | 0 |  |  |  |  | 0 | my $sth = $dbhandles{$vdn}{'sth'}; | 
| 7511 | 0 | 0 | 0 |  |  | 0 | if ( defined $sth && $sth ) { $sth->finish; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 7512 | 0 | 0 | 0 |  |  | 0 | if ( defined $dbh && $dbh ) { $dbh->disconnect; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 7513 |  |  |  |  |  |  | } | 
| 7514 |  |  |  |  |  |  |  | 
| 7515 |  |  |  |  |  |  | ## call plugin end functions | 
| 7516 | 1 |  |  |  |  | 4 | while ( my $pluginf = pop @plugins ) { | 
| 7517 | 0 |  |  |  |  | 0 | my ($pp, $pf, $pff) = split m/~/, $pluginf; | 
| 7518 | 0 |  |  |  |  | 0 | $pp->end(); | 
| 7519 |  |  |  |  |  |  | } | 
| 7520 |  |  |  |  |  |  |  | 
| 7521 |  |  |  |  |  |  | ## send completion notifications | 
| 7522 | 1 | 50 |  |  |  | 3 | unless ( defined $jobname ) { $jobname = '?'; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 7523 | 1 |  |  |  |  | 4 | my $msg = "Job $jobname ($script_file) has completed ($errorlevel)."; | 
| 7524 | 1 | 50 |  |  |  | 3 | if ( $opt_notify_email_oncomp ) { | 
| 7525 | 0 |  |  |  |  | 0 | _log_send_mail($msg, 'MESSAGE' ); | 
| 7526 |  |  |  |  |  |  | } | 
| 7527 | 1 | 50 |  |  |  | 9 | if ( $opt_notify_pager_oncomp ) { | 
| 7528 | 0 |  |  |  |  | 0 | _log_send_page($msg, 'MESSAGE' ); | 
| 7529 |  |  |  |  |  |  | } | 
| 7530 |  |  |  |  |  |  | } | 
| 7531 |  |  |  |  |  |  |  | 
| 7532 |  |  |  |  |  |  | 1; | 
| 7533 |  |  |  |  |  |  |  | 
| 7534 |  |  |  |  |  |  | =begin wiki | 
| 7535 |  |  |  |  |  |  |  | 
| 7536 |  |  |  |  |  |  | ---- | 
| 7537 |  |  |  |  |  |  |  | 
| 7538 |  |  |  |  |  |  | !1 Dependencies | 
| 7539 |  |  |  |  |  |  |  | 
| 7540 |  |  |  |  |  |  | The following modules are all used by DBIx-JCL. | 
| 7541 |  |  |  |  |  |  |  | 
| 7542 |  |  |  |  |  |  | * English | 
| 7543 |  |  |  |  |  |  | * Getopt::Long | 
| 7544 |  |  |  |  |  |  | * Config::IniFiles | 
| 7545 |  |  |  |  |  |  | * IO::File | 
| 7546 |  |  |  |  |  |  | * IO::Handle | 
| 7547 |  |  |  |  |  |  | * IO::LockedFile | 
| 7548 |  |  |  |  |  |  | * Fcntl | 
| 7549 |  |  |  |  |  |  | * File::Copy | 
| 7550 |  |  |  |  |  |  | * File::Bidirectional | 
| 7551 |  |  |  |  |  |  | * File::Basename | 
| 7552 |  |  |  |  |  |  | * MIME::Lite | 
| 7553 |  |  |  |  |  |  | * Date::Format | 
| 7554 |  |  |  |  |  |  | * Pod::WikiText | 
| 7555 |  |  |  |  |  |  | * DBI | 
| 7556 |  |  |  |  |  |  |  | 
| 7557 |  |  |  |  |  |  | ---- | 
| 7558 |  |  |  |  |  |  |  | 
| 7559 |  |  |  |  |  |  | !1 Incompatibilities | 
| 7560 |  |  |  |  |  |  |  | 
| 7561 |  |  |  |  |  |  | None currently documented. Please feel free to notify the author if you have \ | 
| 7562 |  |  |  |  |  |  | concern that you would like to see addressed. | 
| 7563 |  |  |  |  |  |  |  | 
| 7564 |  |  |  |  |  |  | ---- | 
| 7565 |  |  |  |  |  |  |  | 
| 7566 |  |  |  |  |  |  | !1 Test Support | 
| 7567 |  |  |  |  |  |  |  | 
| 7568 |  |  |  |  |  |  | There are a number of test functions built-in to DBIx-JCL. Please see the \ | 
| 7569 |  |  |  |  |  |  | function reference section for descriptions of all the testing functions. | 
| 7570 |  |  |  |  |  |  |  | 
| 7571 |  |  |  |  |  |  | ---- | 
| 7572 |  |  |  |  |  |  |  | 
| 7573 |  |  |  |  |  |  | !1 Tips | 
| 7574 |  |  |  |  |  |  |  | 
| 7575 |  |  |  |  |  |  | Here are some tips for using job scripts. (A job script is any perl script \ | 
| 7576 |  |  |  |  |  |  | that uses the DBIx-JCL Module. | 
| 7577 |  |  |  |  |  |  |  | 
| 7578 |  |  |  |  |  |  | !2 Verbose and Very Verbose | 
| 7579 |  |  |  |  |  |  |  | 
| 7580 |  |  |  |  |  |  | If you are running jobs from the console and you want tactile feedback, use \ | 
| 7581 |  |  |  |  |  |  | the Verbose C<-v> option. If your job is failing and your not sure why, turn \ | 
| 7582 |  |  |  |  |  |  | on the Very Verbose C<-vv> option. Very Verbose gives you everything that \ | 
| 7583 |  |  |  |  |  |  | Verbose gives you, plus more. | 
| 7584 |  |  |  |  |  |  |  | 
| 7585 |  |  |  |  |  |  | !2 Required Options | 
| 7586 |  |  |  |  |  |  |  | 
| 7587 |  |  |  |  |  |  | A "Run job" option is always required. This is to avoid accidentally invoking \ | 
| 7588 |  |  |  |  |  |  | a job script. | 
| 7589 |  |  |  |  |  |  |  | 
| 7590 |  |  |  |  |  |  | !2 Built-in Display Features | 
| 7591 |  |  |  |  |  |  |  | 
| 7592 |  |  |  |  |  |  | There are several built-in display features that you will find useful. When \ | 
| 7593 |  |  |  |  |  |  | you use the Help option, C<-h> and C<-ha>, these will be listed under the \ | 
| 7594 |  |  |  |  |  |  | heading of "Information Options". The most useful is possibly the C<-dl> \ | 
| 7595 |  |  |  |  |  |  | option, which will display the last log file generated by the script that you \ | 
| 7596 |  |  |  |  |  |  | are currently running. | 
| 7597 |  |  |  |  |  |  |  | 
| 7598 |  |  |  |  |  |  | !2 Use the Test Options | 
| 7599 |  |  |  |  |  |  |  | 
| 7600 |  |  |  |  |  |  | Use the /-t/ option to invoke the job script and run it to the point of \ | 
| 7601 |  |  |  |  |  |  | database connection and then exit after database connections have been made. | 
| 7602 |  |  |  |  |  |  |  | 
| 7603 |  |  |  |  |  |  | Use the /-tc/ option to test any database connection interactively without \ | 
| 7604 |  |  |  |  |  |  | invoking the current job script. Very handy for diagnostic purposes. | 
| 7605 |  |  |  |  |  |  |  | 
| 7606 |  |  |  |  |  |  | !2 Multiple Database Connections | 
| 7607 |  |  |  |  |  |  |  | 
| 7608 |  |  |  |  |  |  | You can set up jobs that make multiple connections to the same database. To \ | 
| 7609 |  |  |  |  |  |  | do that, you simply add another set of connection parameters in your data.conf \ | 
| 7610 |  |  |  |  |  |  | file. So if for example you have a database named 'xyz1' in your list of \ | 
| 7611 |  |  |  |  |  |  | databases in %data.conf%, add another database named 'xyz2' and duplicate all \ | 
| 7612 |  |  |  |  |  |  | other connection parameters from 'xyz1' under the new key 'xyz2'. | 
| 7613 |  |  |  |  |  |  |  | 
| 7614 |  |  |  |  |  |  | !2 Global Variables | 
| 7615 |  |  |  |  |  |  |  | 
| 7616 |  |  |  |  |  |  | There are a number of global variables that are automatically imported into \ | 
| 7617 |  |  |  |  |  |  | your script's namespace. These are listed below with a brief explanation of \ | 
| 7618 |  |  |  |  |  |  | each. | 
| 7619 |  |  |  |  |  |  |  | 
| 7620 |  |  |  |  |  |  | * %$path_bin_dir        # path to bin directory% | 
| 7621 |  |  |  |  |  |  | * %$path_lib_dir        # path to lib directory% | 
| 7622 |  |  |  |  |  |  | * %$path_log_dir        # path to log directory% | 
| 7623 |  |  |  |  |  |  | * %$path_load_dir       # path to load directory% | 
| 7624 |  |  |  |  |  |  | * %$path_extr_dir       # path to extract directo%ry | 
| 7625 |  |  |  |  |  |  | * %$path_prev_dir       # path to store previous vrsion files% | 
| 7626 |  |  |  |  |  |  | * %$path_scripts_dir    # path to scripts directory% | 
| 7627 |  |  |  |  |  |  | * %$mail_server         # mail server address% | 
| 7628 |  |  |  |  |  |  | * %$mail_from           # from email address% | 
| 7629 |  |  |  |  |  |  | * %$mail_emailto        # email to address list% | 
| 7630 |  |  |  |  |  |  | * %$mail_pagerto        # pager to address list% | 
| 7631 |  |  |  |  |  |  | * %$mail_email_levels   # log levels which initiate email notifications% | 
| 7632 |  |  |  |  |  |  | * %$mail_pager_levels   # log levels which initiate pager notifications% | 
| 7633 |  |  |  |  |  |  | * %$log_file            # log file filename% | 
| 7634 |  |  |  |  |  |  | * %$log_filefull        # full path to log filename% | 
| 7635 |  |  |  |  |  |  | * %$log_logging_levels  # log levels which initiate log mesages% | 
| 7636 |  |  |  |  |  |  | * %$log_console_levels  # log levels which initiate console messages% | 
| 7637 |  |  |  |  |  |  | * %$log_gdg             # number of log archive files to maintain% | 
| 7638 |  |  |  |  |  |  |  | 
| 7639 |  |  |  |  |  |  | Default values for all of these are defined in system conf files. The value \ | 
| 7640 |  |  |  |  |  |  | of many of these can be set at runtime using command line options. | 
| 7641 |  |  |  |  |  |  |  | 
| 7642 |  |  |  |  |  |  | A special global variable defines the current database environment. This is \ | 
| 7643 |  |  |  |  |  |  | the $dataenvr variable. | 
| 7644 |  |  |  |  |  |  |  | 
| 7645 |  |  |  |  |  |  | ---- | 
| 7646 |  |  |  |  |  |  |  | 
| 7647 |  |  |  |  |  |  | !1 Source Code Validation | 
| 7648 |  |  |  |  |  |  |  | 
| 7649 |  |  |  |  |  |  | In order to help maintain consistency across an entire library of job \ | 
| 7650 |  |  |  |  |  |  | scripts. Several aspects of script files are check for compliance before \ | 
| 7651 |  |  |  |  |  |  | the job will be executed. The following rules are checked before a job \ | 
| 7652 |  |  |  |  |  |  | will be run by DBIx-JCL | 
| 7653 |  |  |  |  |  |  |  | 
| 7654 |  |  |  |  |  |  | /Header Checks/ | 
| 7655 |  |  |  |  |  |  |  | 
| 7656 |  |  |  |  |  |  | There must be valid %##@@% and %##$$% statements. These statements can be \ | 
| 7657 |  |  |  |  |  |  | used to help manage script libraries. The %##$$% statement is also used by \ | 
| 7658 |  |  |  |  |  |  | the display jobs option to provide a brief description of each job. | 
| 7659 |  |  |  |  |  |  |  | 
| 7660 |  |  |  |  |  |  | /Documentation Checks/ | 
| 7661 |  |  |  |  |  |  |  | 
| 7662 |  |  |  |  |  |  | There needs to be valid Pod containing at least a DESCRIPTION section, a \ | 
| 7663 |  |  |  |  |  |  | RECOVERY NOTES section, and a DEPENDENCIES section in each job script. | 
| 7664 |  |  |  |  |  |  |  | 
| 7665 |  |  |  |  |  |  | ---- | 
| 7666 |  |  |  |  |  |  |  | 
| 7667 |  |  |  |  |  |  | !1 File And Directory Permissions | 
| 7668 |  |  |  |  |  |  |  | 
| 7669 |  |  |  |  |  |  | This information is here to document one approach to file and directory \ | 
| 7670 |  |  |  |  |  |  | permissions. You should not adopt these for your use without careful \ | 
| 7671 |  |  |  |  |  |  | consideration and testing. | 
| 7672 |  |  |  |  |  |  |  | 
| 7673 |  |  |  |  |  |  | All files owned by the account which processes batch jobs should be set to \ | 
| 7674 |  |  |  |  |  |  | permission level 750, which will give owner rwx, group r-x, and all others no \ | 
| 7675 |  |  |  |  |  |  | access. | 
| 7676 |  |  |  |  |  |  |  | 
| 7677 |  |  |  |  |  |  | % language=Ini_Files | 
| 7678 |  |  |  |  |  |  | % >chmod 750 filename | 
| 7679 |  |  |  |  |  |  | % | 
| 7680 |  |  |  |  |  |  | % 7 - owner permissions (rwx) i.e., read & write & execute | 
| 7681 |  |  |  |  |  |  | % 5 - group permissions (r-x) i.e., read & execute | 
| 7682 |  |  |  |  |  |  | % 0 - world permissions (---) i.e., none | 
| 7683 |  |  |  |  |  |  | %% | 
| 7684 |  |  |  |  |  |  |  | 
| 7685 |  |  |  |  |  |  | All directories owned by the account which processes batch jobs should \ | 
| 7686 |  |  |  |  |  |  | normally be set to permission level 750. | 
| 7687 |  |  |  |  |  |  |  | 
| 7688 |  |  |  |  |  |  | Permission reference table: | 
| 7689 |  |  |  |  |  |  |  | 
| 7690 |  |  |  |  |  |  | |0 |--- |no access| | 
| 7691 |  |  |  |  |  |  | |1 |--x |execute| | 
| 7692 |  |  |  |  |  |  | |2 |-w- |write| | 
| 7693 |  |  |  |  |  |  | |3 |-wx |write and execute| | 
| 7694 |  |  |  |  |  |  | |4 |r-- |read| | 
| 7695 |  |  |  |  |  |  | |5 |r-x |read and execute| | 
| 7696 |  |  |  |  |  |  | |6 |rw- |read and write| | 
| 7697 |  |  |  |  |  |  | |7 |rwx |read write execute (full access)| | 
| 7698 |  |  |  |  |  |  |  | 
| 7699 |  |  |  |  |  |  | ---- | 
| 7700 |  |  |  |  |  |  |  | 
| 7701 |  |  |  |  |  |  | !1 Plugins | 
| 7702 |  |  |  |  |  |  |  | 
| 7703 |  |  |  |  |  |  | DBIx-JCL supports plugin modules using a simple plugin architecture. This \ | 
| 7704 |  |  |  |  |  |  | will allow you to write your own modules and have them loaded at runtime to \ | 
| 7705 |  |  |  |  |  |  | provide additional functionality for your job scripts. For example, you might \ | 
| 7706 |  |  |  |  |  |  | want to write a module that uses http to turn off your web site before some \ | 
| 7707 |  |  |  |  |  |  | processing in your batch job occurs. | 
| 7708 |  |  |  |  |  |  |  | 
| 7709 |  |  |  |  |  |  | Plugin modules are simple Perl modules with no exported functions or \ | 
| 7710 |  |  |  |  |  |  | variables. Here is a trivial example of a plugin module: | 
| 7711 |  |  |  |  |  |  |  | 
| 7712 |  |  |  |  |  |  | % language=Perl | 
| 7713 |  |  |  |  |  |  | % package TestPlugin1; | 
| 7714 |  |  |  |  |  |  | % | 
| 7715 |  |  |  |  |  |  | % use strict; | 
| 7716 |  |  |  |  |  |  | % use warnings; | 
| 7717 |  |  |  |  |  |  | % | 
| 7718 |  |  |  |  |  |  | % my $tp_num = 0; | 
| 7719 |  |  |  |  |  |  | % | 
| 7720 |  |  |  |  |  |  | % sub start { | 
| 7721 |  |  |  |  |  |  | %     my ($path_conf_dir, $path_plugin_dir, $dataenvr) = @_; | 
| 7722 |  |  |  |  |  |  | %     $tp_num = 100; | 
| 7723 |  |  |  |  |  |  | %     print "TestPlugin1 start function\n"; | 
| 7724 |  |  |  |  |  |  | % } | 
| 7725 |  |  |  |  |  |  | % | 
| 7726 |  |  |  |  |  |  | % sub plugin_main { | 
| 7727 |  |  |  |  |  |  | %     my $n = shift; | 
| 7728 |  |  |  |  |  |  | %     $tp_num += $n; | 
| 7729 |  |  |  |  |  |  | %     return $tp_num; | 
| 7730 |  |  |  |  |  |  | % } | 
| 7731 |  |  |  |  |  |  | % | 
| 7732 |  |  |  |  |  |  | % sub tp_add { | 
| 7733 |  |  |  |  |  |  | %     my $n = shift; | 
| 7734 |  |  |  |  |  |  | %     $tp_num += $n; | 
| 7735 |  |  |  |  |  |  | %     return $tp_num; | 
| 7736 |  |  |  |  |  |  | % } | 
| 7737 |  |  |  |  |  |  | % | 
| 7738 |  |  |  |  |  |  | % sub end { | 
| 7739 |  |  |  |  |  |  | %     print "TestPlugin1 end function\n"; | 
| 7740 |  |  |  |  |  |  | % } | 
| 7741 |  |  |  |  |  |  | % | 
| 7742 |  |  |  |  |  |  | % 1; | 
| 7743 |  |  |  |  |  |  | %% | 
| 7744 |  |  |  |  |  |  |  | 
| 7745 |  |  |  |  |  |  | There are three functions that plugin modules are required to implement, a \ | 
| 7746 |  |  |  |  |  |  | C, a C, and an C. The start and end functions \ | 
| 7747 |  |  |  |  |  |  | are called automatically for you on load and script termination. The address \ | 
| 7748 |  |  |  |  |  |  | to the C function is returned to you when your plugin is \ | 
| 7749 |  |  |  |  |  |  | loaded. All of your plugin code can be implemented in C, or in \ | 
| 7750 |  |  |  |  |  |  | additional functions that you supply. The decision will vary depending on \ | 
| 7751 |  |  |  |  |  |  | your plugin's needs. All functions in your plugin module are callable, but \ | 
| 7752 |  |  |  |  |  |  | the symantics vary. | 
| 7753 |  |  |  |  |  |  |  | 
| 7754 |  |  |  |  |  |  | !2 Loading your plugin | 
| 7755 |  |  |  |  |  |  |  | 
| 7756 |  |  |  |  |  |  | Your plugin is loaded using the C function. This function \ | 
| 7757 |  |  |  |  |  |  | takes two parameters, The file name used by your plugin (without the .pm \ | 
| 7758 |  |  |  |  |  |  | extension) and the package name used by your plugin. All plugins need to be \ | 
| 7759 |  |  |  |  |  |  | installed in a plugins directory which has been specified in the system.conf \ | 
| 7760 |  |  |  |  |  |  | file. For example, if you created the plugin shown above and placed it in a \ | 
| 7761 |  |  |  |  |  |  | file named TestPlugin1.pm, you would load the plugin like this: | 
| 7762 |  |  |  |  |  |  |  | 
| 7763 |  |  |  |  |  |  | sys_init_plugin( 'TestPlugin1', 'TestPlugin1' ); | 
| 7764 |  |  |  |  |  |  |  | 
| 7765 |  |  |  |  |  |  | or | 
| 7766 |  |  |  |  |  |  |  | 
| 7767 |  |  |  |  |  |  | my $plugin1 = 'TestPlugin1'; | 
| 7768 |  |  |  |  |  |  | sys_init_plugin( $plugin1, $plugin1 ); | 
| 7769 |  |  |  |  |  |  |  | 
| 7770 |  |  |  |  |  |  | !2 Calling functions in plugin modules | 
| 7771 |  |  |  |  |  |  |  | 
| 7772 |  |  |  |  |  |  | There are three ways (probably more) to call functions in your plugin. | 
| 7773 |  |  |  |  |  |  |  | 
| 7774 |  |  |  |  |  |  | B> | 
| 7775 |  |  |  |  |  |  |  | 
| 7776 |  |  |  |  |  |  | Use the fully qualified package name and function name. | 
| 7777 |  |  |  |  |  |  |  | 
| 7778 |  |  |  |  |  |  | sys_init_plugin( 'TestPlugin1', 'TestPlugin1' ); | 
| 7779 |  |  |  |  |  |  |  | 
| 7780 |  |  |  |  |  |  | later | 
| 7781 |  |  |  |  |  |  |  | 
| 7782 |  |  |  |  |  |  | TestPlugin1::tp_add(1); | 
| 7783 |  |  |  |  |  |  |  | 
| 7784 |  |  |  |  |  |  | B> | 
| 7785 |  |  |  |  |  |  |  | 
| 7786 |  |  |  |  |  |  | If you are going to call your plugin from serveral places in your script, \ | 
| 7787 |  |  |  |  |  |  | you might prefer to take this approach. | 
| 7788 |  |  |  |  |  |  |  | 
| 7789 |  |  |  |  |  |  | sys_init_plugin( 'TestPlugin1', 'TestPlugin1' ); | 
| 7790 |  |  |  |  |  |  | my $plug_1 = \&TestPlugin1::tp_add; | 
| 7791 |  |  |  |  |  |  |  | 
| 7792 |  |  |  |  |  |  | later | 
| 7793 |  |  |  |  |  |  |  | 
| 7794 |  |  |  |  |  |  | $plug_1->(1); | 
| 7795 |  |  |  |  |  |  |  | 
| 7796 |  |  |  |  |  |  | B> | 
| 7797 |  |  |  |  |  |  |  | 
| 7798 |  |  |  |  |  |  | Probably the simplest approach it to implement as much of your plugin's code \ | 
| 7799 |  |  |  |  |  |  | as possible within the C function. Then use the supplied \ | 
| 7800 |  |  |  |  |  |  | coderef to execute your plugin. | 
| 7801 |  |  |  |  |  |  |  | 
| 7802 |  |  |  |  |  |  | my $plug1 = sys_init_plugin( 'TestPlugin1', 'TestPlugin1' ); | 
| 7803 |  |  |  |  |  |  |  | 
| 7804 |  |  |  |  |  |  | later | 
| 7805 |  |  |  |  |  |  |  | 
| 7806 |  |  |  |  |  |  | $plug1->(1); | 
| 7807 |  |  |  |  |  |  |  | 
| 7808 |  |  |  |  |  |  | ---- | 
| 7809 |  |  |  |  |  |  |  | 
| 7810 |  |  |  |  |  |  | !1 Exported Variables | 
| 7811 |  |  |  |  |  |  |  | 
| 7812 |  |  |  |  |  |  | The following variables are available for use in job scripts and are \ | 
| 7813 |  |  |  |  |  |  | exported by default. | 
| 7814 |  |  |  |  |  |  |  | 
| 7815 |  |  |  |  |  |  | |!Variable             |Mod?|Description| | 
| 7816 |  |  |  |  |  |  | |%$path_bin_dir%       |No  |path to bin directory| | 
| 7817 |  |  |  |  |  |  | |%$path_lib_dir%       |No  |path to lib directory| | 
| 7818 |  |  |  |  |  |  | |%$path_log_dir%       |No  |path to log directory| | 
| 7819 |  |  |  |  |  |  | |%$path_load_dir%      |No  |path to load data directory| | 
| 7820 |  |  |  |  |  |  | |%$path_extr_dir%      |No  |path to extract data directory| | 
| 7821 |  |  |  |  |  |  | |%$path_prev_dir%      |No  |path to previous version files| | 
| 7822 |  |  |  |  |  |  | |%$path_scripts_dir%   |No  |path to scripts directory| | 
| 7823 |  |  |  |  |  |  | |%$mail_server%        |.   |mail server| | 
| 7824 |  |  |  |  |  |  | |%$mail_from%          |.   |mail from address| | 
| 7825 |  |  |  |  |  |  | |%$mail_emailto%       |.   |email to address list| | 
| 7826 |  |  |  |  |  |  | |%$mail_pagerto%       |.   |pager to address list| | 
| 7827 |  |  |  |  |  |  | |%$mail_email_levels%  |.   |email severity/notification levels| | 
| 7828 |  |  |  |  |  |  | |%$mail_pager_levels%  |.   |pager severity/notification levels| | 
| 7829 |  |  |  |  |  |  | |%$log_file%           |No  |name of log file| | 
| 7830 |  |  |  |  |  |  | |%$log_filefull%       |No  |full name including path of log file| | 
| 7831 |  |  |  |  |  |  | |%$log_logging_levels% |.   |severity levels for log file logging| | 
| 7832 |  |  |  |  |  |  | |%$log_console_levels% |.   |severity levels for console logging| | 
| 7833 |  |  |  |  |  |  | |%$log_gdg%            |.   |number of generations for log archiving| | 
| 7834 |  |  |  |  |  |  | |%$dataenvr%           |No  |environment variable which holds default datbase/instance | | 
| 7835 |  |  |  |  |  |  | |%$commandline_ext%    |No  |extra command variables passed to job script| | 
| 7836 |  |  |  |  |  |  | |%$errorlevel%         |No  |.| | 
| 7837 |  |  |  |  |  |  |  | 
| 7838 |  |  |  |  |  |  | Variables with "No" should not be modified. | 
| 7839 |  |  |  |  |  |  |  | 
| 7840 |  |  |  |  |  |  | ---- | 
| 7841 |  |  |  |  |  |  |  | 
| 7842 |  |  |  |  |  |  | !1 Bugs And Limitations | 
| 7843 |  |  |  |  |  |  |  | 
| 7844 |  |  |  |  |  |  | Please report all bugs to the author. Every attempt will be made to \ | 
| 7845 |  |  |  |  |  |  | incorporate bug fixes into future releases of this package. | 
| 7846 |  |  |  |  |  |  |  | 
| 7847 |  |  |  |  |  |  | ---- | 
| 7848 |  |  |  |  |  |  |  | 
| 7849 |  |  |  |  |  |  | !1 Author | 
| 7850 |  |  |  |  |  |  |  | 
| 7851 |  |  |  |  |  |  | Brad Adkins brad.j.adkins@gmail.com. | 
| 7852 |  |  |  |  |  |  |  | 
| 7853 |  |  |  |  |  |  | You may contact the author regarding this module at dbijcl@gmail.com. | 
| 7854 |  |  |  |  |  |  |  | 
| 7855 |  |  |  |  |  |  | ---- | 
| 7856 |  |  |  |  |  |  |  | 
| 7857 |  |  |  |  |  |  | !1 License And Copyright | 
| 7858 |  |  |  |  |  |  |  | 
| 7859 |  |  |  |  |  |  | Copyright (c) 2008, Brad Adkins. All rights reserved. | 
| 7860 |  |  |  |  |  |  |  | 
| 7861 |  |  |  |  |  |  | This software may be freely distributed under the same terms as Perl itself. | 
| 7862 |  |  |  |  |  |  |  | 
| 7863 |  |  |  |  |  |  | ---- | 
| 7864 |  |  |  |  |  |  | =cut |