/[vdw]/trunk/WOU_SIS_Util.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/WOU_SIS_Util.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations)
Sun Feb 6 05:28:38 2005 UTC (19 years, 2 months ago) by dpavlin
File size: 11556 byte(s)
initial import into svn

1 package WOU_SIS_Util;
2
3 # Banner SIS Utilities
4 #
5 # Subs in this package that use DBI expect to be passed a database handle
6 # ($dbh) that has been granted the appropriate roles by WOU_Secure.pm.
7 #
8 # Jeremy Hickerson, 3/15/2002
9
10 use strict;
11
12 BEGIN {
13 use Exporter ();
14 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
15
16 # set the version for version checking
17 $VERSION = 1.00;
18 @ISA = qw(Exporter);
19 @EXPORT = qw(&xtvxxxx_desc &pass_cobol_params &db_login
20 &already_sent_letter &term_acyr &ahist_level &term_last_year
21 &date_last_year &state_name &like2re &ssn2pidm &vnum2pidm
22 &next_fall);
23 %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
24 @EXPORT_OK = qw( );
25
26 ( grep /gen\$com/i, @INC ) || unshift @INC, "gen\$com";
27 }
28
29 use vars @EXPORT_OK;
30 use subs qw(xtvxxxx_desc pass_cobol_params db_login already_sent_letter
31 term_acyr ahist_level term_last_year date_last_year state_name like2re
32 ssn2pidm vnum2pidm next_fall);
33 use DBI;
34 use WOU_Secure;
35
36
37 # ============================================================================
38 # Package-Level Stuff
39 # ============================================================================
40
41 my (%glbh_sth_xtvxxxx_desc, @row);
42
43 my %glb_prepared_sql; # Hash that holds $sth's for prepared sql;
44 # helps performance. Entries are of the form:
45 # ( "sth_qry_acyr" => $sth_qry_acyr, ... )
46
47 my ($sth_qry_acyr, $sth_qry_state_name, $sth_qry_ssn2pidm1, $sth_qry_ssn2pidm2,
48 $sth_qry_vnum2pidm);
49
50
51 # ============================================================================
52 # Routines
53 # ============================================================================
54
55 # better (for performance) to make xtvxxxx_desc lookups available as separate
56 # routines rather than joining them in to sgbstdn, etc. Calling program
57 # can call them on (probably) smaller population.
58 sub xtvxxxx_desc {
59 my ($dbh, $tbl_name, $code) = @_;
60
61 # make sure below only executes once per package instance per tbl_name
62 if (! exists $glbh_sth_xtvxxxx_desc{$tbl_name} ) {
63 $glbh_sth_xtvxxxx_desc{$tbl_name} = $dbh->prepare(
64 "select $tbl_name" . "_desc " .
65 "from $tbl_name where $tbl_name" . "_code = '$code'");
66 }
67
68 ($glbh_sth_xtvxxxx_desc{$tbl_name} )->execute;
69
70 @row = ($glbh_sth_xtvxxxx_desc{$tbl_name} )->fetchrow_array;
71
72 if (@row) { return $row[0] }
73
74 return "Unknown"; # fall-through, code not in xtvxxxx
75 }
76
77
78 sub pass_cobol_params {
79 my ($program, $uid, $passwd, $one_up_no, $rh_parms) = @_;
80
81 my ($job, $parm_no, $parm_name);
82
83 my $dbh = db_login($uid, $passwd, $program);
84
85 $job = sis_object($program);
86
87 my $sth_ins_gjbprun = $dbh->prepare( q{
88 insert into gjbprun(gjbprun_job,
89 gjbprun_one_up_no,
90 gjbprun_number,
91 gjbprun_activity_date,
92 gjbprun_value)
93 values( upper(?),
94 ?,
95 ?,
96 sysdate,
97 ? ) } );
98
99 my $sth_ins_gjbprun_dyn = $dbh->prepare( q{
100 insert into gjbprun(gjbprun_job,
101 gjbprun_one_up_no,
102 gjbprun_number,
103 gjbprun_activity_date,
104 gjbprun_label,
105 gjbprun_value)
106 values( upper(?),
107 ?,
108 ?,
109 sysdate,
110 ?,
111 ? ) } );
112
113 # put program params in gjbprun table
114 foreach $parm_no ( keys %{$rh_parms} ) {
115 if ($parm_no ne "88") {
116 $sth_ins_gjbprun->execute($job, $one_up_no, $parm_no,
117 $rh_parms->{$parm_no} );
118 }
119 else { # "dynamic" params
120 foreach $parm_name (keys %{$rh_parms->{$parm_no} } ) {
121 $sth_ins_gjbprun_dyn->execute(
122 $job, $one_up_no, $parm_no, $parm_name,
123 $rh_parms->{$parm_no}->{$parm_name} );
124 }
125 }
126 }
127
128 $dbh->disconnect;
129 }
130
131
132 sub db_login {
133 my ($uid, $passwd, $program, $rh_params) = @_;
134
135 my $dbh = DBI->connect("dbi:Oracle:", $uid, $passwd, $rh_params)
136 or die "$!: Can't connect to DB";
137
138 # convert VMS full path of this file to SIS Object
139 my $sis_object = sis_object($program);
140
141 # set security role for user in SIS Database
142 if (! gwrsecp($dbh, $sis_object) ) {
143 $dbh->disconnect;
144 die "$!: User $uid not allowed to run $sis_object";
145 }
146 return $dbh;
147 }
148
149
150 sub already_sent_letter {
151
152 my ($dbh, $pidm, $term, $module, $sys_ind, $letr, $update_mail) = @_;
153
154 my ($date_printed, $rowid);
155
156 $update_mail = defined($update_mail) ? uc($update_mail) : "U";
157 # default is "Update"
158
159 my $sql_qry_gurmail =
160 "select gurmail_date_printed, \
161 gurmail.rowid \
162 from gurmail \
163 where gurmail_pidm = $pidm and \
164 gurmail_term_code = '$term' and \
165 gurmail_module_code = '$module' and \
166 gurmail_system_ind = '$sys_ind' and \
167 gurmail_letr_code = '$letr'\n"; # jhjh
168
169 my $sth_qry_gurmail = $dbh->prepare($sql_qry_gurmail);
170
171 $sth_qry_gurmail->execute;
172
173 my @row = $sth_qry_gurmail->fetchrow_array;
174
175 if (@row) {
176 ($date_printed, $rowid) = @row;
177 if ($date_printed) { # already sent letter
178 return 1;
179 }
180 else {
181 if ($update_mail ne "A") { # if not "Audit" mode
182 $dbh->do("update gurmail \
183 set gurmail_date_printed = sysdate \
184 where gurmail.rowid = '$rowid'");
185 }
186 return 0;
187 }
188 }
189
190 else {
191 if ($update_mail ne "A") { # if not "Audit" mode
192 # create gurmail record for new letter
193 $dbh->do( "\
194 INSERT INTO GURMAIL ( GURMAIL_PIDM, \
195 gurmail_term_code, \
196 gurmail_module_code, \
197 GURMAIL_SYSTEM_IND, \
198 GURMAIL_LETR_CODE, \
199 GURMAIL_DATE_INIT, \
200 GURMAIL_USER, \
201 GURMAIL_PUB_GEN, \
202 GURMAIL_ORIG_IND, \
203 GURMAIL_ACTIVITY_DATE, \
204 gurmail_date_printed) \
205 \
206 values ( $pidm, \
207 '$term', \
208 '$module', \
209 '$sys_ind', \
210 '$letr', \
211 TO_DATE(TO_CHAR(SYSDATE,'DD-MON-YYYY HH24:MI:SS'), \
212 'DD-MON-YYYY HH24:MI:SS'), \
213 USER, \
214 'G', \
215 'S', \
216 SYSDATE, \
217 sysdate)" );
218 }
219
220 return 0;
221 }
222 }
223
224
225 sub term_acyr {
226 my ($dbh, $term) = @_;
227
228 my ($acyr, @row);
229
230 # for performance we will only prepare repeated sql once
231 if (exists $glb_prepared_sql{"sth_qry_acyr"} ) {
232 $sth_qry_acyr = $glb_prepared_sql{"sth_qry_acyr"};
233 }
234 else {
235 $sth_qry_acyr = $dbh->prepare( q{
236 select stvacyr_desc from stvacyr where stvacyr_code = ?} );
237
238 $glb_prepared_sql{"sth_qry_acyr"} = $sth_qry_acyr;
239 }
240
241 if (defined($term) ) {
242 $acyr = substr( substr($term, 0, 4), 2, 2);
243 $acyr .= sprintf("%.2i", $acyr + 1);
244
245 $sth_qry_acyr->execute($acyr);
246 @row = $sth_qry_acyr->fetchrow_array;
247
248 if (@row) {
249 return $row[0];
250 } # otherwise fall-through
251 }
252
253 return "Unknown"; # fall-through
254 }
255
256
257 sub term_last_year{
258 my $term = shift;
259
260 return (substr($term, 0, 4) - 1) . substr($term, 4, 2);
261
262 }
263
264
265 sub date_last_year{
266 my $date = shift;
267 # date must be formatted mm/dd/yyyy, output will be in same format
268
269 return substr($date, 0, 6) . (substr($date, 6, 4) - 1);
270
271 }
272
273
274 sub ahist_level {
275
276 my $level = shift;
277
278 $level =~ s/NG|PB/GR/ || $level =~ s/PN|NU|NA/UG/;
279
280 return $level;
281 }
282
283
284 sub state_name{
285 my ($dbh, $stat_code) = @_;
286
287 my ($state_name);
288
289 # for performance we will only prepare repeated sql once
290 if (exists $glb_prepared_sql{"sth_qry_state_name"} ) {
291 $sth_qry_state_name = $glb_prepared_sql{"sth_qry_state_name"};
292 }
293 else {
294 $sth_qry_state_name = $dbh->prepare( q{
295 select stvstat_desc from stvstat where stvstat_code = ? } );
296
297 $glb_prepared_sql{"sth_qry_state_name"} = $sth_qry_state_name;
298 }
299
300 $sth_qry_state_name->execute($stat_code);
301
302 ($state_name) = $sth_qry_state_name->fetchrow_array;
303
304 return $state_name ? $state_name : "";
305 }
306
307
308 sub like2re {
309
310 my ($str, $word, $negative);
311 $negative = 0;
312
313 # stop on LIKE for LIKE/NOT LIKE
314 while ( ($word = shift) !~ /^like$/i ) {
315 if ($word =~ /^not$/i) {
316 $negative = 1;
317 }
318 else { $str .= $word . "," } # replace whitespace w/ comma's just like the
319 # parser does
320 }
321 $str .= $word . ","; # add LIKE to $str
322
323 $word = shift; # $word now holds the SQL LIKE expression
324
325
326 # if LIKE expr contains SQL % wildcard, then turn into perl reg exp
327 if ( $word =~ /'(.*%.*)'/i ) {
328
329 $word = $1;
330 $str =~ s/like,$/=~,/i;
331
332 $negative && ( $str =~ s/=~/!~/ );
333
334 $word =~ s/^([^%])/\^$1/;
335 $word =~ s/([^%])$/$1\$/;
336 $word =~ s/%/\.\*/g;
337 $word = "/" . $word . "/";
338
339 }
340
341 # otherwise turn like into "=" ( we will turn "=" into "eq" in get_data(),
342 # this sub is used by the obj_srvr yacc parser)
343 else {
344 $str =~ s/like,$/=,/i;
345 }
346
347 $str .= $word;
348
349 return $str;
350
351 }
352
353
354 sub ssn2pidm {
355
356 my ($dbh, $ssn) = @_;
357
358 my $pidm;
359
360 # for performance we will only prepare repeated sql once
361 if (exists $glb_prepared_sql{"sth_qry_ssn2pidm1"} ) {
362 $sth_qry_ssn2pidm1 = $glb_prepared_sql{"sth_qry_ssn2pidm1"};
363 $sth_qry_ssn2pidm2 = $glb_prepared_sql{"sth_qry_ssn2pidm2"};
364 }
365 else {
366 $sth_qry_ssn2pidm1 = $dbh->prepare( q{
367 select spbpers_pidm
368 from spbpers
369 where spbpers_ssn = ? } );
370
371 $glb_prepared_sql{"sth_qry_ssn2pidm1"} = $sth_qry_ssn2pidm1;
372
373
374 $sth_qry_ssn2pidm2 = $dbh->prepare( q{
375 select spriden_pidm
376 from spriden
377 where spriden_id = ? and
378 spriden_change_ind = 'I' } );
379
380 $glb_prepared_sql{"sth_qry_ssn2pidm2"} = $sth_qry_ssn2pidm2;
381 }
382
383 $sth_qry_ssn2pidm1->execute($ssn);
384
385 ($pidm) = $sth_qry_ssn2pidm1->fetchrow_array;
386
387 if ( !defined($pidm) ) {
388
389 $sth_qry_ssn2pidm2->execute($ssn);
390
391 ($pidm) = $sth_qry_ssn2pidm2->fetchrow_array;
392 }
393
394 return $pidm;
395 }
396
397
398 sub vnum2pidm {
399
400 my ($dbh, $vnum) = @_;
401
402 my $pidm;
403
404 # for performance we will only prepare repeated sql once
405 if (exists $glb_prepared_sql{"sth_qry_vnum2pidm"} ) {
406 $sth_qry_vnum2pidm = $glb_prepared_sql{"sth_qry_vnum2pidm"};
407 }
408 else {
409 $sth_qry_vnum2pidm = $dbh->prepare( q{
410 select spriden_pidm
411 from spriden
412 where spriden_id = ? and
413 spriden_change_ind is null } );
414
415 $glb_prepared_sql{"sth_qry_vnum2pidm"} = $sth_qry_vnum2pidm;
416 }
417
418 $sth_qry_vnum2pidm->execute($vnum);
419
420 ($pidm) = $sth_qry_vnum2pidm->fetchrow_array;
421
422 return $pidm;
423 }
424
425
426 sub next_fall {
427
428 my $term = shift;
429
430 # return next fall from any term during the year
431 return substr($term + 100, 0, 4) . "01";
432 }
433
434 # ============================================================================
435 # Subroutines
436 # ============================================================================
437
438 return 1;
439
440

  ViewVC Help
Powered by ViewVC 1.1.26