File Coverage

blib/lib/oEdtk/trackEdtk.pm
Criterion Covered Total %
statement 31 266 11.6
branch 1 62 1.6
condition 0 22 0.0
subroutine 11 33 33.3
pod 0 22 0.0
total 43 405 10.6


line stmt bran cond sub pod time code
1             package oEdtk::trackEdtk;
2            
3             BEGIN {
4 1     1   7 use oEdtk::Main 0.42;
  1         22  
  1         486  
5 1     1   9 use Config::IniFiles;
  1         3  
  1         26  
6 1     1   5 use Sys::Hostname;
  1         3  
  1         64  
7 1     1   7 use Digest::MD5 qw(md5_base64);
  1         2  
  1         60  
8 1     1   6 use DBI;
  1         2  
  1         48  
9 1     1   6 use Cwd qw(abs_path);
  1         1  
  1         47  
10 1     1   6 use strict;
  1         1  
  1         35  
11            
12 1     1   7 use Exporter;
  1         2  
  1         41  
13 1     1   5 use vars qw($VERSION @ISA @EXPORT_OK); # @EXPORT %EXPORT_TAGS);
  1         2  
  1         95  
14            
15 1     1   9 $VERSION = 0.0034;
16 1         19 @ISA = qw(Exporter);
17             # @EXPORT = qw(
18             # );
19            
20 1         3966 @EXPORT_OK = qw(
21             ini_Edtk_Conf conf_To_Env
22             env_Var_Completion
23            
24             init_Tracking track_Obj
25             define_Mod_Ed define_Job_Evt
26             define_Track_Key
27            
28             edit_Track_Table
29             create_Track_Table prepare_Tracking_Env
30             drop_Track_Table
31             )
32            
33             }
34            
35             # 3 méthodes possibles d'alimentation (config edtk.ini -> EDTK_TRACK_MODE) :
36             # -1- DB : suivi directement dans un SGBD (DB)-> ralentissement du traitement de prod (insérer les info de suivi en fin de traitement pour limiter l'impact => END du module ?)
37             # -2- FDB : suivi via SQLite -> pas de gestion de plusieurs accès en temps réel => créer 1 fichier db par process (procDB)-> organiser une consolidation des données
38             # -3- LOG : fichiers de suivi à plat -> organiser une consolidation des données
39             #
40             # ? A VOIR : bug dans la création dynamique du fichier SQLite, on utilise pas le TSTAMP/PROCESS_ID ???
41            
42             my $DBI_DNS ="";
43             my $DBI_USER ="";
44             my $DBI_PASS ="";
45             my $TABLENAME ="tracking_oEdtk";
46            
47             my $ED_HOST ="";
48             my $ED_TSTAMP ="";
49             my $ED_PROC ="";
50             my $ED_SNGL_ID ="";
51             my $ED_USER ="";
52             my $ED_SEQ ="";
53             my $ED_APP ="";
54             my $ED_MOD_ED ="";
55             my $ED_JOB_EVT ="";
56             my $ED_OBJS ="";
57             my @ED_K_NAME;
58             my @ED_K_VAL;
59            
60             my @TRACKED_OBJ;
61             my @DB_USER_COL;
62            
63             my $NOK=-1;
64            
65            
66             sub ini_Edtk_Conf {
67             # recherche du fichier de configuration
68             # renvoi le chemin au fichier de configuration valide
69 0     0 0   my $iniEdtk =$INC{'oEdtk/trackEdtk.pm'};
70 0           $iniEdtk =~s/(trackEdtk\.pm)//;
71 0           $iniEdtk .="iniEdtk/edtk.ini";
72 0           my $hostname =uc ( hostname());
73            
74             # OUVERTURE DU FICHIER DE CONFIGURATION
75 0           my $tmpIniEdtk =$iniEdtk;
76 0           my $confIni;
77 0           while ($tmpIniEdtk ne 'local'){
78 0 0         if (! (-e $tmpIniEdtk)){die "ERR. config file not found : $tmpIniEdtk\n";}
  0            
79 0           $confIni = Config::IniFiles->new( -file => $tmpIniEdtk, -default => 'DEFAULT');
80            
81 0           $iniEdtk =$tmpIniEdtk;
82             # recherche de la variable iniEdtk dans la section '$hostname' ou par défaut
83             # dans la section 'DEFAULT' (cf méthode new)
84 0           $tmpIniEdtk=$confIni->val( $hostname, 'iniEdtk' );
85            
86             # si iniEdtk == fichier courant alors mettre la valeur à local (éviter les boucle infinies)
87 0 0         if ($tmpIniEdtk eq $iniEdtk) { last; }
  0            
88             }
89            
90 0           $ENV{EDTK_INIEDTK} =$iniEdtk;
91 0           return $iniEdtk;
92             }
93            
94            
95             sub conf_To_Env ($;$) {
96             # charge les sections demandées du fic de config dans la configuration d'environnement
97             # en param, passer le chemin d'accès au fichier ini + la section à charger
98             # si la section HOSTNAME existe elle surcharge les valeurs de la section
99 0     0 0   my $confIni=shift;
100 0           my $section=shift;
101 0   0       $section ||='DEFAULT';
102            
103 0 0         if (-e $confIni){
104             } else {
105 0           die "ERR. config file not found : $confIni\n";
106             }
107            
108 0           my $hostname =uc ( hostname());
109            
110             # OUVERTURE DU FICHIER DE CONFIGURATION
111 0           my %hConfIni;
112 0           tie %hConfIni, 'Config::IniFiles',( -file => $confIni );
113            
114             # CHARGEMENT DES VALEURS DE LA SECTION
115 0           my %hSection;
116 0 0         if (exists $hConfIni{$section}) {
117 0           %hSection =%{$hConfIni{$section}};
  0            
118             }
119            
120             # CHARGEMENT EN SURCHARGE DES VALEURS PROPRES AU HOSTNAME
121 0           my %hHostname;
122 0 0         if (exists $hConfIni{$hostname}) {
123 0           undef %hSpecific;
124 0           %hHostname =%{$hConfIni{$hostname}};
  0            
125             } else {
126 0           warn "INFO machine '$hostname' inconnue dans la configuration";
127             }
128 0           %hConfig=(%hSection,%hHostname);
129            
130 0           my $self = abs_path($0);
131 0           $self =~ /([\w\.\-]+)[\/\\]\w+\.\w+$/;
132             # DÉFINITION POUR L'ENVIRONNEMENT DE DÉV DE L'APPLICATION/PROGRAMME COURANT
133 0           $hConfig{'EDTK_PRGNAME'} =$1;
134             #$hConfig{'EDTK_OPTJOB'} =$EDTK_OPTJOB;
135            
136             # mise en place des variables d'environnement
137 0           while ((my $cle, my $valeur) = each (%hConfig)){
138 0   0       $valeur ||="";
139 0           $ENV{$cle}=$valeur;
140             }
141 0           1;
142             }
143            
144            
145             sub env_Var_Completion (\$){
146             # développe les chemins en remplaçant les variables d'environnement par les valeurs réelles
147             # tous les niveaux d'imbrication définis dans les variables d'environnement sont développés
148             # nécessite au préalable que les variables d'environnements soient définies
149 0     0 0   my $rScript =shift;
150             # il peut y avoir des variables dans les variables d'environnement elles mêmes
151 0           while (${$rScript}=~/\$/g) {
  0            
152 0           ${$rScript}=~s/\$(\w+)/${ENV{$1}}/g;
  0            
153             }
154 0           ${$rScript}=~s/(\/)/\\/g;
  0            
155 0           1;
156             }
157            
158            
159             ################################################################################
160             # PARTIE DEFINITION SUIVI DE PRODUCTION
161             #
162             #
163             my $DBH;
164             my %h_subInsert;
165            
166             # definition de la méthode d'insertion
167             $h_subInsert{'LOG'}=\&subInsert_Log;
168             $h_subInsert{'DB'} =\&subInsert_DB;
169             $h_subInsert{'FDB'}=\&subInsert_DB;
170             $h_subInsert{'none'}=\&noSub;
171            
172             my %h_subClose;
173             $h_subClose{'DB'} =\&subClose_DB;
174             $h_subClose{'FDB'}=\&subClose_DB;
175            
176            
177             sub prepare_Tracking_Env() {
178 0     0 0   my $iniEdtk =ini_Edtk_Conf();
179 0           conf_To_Env($iniEdtk, 'ENVDESC');
180 0           conf_To_Env($iniEdtk, 'EDTK_DB');
181 0           oe_uc_sans_accents($ENV{EDTK_TRACK_MODE});
182            
183 0           1;
184             }
185            
186             sub open_Tracking_Env(){
187 0 0   0 0   if ($ENV{EDTK_TRACK_MODE} =~/FDB/i){
    0          
    0          
188             # DB FILE oe_now_time/PROCESS
189 0           $ENV{EDTK_DBI_DNS}=~s/(.+)\.(\w+)$/$1\.$ED_TSTAMP\.$ED_PROC\.$2/;
190 0           warn "INFO tracking to $ENV{EDTK_DBI_DSN}\n";
191 0           create_Track_Table($ENV{EDTK_DBI_DSN});
192 0           open_DBI();
193            
194             } elsif ($ENV{EDTK_TRACK_MODE} =~/LOG/i){
195             # log
196            
197             } elsif ($ENV{EDTK_TRACK_MODE} =~/DB/i){
198             # DB connexion tracking
199 0           open_DBI();
200            
201             } else {
202 0           $ENV{EDTK_TRACK_MODE} = "none";
203            
204             }
205            
206 0 0 0       if (!($h_subInsert{$ENV{EDTK_TRACK_MODE}}) && !($h_subCreate{$ENV{EDTK_TRACK_MODE}})){
207 0           warn "INFO $ENV{EDTK_TRACK_MODE} undefined - tracking halted\n";
208 0           $ENV{EDTK_TRACK_MODE} ="none";
209             }
210            
211 0           1;
212             }
213            
214             sub open_DBI(){
215 0     0 0   my $dbargs = { AutoCommit => $ENV{EDTK_DBI_AutoCommit},
216             RaiseError => $ENV{EDTK_DBI_RaiseError},
217             PrintError => $ENV{EDTK_DBI_PrintError}};
218            
219 0 0         $DBH = DBI->connect( $ENV{EDTK_DBI_DSN},
220             $ENV{EDTK_DBI_DSN_USER},
221             $ENV{EDTK_DBI_DSN_PASS}
222             # ,$dbargs
223             )
224             or die "ERR no connexion to $ENV{EDTK_DBI_DSN} " . DBI->errstr;
225            
226 0           1;
227             }
228            
229            
230             sub init_Tracking(;@){
231 0     0 0   my $Mod_Ed =shift;
232 0           my $Typ_Job =shift;
233 0           my $Job_User =shift;
234 0           my @Track_Key =@_;
235 0           define_Mod_Ed ($Mod_Ed); # U(ndef) by default
236 0           define_Job_Evt ($Typ_Job); # S(pool) by default
237 0           define_Job_User($Job_User); # user job request, by default 'None'
238 0           $ED_HOST =hostname();
239 0           $ED_TSTAMP =oe_now_time();
240 0           $ED_PROC =$$;
241 0           $ED_SEQ =0; # (dynamic, private)
242 0           $ED_SNGL_ID = md5_base64($ED_HOST.$ED_TSTAMP.$ED_PROC);
243            
244 0           &prepare_Tracking_Env();
245 0           &open_Tracking_Env();
246            
247 0           my $indice =0;
248 0           foreach my $element (@Track_Key) {
249 0           define_Track_Key($element, $indice++); # default key for indiced col_name
250             }
251            
252 0           $0 =~/([\w-]+)[\.plmex]*$/;
253 0 0         $1 ? $ED_APP ="application" : $ED_APP =$1;
254            
255 0           $ED_OBJS =1; ## default insert unit count (dynamic)
256            
257 0           warn "INFO tracking init ( track mode : $ENV{EDTK_TRACK_MODE}, edition mode : $ED_MOD_ED, job type : $ED_JOB_EVT, user : $ED_USER, optional Keys : @ED_K_NAME )\n";
258            
259 0           return $ED_SNGL_ID;
260             }
261            
262            
263             sub track_Obj (;@){
264             # track_Obj ([$ED_OBJS, $ED_JOB_EVT, @ED_K_VAL])
265             # $ED_OBJS (optionel) : nombre d'unité de l'objet (1 par defaut)
266             # $ED_JOB_EVT (optio) : evenement en question (cf define_Job_Evt)
267             # @ED_K_VAL(optionel) : valeurs des clefs optionnels définies avec init_Tracking (même ordre)
268            
269 0     0 0   $ED_SEQ++;
270 0           $ED_OBJS =shift;
271 0   0       $ED_OBJS ||=1;
272 0           define_Job_Evt (shift);
273 0           @ED_K_VAL =@_;
274            
275 0           undef @TRACKED_OBJ;
276 0           push (@TRACKED_OBJ, oe_now_time());
277 0           push (@TRACKED_OBJ, $ED_USER);
278 0           push (@TRACKED_OBJ, $ED_SEQ);
279 0           push (@TRACKED_OBJ, $ED_SNGL_ID);
280 0           push (@TRACKED_OBJ, $ED_APP);
281 0           push (@TRACKED_OBJ, $ED_MOD_ED);
282            
283 0           push (@TRACKED_OBJ, $ED_JOB_EVT);
284 0           push (@TRACKED_OBJ, $ED_OBJS);
285 0           undef @DB_USER_COL;
286 0           for (my $i=0 ; $i <= $#ED_K_VAL ; $i++) {
287 0   0       push (@TRACKED_OBJ, $ED_K_NAME[$i] || "");
288 0   0       push (@TRACKED_OBJ, $ED_K_VAL[$i] || "");
289 0           push (@DB_USER_COL, "ED_K${i}_NAME");
290 0           push (@DB_USER_COL, "ED_K${i}_VAL");
291             }
292            
293 0 0         &{$h_subInsert{$ENV{EDTK_TRACK_MODE}}}
  0            
294             or die "ERR. undefined EDTK_TRACK_MODE -> $ENV{EDTK_TRACK_MODE}\n";
295 0           1;
296             }
297            
298            
299             sub define_Mod_Ed ($) {
300             # Printing Mode : looking for one of the following :
301             # Undef (default), Batch, Tp, Web, Mail
302 0     0 0   my $value =shift;
303            
304 0 0         if ($value) { $ED_MOD_ED =$value };
  0            
305 0           $ED_MOD_ED =~ /([NBTWM])/;
306 0           $ED_MOD_ED =$1;
307 0   0       $ED_MOD_ED ||="U"; # Undef by default
308            
309 0           return $ED_MOD_ED;
310             }
311            
312            
313             sub define_Job_Evt ($) {
314             # Job Event : looking for one of the following :
315             # Job (default), Spool, Document, Line, Warning, Error
316 0     0 0   my $value =shift;
317            
318 0 0         if ($value) { $ED_JOB_EVT =$value };
  0            
319 0           $ED_JOB_EVT =~ /([JSDLWE])/;
320 0           $ED_JOB_EVT =$1;
321 0   0       $ED_JOB_EVT ||="J"; # Job by default
322            
323 0           return $ED_JOB_EVT;
324             }
325            
326            
327             sub define_Job_User ($) {
328             # USER JOB REQUEST : LOOKING FOR ONE OF THE FOLLOWING :
329             # None (default), user Id (max 10 alphanumerics)
330 0     0 0   my $value =shift;
331            
332 0 0         if ($value=~/(\w{1,10})/) {
333 0           $ED_USER =$1;
334             } else {
335 0           $ED_USER ="None";
336             }
337            
338 0           return $ED_USER;
339             }
340            
341            
342             sub define_Track_Key ($;$) {
343             # TO DEFINE THE COL_NAME OF THE N INDICED TRACKING KEY
344 0     0 0   my $value =shift;
345 0           my $indice =shift;
346 0   0       $indice ||=0;
347            
348 0 0         if (!defined $ENV{EDTK_MAX_USER_KEY}) {
    0          
    0          
349 0           warn "INFO : tracking key undefined\n";
350 0           return 0;
351            
352             } elsif ($indice gt ($ENV{EDTK_MAX_USER_KEY}-1)) {
353 0           warn "INFO : tracking key not allowed (limit is $ENV{EDTK_MAX_USER_KEY})\n";
354 0           return 0;
355            
356             } elsif (length ($value) > 5) {
357 0           $value=~s/^(\w{5})(.*)/$1/;
358 0           warn "INFO : redefined col as '$value'";
359             }
360 0 0         if ($value) { $ED_K_NAME[$indice] =$value; }
  0            
361            
362 0           $ED_K_NAME[$indice] =~ s/\s/\_/g;
363 0           oe_uc_sans_accents($ED_K_NAME[$indice]);
364            
365 0           return $ED_K_NAME[$indice];
366             }
367            
368            
369             sub subInsert_Log(){
370             # DANS LE CAS D'UN SUIVI SOUS FORME DE FICHIERS LOG
371             # à compléter avec l'utisation du remplaçant du Logger
372            
373 0     0 0   my $request =join (", ", @TRACKED_OBJ);
374 0           warn "$request\n";
375            
376 0           1;
377             }
378            
379            
380             sub subInsert_DB() {
381             # constructuction de la commande SQL pour insertion dans une base DBI (file/DB)
382            
383 0     0 0   my $request="insert into $ENV{EDTK_DBI_TRACKING}";
384 0           $request .=" (";
385 0           $request .="ED_TSTAMP, ED_USER, ED_SEQ, ED_SNGL_ID, ED_APP, ED_MOD_ED, ED_JOB_EVT, ED_OBJ_COUNT";
386 0 0         if (@DB_USER_COL) {
387 0           $request .=", ";
388 0           $request .=join (", ", @DB_USER_COL);
389             }
390 0           $request .=" ) values ('";
391             # FORMATAGE DE LA DATE POUR LES SGBD
392             # $request .=sprintf ("to_date('%014.f', 'YYYYMMDDHH24MISS'), '", shift @TRACKED_OBJ);
393 0           $request .=join ("', '", @TRACKED_OBJ);
394 0           $request .="')";
395            
396 0           $DBH->do($request);
397 0 0         if ($DBH->err()) {
398 0           warn "INFO ".$DBI::errstr."\n";
399             }
400            
401             # $DBH->commit(); # nécessaire si AutoCommit vaut 0
402             # $DBH->disconnect();
403             # if ($DBH->err()) { warn "$DBI::errstr\n"; }
404 0           1;
405             }
406            
407             sub noSub(){
408             # FONCTION A VIDE POUR LES POINTEURS DE FONCTION %H_SUBINSERT
409             # pour éviter d'utiliser des tests dans des fonctions répétitives
410             # (faux switch/case)
411 0     0 0   return 1;
412             }
413            
414            
415             sub test_exist_table(){
416 0     0 0   my $dbargs = { AutoCommit => $ENV{EDTK_DBI_AutoCommit},
417             RaiseError => $ENV{EDTK_DBI_RaiseError},
418             PrintError => $ENV{EDTK_DBI_PrintError}};
419 0 0         $DBH = DBI->connect($ENV{EDTK_DBI_DSN},
420             $ENV{EDTK_DBI_DSN_USER},
421             $ENV{EDTK_DBI_DSN_PASS}
422             ,$dbargs
423             )
424             or die "ERR no connexion to $ENV{EDTK_DBI_DSN} " . DBI->errstr;
425            
426 0           my $request="select * from $ENV{EDTK_DBI_TABLENAME}";
427            
428 0           $DBH->do($request);
429 0 0         if ($DBI::errstr) {
430 0 0         if ( $DBI::errstr =~/no such table/ ) {
431 0           $DBH->disconnect();
432 0           return 0;
433             }
434 0           warn "INFO ".$DBI::errstr."\n";
435 0           $DBH->disconnect();
436 0           return $NOK;
437             }
438 0           $DBH->disconnect();
439            
440 0           1;
441             }
442            
443            
444             sub edit_Track_Table(;$){
445 0     0 0   my $request=shift;
446            
447 0           &open_DBI();
448            
449 0           my $ref_Tab =&fetchall_DBI($request);
450 0           &edit_All_rTab($ref_Tab);
451 0           1;
452             }
453            
454            
455             sub create_Track_Table(){
456             #my $dbi_dns=shift;
457            
458             # CREATE TABLE tablename [IF NOT EXISTS][TEMPORARY] (column1data_type, column2data_type, column3data_type);
459             #&prepare_Tracking_Env();
460             #$dbi_dns ||=$ENV{EDTK_DBI_DNS};
461            
462 0     0 0   my $dbargs = { AutoCommit => 0,
463             RaiseError => 0,
464             PrintError => 0 };
465 0 0         $DBH = DBI->connect($ENV{EDTK_DBI_DSN},
466             $ENV{EDTK_DBI_DSN_USER},
467             $ENV{EDTK_DBI_DSN_PASS},
468             $dbargs)
469             or die "ERR no connexion to $ENV{EDTK_DBI_DSN} " . DBI->errstr;
470            
471 0           my $struct="CREATE TABLE $ENV{EDTK_DBI_TABLENAME} ";
472 0           $struct .="( ED_TSTAMP NUMBER(14) NOT NULL"; # interesting for formated date and interval search
473             # $struct .="( ED_TSTAMP VARCHAR2(14) NOT NULL"; # most used
474             # $struct .="( ED_TSTAMP DATE NOT NULL"; # Not compatible
475             # $struct .=", ED_HOST VARCHAR2(15) NOT NULL"; # hostname
476             # $struct .=", ED_PROC VARCHAR2(6) NOT NULL"; # processus
477 0           $struct .=", ED_USER VARCHAR2(10) NOT NULL"; # job request user
478 0           $struct .=", ED_SEQ NUMBER(9) NOT NULL"; # sequence
479 0           $struct .=", ED_SNGL_ID VARCHAR2(22) NOT NULL"; # Single ID
480 0           $struct .=", ED_APP VARCHAR2(15) NOT NULL"; # application name
481 0           $struct .=", ED_MOD_ED CHAR"; # mode d'edition (Batch, Tp, Web, Mail)
482 0           $struct .=", ED_JOB_EVT CHAR"; # niveau de l'événement dans le job(Spool, Document, Line, Warning, Error)
483 0           $struct .=", ED_OBJ_COUNT NUMBER(15)"; # nombre d'éléments/objets attachés à l'événement
484            
485 0           for (my $i=0 ; $i lt $ENV{EDTK_MAX_USER_KEY} ; $i++) {
486 0           $struct .=", ED_K${i}_NAME VARCHAR2(5)"; # nom de clef $i
487 0           $struct .=", ED_K${i}_VAL VARCHAR2(30)"; # valeur clef $i
488             }
489 0           $struct .=")"; #, CONSTRAINT pk_$ENV{EDTK_DBI_TABLENAME} PRIMARY KEY (ED_TSTAMP, ED_PROC, ED_SEQ)";
490            
491 0           $DBH->do($struct);
492 0 0         if ($DBI::errstr) {
493 0           warn "INFO ".$DBI::errstr."\n";
494             }
495            
496             # my $seq ="CREATE SEQUENCE sq_$TABLENAME
497             # MINVALUE 1
498             # MAXVALUE 999999999
499             # START WITH 1
500             # INCREMENT BY 1;";
501             #$dbh->do("$seq");
502            
503 0           $DBH->commit(); # nécessaire si AutoCommit vaut 0
504 0           $DBH->disconnect();
505 0           1;
506             }
507            
508            
509             sub drop_Track_Table(){
510 0     0 0   &prepare_Tracking_Env();
511 0           &open_DBI();
512            
513 0           warn "=> Drop table $ENV{EDTK_DBI_TABLENAME} from $ENV{EDTK_DBI_DSN}, if exist\n\n";
514 0           $DBH->do("DROP TABLE $ENV{EDTK_DBI_TABLENAME}");
515 0           $DBH->disconnect;
516            
517 0           1;
518             }
519            
520            
521             sub fetchall_DBI(;$) {
522             # CONNEXION À UNE TABLE DBI POUR SELECT VERS UNE RÉFÉRENCE DE TABLEAU
523             # sélection de toutes les données correspondant à un critère
524             # option : requete à passer, exemple "SELECT * FROM TRACKING_OEDTK WHERE ED_MOD_ED = 'T'"
525             # par defaut vaut 'SELECT * from $ENV{EDTK_DBI_TABLENAME}'
526 0     0 0   my $request =shift;
527 0   0       $request ||="SELECT * from $ENV{EDTK_DBI_TABLENAME}";
528            
529 0           my $sql = qq($request);
530 0           my $sth = $DBH->prepare( $sql );
531 0 0         $sth->execute ()
532             || warn "ERR. DBI exec " . $DBH->errstr ;
533            
534 0           my $rTab = $sth->fetchall_arrayref;
535            
536 0           $sth->{Active} = 1; # resolution du bug SQLite "closing dbh with active statement" http://rt.cpan.org/Public/Bug/Display.html?id=9643
537 0           $sth->finish();
538             #$DBH->commit(); # nécessaire si AutoCommit vaut 0 ???
539 0 0         if ($DBI::errstr) {
540 0           warn $DBI::errstr."\n";
541             }
542            
543 0           return $rTab;
544             }
545            
546            
547             sub edit_All_rTab($){
548             # EDITION DE L'ENSEMBLE DES DONNÉES D'UN TABLEAU PASSÉ EN REFÉRENCE
549             # affichage du tableau en colonnes
550 0     0 0   my $rTab=shift;
551            
552 0           for (my $i=0 ; $i<=$#{$rTab} ; $i++) {
  0            
553 0           my $cols = $#{$$rTab[$i]};
  0            
554 0           print "\n$i:\t";
555            
556 0           for (my $j=0 ;$j<=$cols ; $j++){
557 0 0         print "$$rTab[$i][$j]" if (defined $$rTab[$i][$j]);
558             }
559             }
560 0           print "\n";
561            
562 0           1;
563             }
564            
565            
566             sub subClose_DB(){
567 0 0   0 0   $DBH->commit() if ($ENV{EDTK_DBI_AutoCommit} eq 0 ); # nécessaire si AutoCommit vaut 0
568             # $DBH->disconnect();
569 0           1;
570             }
571            
572             END {
573 1 50   1   11 if (exists $h_subClose{EDTK_TRACK_MODE}) {
574 0           &{$h_subClose{$ENV{EDTK_TRACK_MODE}}} ;
  0            
575             }
576             }
577             1;
578            
579            
580            
581            
582             # NOTES
583             #
584             # LISTE DES TABLES
585             # select table_name from tabs;
586             #
587             # Lister les tables du schéma de l'utilisateur courant :
588             # SELECT table_name FROM user_tables;
589             #
590             # Lister les tables accessibles par l'utilisateur :
591             # SELECT table_name FROM all_tables;
592             #
593             # Lister toutes les tables (il faut être ADMIN) :
594             # SELECT table_name FROM dba_tables;
595             #
596             # DESCRIPTION DE LA TABLE :
597             # desc matable; # retourne les champs et leurs types
598            
599            
600            
601             # EXEMPLES REQUETES - http://fadace.developpez.com/sgbdcmp/fonctions/
602             #
603             # SELECT * FROM TRACKING_OEDTK WHERE ED_JOB_EVT='S';
604             # SELECT * FROM TRACKING_OEDTK WHERE ED_MOD_ED='T';
605             # SELECT SUM(ED_OBJ_COUNT) AS "OBJETS" FROM TRACKING_OEDTK WHERE ED_JOB_EVT='D';
606             # SELECT COUNT(ED_OBJ_COUNT) AS "OBJETS" FROM TRACKING_OEDTK WHERE ED_JOB_EVT='D';
607             # SELECT DISTINCT ED_SNGL_ID FROM TRACKING_OEDTK;
608             # SELECT COUNT (DISTINCT ED_SNGL_ID) FROM TRACKING_OEDTK ;
609             # SELECT COUNT (DISTINCT ED_SNGL_ID) FROM TRACKING_OEDTK WHERE ED_JOB_EVT='D';
610             # SELECT COUNT (DISTINCT ED_SNGL_ID) AS "TOTAL" FROM TRACKING_OEDTK WHERE ED_JOB_EVT='D' AND ED_MOD_ED='T';
611             # SELECT ED_TSTAMP, ED_APP, ED_SNGL_ID FROM TRACKING_OEDTK WHERE ED_MOD_ED='T' AND ED_JOB_EVT='S';
612             # SELECT to_char(ED_TSTAMP, 'DD/MM/YYYY HH24:MM:SS'), ED_APP, ED_SNGL_ID FROM TRACKING_OEDTK WHERE ED_MOD_ED='T' AND ED_JOB_EVT='S';
613             # SELECT to_char(ED_TSTAMP, 'DD/MM/YYYY HH24:MM:SS') AS TIME , ED_APP, ED_SNGL_ID FROM TRACKING_OEDTK WHERE ED_MOD_ED='B' AND ED_JOB_EVT='S';
614            
615             # update EDTK_FILIERES SET ed_postcomp =2020 where ed_postcomp<>'FilR100';
616            
617             #
618             # END