/[PAMELA software]/chewbacca/PamOffLineSW/PacketUser.cpp
ViewVC logotype

Annotation of /chewbacca/PamOffLineSW/PacketUser.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.17 - (hide annotations) (download)
Wed Feb 3 14:11:38 2010 UTC (14 years, 9 months ago) by mocchiut
Branch: MAIN
Changes since 1.16: +10 -9 lines
Concurrent job bug fixed

1 mocchiut 1.1 //============================================================================
2 mocchiut 1.17 // $Id: PacketUser.cpp,v 1.16 2010/02/02 15:26:09 mocchiut Exp $
3 mocchiut 1.1 // Description :
4     //============================================================================
5     #include "PacketUser.h"
6     #include <sys/time.h>
7 mocchiut 1.10 #include <iostream>
8 mocchiut 1.1
9 pam-fi 1.8 namespace PamOffLineSW {
10 mocchiut 1.1 extern LogUtil* mainLogUtil;
11 pam-fi 1.8 extern short compression;
12     extern char *outDir;
13 mocchiut 1.1 extern TSQLServer *sqlServer;
14     extern bool multiFile;
15     extern char* fni;
16     extern char * nome_output;
17     extern bool is_new_route;
18     extern unsigned int download;
19    
20 pam-fi 1.8 extern unsigned int mmm_number;
21     extern unsigned int orbit_number;
22 mocchiut 1.1 extern unsigned long int time_Offset;
23     extern bool tryMerge;
24 mocchiut 1.10 extern bool candelete; // EM
25 mocchiut 1.1 //marco_new_01
26     extern bool single_connection;
27    
28     //don't perform check about continuity: it means don't use DB.
29     extern bool do_cont_check;
30    
31     //marco_new_31:
32 pam-fi 1.8 extern char* db_user;
33     extern char* db_pwd;
34 mocchiut 1.16 extern char* pelosconnection;
35 mocchiut 1.1
36 mocchiut 1.2 //per tenere conto reset obt
37 pam-fi 1.8 extern unsigned long int max_pkt_obt;
38 mocchiut 1.2
39 mocchiut 1.3 #define TAGVALUELEN 4
40 pam-fi 1.8 extern char tag_value[TAGVALUELEN];
41 mocchiut 1.2
42 mocchiut 1.1 PacketUser PacketUser::instance;
43    
44 pam-fi 1.8 int PacketUser::numDiscontinity = 1;
45     int PacketUser::numPKT = 0;
46     int PacketUser::numPKTSaved = 0;
47    
48     PacketUser& PacketUser::getInstance() {
49     return instance;
50     }
51    
52     PacketUser::PacketUser() {
53     gROOT->SetBatch(kTRUE);
54     numDiscontinity = 1;
55     numPKTSaved = 0;
56     numPKT = 0;
57     pkt_number_init = 0;
58     obt_init = 0;
59     pkt_number_last = 0;
60     obt_last = 0;
61     obt_time_sync = 0;
62     last_time_sync_info = 0;
63    
64     //(tassa)
65     obt_time_sync_prevvalue = 0;
66     last_time_sync_info_prevvalue = 0;
67     time_is_estimated = false;
68    
69 mocchiut 1.10 //EM
70     recoverlimit = 400;
71     idtorecover = new TArrayI(100);
72     arsize = 0;
73    
74 pam-fi 1.8 real_time_init = 0;
75     real_time_last = 0;
76     bad_pkt = 0;
77     bad_pkt_EventReader = 0;
78     bad_pkt_CalibReader = 0;
79     reader = NULL;
80     pRun = NULL;
81     reader = new pamela::techmodel::EventReader();
82     Table_ROOT_Good = "ROOT_TABLE";
83     Table_ROOT_Bad = "ROOT_TABLE_BAD";
84     Table_GL_RESURS_OFFSET = "GL_RESURS_OFFSET";
85     Table_ROOT_Merging = "ROOT_TABLE_MERGING";
86     // good_pkt_Calib=0;
87     my_id = 0;
88     boot_number = 0;
89     //(tassa)
90     boot_number_prevvalue = 0;
91    
92     //(tassa)
93     // id_to_recover[1000]; // Emiliano: che si vuole fare con questa riga? cosi` non fa nulla...
94     id_to_recover_index = 0;
95     }
96    
97     PacketUser::~PacketUser() {
98     if (reader) {
99     delete reader;
100     reader = NULL;
101     }
102     numDiscontinity = 1;
103     numPKTSaved = 0;
104     numPKT = 0;
105     pkt_number_init = 0;
106     obt_init = 0;
107     pkt_number_last = 0;
108     obt_last = 0;
109     obt_time_sync = 0;
110     last_time_sync_info = 0;
111     obt_time_sync_prevvalue = 0;
112     last_time_sync_info_prevvalue = 0;
113     time_is_estimated = false;
114    
115     real_time_init = 0;
116     real_time_last = 0;
117     bad_pkt = 0;
118     bad_pkt_EventReader = 0;
119     bad_pkt_CalibReader = 0;
120     // good_pkt_Calib=0;
121     my_id = 0;
122     boot_number = 0;
123     boot_number_prevvalue = 0;
124     }
125    
126     //Put the packet in a root file. Create a new ROOT file for each group of packets
127     void PacketUser::usePKT(char*& headerPkt, char*& pamPkt, long int length, bool isCons, bool isPKTGood,
128     const PacketType* type, unsigned long int counter, unsigned long int obt) {
129     //If the packet type was not recognised before
130     if (!type) {
131     return;
132     }
133    
134     //in order to start ...
135     if (numPKT == 0) {
136     if (single_connection) {
137     OpenDBConnection(NULL);
138     }
139    
140     setInit(counter, obt);
141     StartGroup();
142     }
143    
144     //here we know if the incoming packet can be considered consecutive to the previuos one
145     if ((!isCons) && (numPKT != 0)) {
146     setReal_Time();
147     //closing the group in file rootfilename
148     FinishGroup(rootfilename);
149    
150     //se gia' e' cambiato download non cambio numdisco
151     if (!is_new_route) {
152     numDiscontinity++;
153     }
154    
155     //the current pkt will be placed in a new group: rootfilename
156     setInit(counter, obt);
157     StartGroup();
158     }
159    
160     //add current packet to the group and calculate bad_pkt_EventReader and bad_pkt_CalibReader
161     int ret = reader->PKT_RunEvent(headerPkt, pamPkt, length, type);
162     /*
163     ret
164     0 packet good
165     1 exception but used //never happen
166     2 CRC exception but used
167     3 CALIBRATION PACKET with error but used
168     -1 CRC exception packet DISCARDED
169     -2 FATAL exception packet DISCARDED //never happen
170     -3 No way to read events of this type. packet DISCARDED( es OLD CalibCal)
171     ret = 10 if the packet is good but comes from a cadre with VRL problems
172     */
173    
174     //here we also know if the packet comes from one or more corrupted cadres
175     if ((!isPKTGood) && (!ret)) {
176     ret = 10;
177     }
178     switch (ret) {
179     case 0: {
180     numPKTSaved++;
181     break;
182     }
183     case 1: {
184     bad_pkt_EventReader++;
185     numPKTSaved++;
186     break;
187     }
188     case 2: {
189     bad_pkt_EventReader++;
190     numPKTSaved++;
191     break;
192     }
193     case 3: {
194     bad_pkt_CalibReader++;
195     numPKTSaved++;
196     break;
197     }
198     case 10: {
199     bad_pkt++;
200     numPKTSaved++;
201     break;
202     }
203     default: {
204     stringstream oss;
205     oss.str() = "";
206     oss << "Packet DISCARDED, reason = " << ret;
207     string msg = oss.str();
208     mainLogUtil->logAll(msg);
209     break;
210     }
211     }
212    
213     /*
214     if ((ret==0)&&((type==PacketType::CalibTrk1)||(type==PacketType::CalibTrk2)|| (type==PacketType::CalibCalPed)))
215     {
216     good_pkt_Calib++;//maybe I will remove this in future
217     }
218     */
219    
220     if (ret >= 0)// only the packet not discarded of course
221     setLast(counter, obt);
222    
223     //TODO: decide what kind of packet I can use here
224     // if((ret==0)||(ret==10))//I want to use only good packet
225     if (ret >= 0)//I want to use only accepted packet
226     {
227     setTimeSync(pamPkt, length, type);//here I retrieve also the boot_number if packet type is vardump
228     }
229    
230     //just to be sure ...
231     if (pamPkt) {
232     delete[] pamPkt;
233     pamPkt = NULL;
234     }
235     if (headerPkt) {
236     delete[] headerPkt;
237     headerPkt = NULL;
238     }
239    
240     numPKT++;
241 mocchiut 1.1 }
242    
243     //set the value of the counter and obt of the first packet of the group
244 pam-fi 1.8 void PacketUser::setInit(unsigned long int counter, unsigned long int obt) {
245     sprintf(nnnn_mmm_ppp, "%05d_%03d_%03d", orbit_number, mmm_number, download);
246     sprintf(rootfilename, "%s_%s_%d", nome_output, nnnn_mmm_ppp, numDiscontinity);
247     pkt_number_init = counter;
248     obt_init = obt;
249     pkt_number_last = 0;
250     obt_last = 0;
251     real_time_init = 0;
252     real_time_last = 0;
253     bad_pkt = 0;
254     numPKTSaved = 0;
255     bad_pkt_EventReader = 0;
256     bad_pkt_CalibReader = 0;
257     //good_pkt_Calib=0;
258    
259     //marco_NB:
260 mocchiut 1.10 //ogni volta che trovo una discontinuita` resetto come se mi trovassi in un nuovo download oppure uso i vecchi valori se esistono?
261 pam-fi 1.8
262 mocchiut 1.10 if ( obt_time_sync ) obt_time_sync_prevvalue = obt_time_sync; // save the last NOT NULL obt_time_sync! EM
263     if ( last_time_sync_info ) last_time_sync_info_prevvalue = last_time_sync_info; // save the last NOT NULL last_time_sync
264 pam-fi 1.8 time_is_estimated = false;
265     obt_time_sync = 0;
266     last_time_sync_info = 0;
267     boot_number_prevvalue = boot_number;
268     boot_number = 0;
269 mocchiut 1.3
270 pam-fi 1.8 // NB: se ho discontinuita in genere non so a che download appartiene potrebbe proprio essere sbagliato tenere i vecchi valori
271 mocchiut 1.1
272     }
273    
274     //starts a new root file
275 pam-fi 1.8 void PacketUser::StartGroup() {
276     pRun = new PamelaRun(rootfilename, gSystem->ExpandPathName(outDir), multiFile, compression); // EMI
277     strcat(rootfilename, ".root");
278     reader->Init(pRun);
279     stringstream oss;
280     oss.str() = "";
281     oss << "######################### Start a new group in file: " << rootfilename << " ############################";
282     string msg = oss.str();
283     mainLogUtil->logInfo(msg);
284 mocchiut 1.1 }
285    
286     //set the value of the counter and obt of the last packet of the group
287 pam-fi 1.8 void PacketUser::setLast(unsigned long int counter, unsigned long int obt) {
288     pkt_number_last = counter;
289     obt_last = obt;
290 mocchiut 1.1 }
291    
292 pam-fi 1.8 //retrieve obt_time_sync and last_time_sync_info from packet if type has special values and BOOT_NUMBER
293     void PacketUser::setTimeSync(char* packet, long int pktLength, const PacketType* type) {
294     //do nothing
295     if (!do_cont_check) {
296     if (is_new_route)
297     is_new_route = false;
298     return;
299     }
300    
301     //TODO: usare anche MCMD ... NOTA: questo da sempre errore ret != 0
302     //In RunHeader e RunTrailer sono in secondi(?), controllare se aggiungo altri tipi di paccheti se invece sono in secondi
303     // devo ricalcolare tutto non per ogni gruppetto (ROOT file) ma solo se cambia download
304     //When I found a new download I need to reset all values
305     if (is_new_route) {
306     //reset
307     is_new_route = false;
308     //(tassa) ci ho ripensato se stiamo in un secondo download non prendiamo i bootnumber e timesync del precedente!
309     obt_time_sync_prevvalue = 0;//obt_time_sync;
310     last_time_sync_info_prevvalue = 0;//last_time_sync_info;
311    
312     obt_time_sync = 0;
313     last_time_sync_info = 0;
314     boot_number_prevvalue = 0;//boot_number;
315     boot_number = 0;
316     time_is_estimated = false;
317     if (time_Offset)
318     timeOffset = time_Offset;
319     else
320     timeOffset = retrieveTimeOffset(Table_GL_RESURS_OFFSET);
321     }
322    
323     //retrieve boot number if possible
324     setBootNumber(packet, pktLength, type);
325 mocchiut 1.1
326 pam-fi 1.8 //Retrieve if possible obt_time_sync and last_time_sync_info
327     int offset = 0;
328     if (type == PacketType::RunHeader) {
329     offset = 0;
330     }
331     else if (type == PacketType::RunTrailer) {
332     offset = 3;
333     }
334     else if (type == PacketType::Mcmd) {
335     // mainLogUtil->logAll("TODO: Packet Mcmd now is not used to retrieve Absolute time. This may cause problems somewhere.");
336     return;
337     }
338     else {
339     return;
340     }
341 mocchiut 1.1
342 pam-fi 1.8 //I don't need to retrieve them again if they are good
343 mocchiut 1.10 // if ((obt_time_sync) || (last_time_sync_info))
344     // return;
345     // no, do it, since there is a (small indeed) time drift due to different clock of PAMELA CPU and RESURS CPU...
346 pam-fi 1.8
347     obt_time_sync = (((UINT32) packet[5 + offset] << 24) & 0xFF000000) + (((UINT32) packet[6 + offset] << 16)
348     & 0x00FF0000) + (((UINT32) packet[7 + offset] << 8) & 0x0000FF00) + (((UINT32) packet[8 + offset]) & 0x000000FF);
349     last_time_sync_info = (((UINT32) packet[9 + offset] << 24) & 0xFF000000) + (((UINT32) packet[10 + offset] << 16)
350     & 0x00FF0000) + (((UINT32) packet[11 + offset] << 8) & 0x0000FF00)
351     + (((UINT32) packet[12 + offset]) & 0x000000FF);
352    
353     stringstream oss;
354     oss.str() = "";
355     oss << "In download: " << download << " timeOffset: " << timeOffset << " obt_time_sync: " << obt_time_sync
356     << " last_time_sync_info: " << last_time_sync_info << " using Packet Type: " << type->GetName();
357     // oss<<"In download: "<<download<<" timeOffset: "<<timeOffset<<" obt_time_sync: "<<obt_time_sync<<" last_time_sync_info: "<<last_time_sync_info<<" using Packet Type: "<<type->GetName().c_str();
358     string msg = oss.str();
359     mainLogUtil->logAll(msg);
360 mocchiut 1.1 }
361    
362     //Boot Number
363 pam-fi 1.8 void PacketUser::setBootNumber(char* packet, long int pktLength, const PacketType* type) {
364     //se gia calcolato esco: lo calcolo una volta per download e per continuita'
365     if (boot_number)
366     return;
367    
368     if (type == PacketType::VarDump) {
369     int b_offset = 34;//4+5*6
370     boot_number = (((UINT32) packet[1 + b_offset] << 24) & 0xFF000000) + (((UINT32) packet[2 + b_offset] << 16)
371     & 0x00FF0000) + (((UINT32) packet[3 + b_offset] << 8) & 0x0000FF00) + (((UINT32) packet[4 + b_offset])
372     & 0x000000FF);
373    
374     /*
375     long int dataLength = pktLength - 2; //the block of data
376     int b_offset = 4;
377     while (b_offset < dataLength){
378     boot_number = (((UINT32)packet[1+b_offset]<<24)&0xFF000000) + (((UINT32)packet[2+b_offset]<<16)&0x00FF0000) + (((UINT32)packet[3+b_offset]<<8)&0x0000FF00) + (((UINT32)packet[4+b_offset])&0x000000FF);
379     b_offset = b_offset + 5;
380     }
381     */
382     stringstream oss;
383     oss.str() = "";
384     // oss<<"In download: "<<download<<" boot_number: "<<boot_number<<" using Packet Type: "<<type->GetName().c_str();
385     oss << "In download: " << download << " boot_number: " << boot_number << " using Packet Type: " << type->GetName();
386     string msg = oss.str();
387     mainLogUtil->logAll(msg);
388     return;
389     }
390     else {
391     return;
392     }
393 mocchiut 1.1
394     }
395     //set the real time of the first packet and the last packet oif a group of packet if possible
396 pam-fi 1.8 void PacketUser::setReal_Time() {
397 mocchiut 1.3
398 mocchiut 1.10 if (!obt_time_sync && !last_time_sync_info && numPKTSaved > recoverlimit) {
399 pam-fi 1.8 time_is_estimated = true;
400     obt_time_sync = obt_time_sync_prevvalue;
401     last_time_sync_info = last_time_sync_info_prevvalue;
402     }
403     if (obt_time_sync || last_time_sync_info) {
404     real_time_init = (obt_init / 1000 - obt_time_sync) + last_time_sync_info;
405     //se obt si e' resettato
406     if (obt_last < obt_init) {
407     real_time_last = (max_pkt_obt / 1000 + obt_last / 1000 - obt_time_sync) + last_time_sync_info;
408     stringstream oss;
409     oss.str() = "";
410     oss << "obt_last(" << obt_last << ") < obt_init(" << obt_init
411     << "). It is due to Pamela Reset. Adding max_pkt_obt(" << max_pkt_obt
412     << ") to obt_last in order to compute real_time_last";
413     string msg = oss.str();
414     mainLogUtil->logWarning(msg);
415     }
416     else
417     real_time_last = (obt_last / 1000 - obt_time_sync) + last_time_sync_info;
418     real_time_init += timeOffset;
419     real_time_last += timeOffset;
420     }
421 mocchiut 1.1 }
422    
423 mocchiut 1.10 void PacketUser::setReal_TimeRECOVERY(
424     unsigned long int & _real_time_init,
425     unsigned long int & _real_time_last,
426     unsigned long int _obt_init,
427     unsigned long int _obt_last
428     ) {
429    
430     if (obt_time_sync || last_time_sync_info) {
431     _real_time_init = (_obt_init / 1000 - obt_time_sync) + last_time_sync_info;
432     //se obt si e' resettato
433     if (_obt_last < _obt_init) {
434     _real_time_last = (max_pkt_obt / 1000 + _obt_last / 1000 - obt_time_sync) + last_time_sync_info;
435     stringstream oss;
436     oss.str() = "";
437     oss << "obt_last(" << obt_last << ") < obt_init(" << obt_init
438     << "). It is due to Pamela Reset. Adding max_pkt_obt(" << max_pkt_obt
439     << ") to obt_last in order to compute real_time_last";
440     string msg = oss.str();
441     mainLogUtil->logWarning(msg);
442     }
443     else
444     _real_time_last = (_obt_last / 1000 - obt_time_sync) + last_time_sync_info;
445     _real_time_init += timeOffset;
446     _real_time_last += timeOffset;
447     }
448     }
449    
450    
451 mocchiut 1.1 //timeOffset
452     //retrieve from table Table_GL_RESURS_OFFSET timeOffset
453 pam-fi 1.8 unsigned long int PacketUser::retrieveTimeOffset(const char * table) {
454     if (!do_cont_check)
455     return 0;
456    
457     //if(!table){table=Table_GL_RESURS_OFFSET}
458    
459     if (!single_connection) {
460 mocchiut 1.17 OpenDBConnection(NULL);// no, locak tutto Nota qui ho deciso di lockare solo questa tabella e non tutte
461 pam-fi 1.8 }
462    
463     UInt_t t0 = 0;//toffset
464     stringstream oss;
465     oss.str("");
466     oss
467     << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM "
468     << table << " WHERE SPECIAL_FILE='" << nnnn_mmm_ppp << "';";
469    
470     string msg = oss.str();
471     mainLogUtil->logAll(msg);
472    
473     TSQLResult* res = NULL;
474     TSQLRow* row = NULL;
475     res = sqlServer->Query(oss.str().c_str());
476     if (!res) {
477     mainLogUtil->logError("DBError retrieveTimeOffset 1");
478     return 0;
479     }
480    
481     row = res->Next();
482     if (!row) {
483     if (res) {
484     delete res;
485     res = NULL;
486     }
487    
488     oss.str("");
489     oss
490     << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM "
491     << table << " WHERE FROM_ORBIT < " << orbit_number << " AND SPECIAL_FILE='' order by FROM_ORBIT desc limit 1;";
492    
493     string msg2 = oss.str();
494     mainLogUtil->logAll(msg2);
495    
496     res = sqlServer->Query(oss.str().c_str());
497     if (!res) {
498     mainLogUtil->logError("DBError retrieveTimeOffset 2");
499     return 0;
500     }
501     row = res->Next();
502     if (!row) {
503     mainLogUtil->logError("DBError retrieveTimeOffset 3");
504     return 0;
505     }
506    
507     }
508    
509     TTimeStamp tu = TTimeStamp((UInt_t) atoi(row->GetField(0)), (UInt_t) atoi(row->GetField(1)), (UInt_t) atoi(
510     row->GetField(2)), (UInt_t) atoi(row->GetField(3)), (UInt_t) atoi(row->GetField(4)), (UInt_t) atoi(row->GetField(
511     5)), 0, true, 0);
512     t0 = (UInt_t) tu.GetSec();
513    
514     if (res) {
515     delete res;
516     res = NULL;
517     }
518     if (row) {
519     delete row;
520     row = NULL;
521     }
522    
523     if (!single_connection) {
524     CloseDBConnection();
525     }
526     return t0;
527 mocchiut 1.1 }
528    
529     //this is public and can be called from the main at the end of the game
530 pam-fi 1.8 void PacketUser::FinishLastGroup() {
531     mainLogUtil->logAll("######################### Closing the last group ############################");
532     setReal_Time();
533     FinishGroup(rootfilename);
534     mainLogUtil->logAll("######################### Closed the last group ############################");
535 mocchiut 1.10 //
536 pam-fi 1.8 if (single_connection) {
537     CloseDBConnection();
538     }
539 mocchiut 1.1 }
540    
541     //Finish the old root file
542 pam-fi 1.8 void PacketUser::FinishGroup(char * filename) {
543     if (pRun) {
544 mocchiut 1.12 if ( !( !real_time_init && !real_time_last && numPKTSaved <= recoverlimit ) || !candelete ) pRun->WriteFiles();
545 pam-fi 1.8 delete pRun;
546     pRun = NULL;
547     stringstream close;
548     close.str() = "";
549     string msg;
550    
551 mocchiut 1.10 close << "TAG XX ######################### Close group in file: " << rootfilename << " ############################";
552 pam-fi 1.8 msg = close.str();
553     mainLogUtil->logInfo(msg);
554    
555     // se non faccio proprio controlli su continuita' neanche salvo su DB
556     if (!do_cont_check)
557     return;
558    
559     stringstream oss;
560     oss.str() = "";
561    
562     //TODO: check when I don't want to log in DB informations
563     // se non ho salvato nessun pacchetto
564     if (numPKTSaved == 0) {
565     stringstream err;
566     err.str() = "";
567     err << "NO PACKET SAVED in file: " << rootfilename << " The group is empty: you can remove this file.";
568     msg = err.str();
569     mainLogUtil->logError(msg);
570 mocchiut 1.10 // return;
571 pam-fi 1.8 }
572    
573     //se non ho salvato nessun pacchetto buono
574     if ((numPKTSaved - bad_pkt_EventReader - bad_pkt_CalibReader - bad_pkt) == 0) {
575     stringstream err;
576     err.str() = "";
577     err << "NO GOOD PACKET SAVED in file: " << rootfilename << " The group is BAD: you may want to remove this file.";
578     msg = err.str();
579     mainLogUtil->logInfo(msg);
580     // mainLogUtil->logError(msg);
581     // return; //TODO: decidi se nn vuoi affatto usarlo o addirittura salvarlo tra i BAD???
582     }
583    
584     if (!single_connection) {
585     OpenDBConnection(NULL);//Nota qui ho deciso di lockare tutte le tabelle
586     }
587    
588 mocchiut 1.10
589 pam-fi 1.8 //don't save in Table_ROOT_Good and don't search for ROOT files in the same temporal range
590     if ((!real_time_init) && (!real_time_last)) {
591     //saved in another table for future study
592     if (saveROOT_DB(
593     Table_ROOT_Bad,
594     outDir,// here outDir is good, no expand EMI
595     filename, pkt_number_init, pkt_number_last, obt_init, obt_last, obt_time_sync, last_time_sync_info,
596     real_time_init, real_time_last, boot_number, timeOffset, bad_pkt, bad_pkt_EventReader, bad_pkt_CalibReader,
597     numPKTSaved, fni, time_is_estimated) == true) {
598     oss.str() = "";
599     oss << "Saved information regarding file: " << filename << " in table " << Table_ROOT_Bad;
600     msg = oss.str();
601     mainLogUtil->logInfo(msg);
602     }
603     else {
604     oss.str() = "";
605     oss << "Problem storing information in DB regarding file: " << filename;
606     msg = oss.str();
607     mainLogUtil->logError(msg);
608     }
609    
610    
611 mocchiut 1.10
612     if ( numPKTSaved > recoverlimit){ // EM
613     //
614     if ( obt_time_sync && last_time_sync_info ){
615     stringstream err;
616     err.str() = "";
617     err << "(EM): -- RECOVERING WHEN NUMPACKET > "<< recoverlimit <<"!! -- file=<" << filename << ">. We have a previous time sync, immediate recovery!\n";
618     msg = err.str();
619     mainLogUtil->logInfo(msg);
620     //
621     setReal_TimeRECOVERY(
622     real_time_init,
623     real_time_last,
624     obt_init,
625     obt_last
626     );
627     //
628     } else {
629     stringstream err;
630     err.str() = "";
631     err << "TAG(tassa): -- RECOVERING WHEN NUMPACKET > "<< recoverlimit <<"!! -- file=<" << filename << ">. Saving in a queue to try alfer to recover it!\n";
632     msg = err.str();
633     mainLogUtil->logInfo(msg);
634    
635 mocchiut 1.17 // TString qu = Form("select ID_N from ROOT_TABLE_BAD order by INSERT_TIME desc limit 1;"); // <=========================
636     TString qu = Form("select ID_N from ROOT_TABLE_BAD where FILE_NAME='%s' and PKT_NUMBER_INIT=%i and INSERTED_BY='%s';",filename,pkt_number_init,tag_value); // <=========================
637 mocchiut 1.10 TSQLResult *result = sqlServer->Query(qu.Data());
638     TSQLRow *row = result->Next();
639     Int_t eid = -1;
640     if ( row ) eid = (Int_t)atoi(row->GetField(0));
641     idtorecover->AddAt(eid,arsize);
642     arsize++;
643     if ( arsize > 100 ) idtorecover->Set(arsize);
644     // dbinfo *app = new dbinfo( outDir,
645     // filename, pkt_number_init, pkt_number_last, obt_init, obt_last, boot_number, timeOffset, bad_pkt, bad_pkt_EventReader, bad_pkt_CalibReader,
646     // numPKTSaved, fni, time_is_estimated);
647     // m_dbinfos.push_back(app);
648     }
649    
650     CleanDisk();
651 mocchiut 1.15 // if (!single_connection) {
652     // CloseDBConnection();
653     // }
654 mocchiut 1.14 // return; // commented here...
655 mocchiut 1.10
656     };
657 pam-fi 1.8 }
658    
659 mocchiut 1.10 if ( real_time_init || real_time_last) {
660 mocchiut 1.14 //saves info in DB in table Table_ROOT
661     if (boot_number == 0)
662     boot_number = boot_number_prevvalue;
663 mocchiut 1.10
664 mocchiut 1.14 if (saveROOT_DB(
665     Table_ROOT_Good,
666     outDir, // here outDir is good, no expand EMI
667     filename, pkt_number_init, pkt_number_last, obt_init, obt_last, obt_time_sync, last_time_sync_info,
668     real_time_init, real_time_last, boot_number, timeOffset, bad_pkt, bad_pkt_EventReader, bad_pkt_CalibReader,
669     numPKTSaved, fni, time_is_estimated) == true) {
670     oss.str() = "";
671     oss << "Saved information regarding file: " << filename << " in table " << Table_ROOT_Good << " id= " << my_id;
672     msg = oss.str();
673     mainLogUtil->logInfo(msg);
674    
675     if (tryMerge) {
676     merge_ROOTfiles();
677     }
678     } else {
679 mocchiut 1.10 oss.str() = "";
680 pam-fi 1.8 oss << "Problem storing information in DB regarding file: " << filename;
681     msg = oss.str();
682     mainLogUtil->logError(msg);
683 mocchiut 1.14 }
684 mocchiut 1.10 };
685 pam-fi 1.8
686 mocchiut 1.10 // if dbinfo is not empty than
687 mocchiut 1.13 if ( arsize > 0 ){
688 mocchiut 1.10
689 mocchiut 1.13 if ( !obt_time_sync || !last_time_sync_info ){
690     TString *nomino=new TString(rootfilename);
691     nomino->Remove(15);
692     TString qu = Form("select OBT_TIME_SYNC,LAST_TIME_SYNC_INFO from ROOT_TABLE where FILE_NAME like '%s_%%' and (abs(PKT_NUMBER_INIT-%lu)<50000 or abs(PKT_OBT_INIT-%lu)<3000000) limit 1;",nomino->Data(),pkt_number_init,obt_init);
693     //
694     oss.str() = "";
695     oss << "(EM) Trying to find obt_time_sync and last_time_sync_info from DB, query is: " << qu.Data();
696     msg = oss.str();
697     mainLogUtil->logInfo(msg);
698     //
699     TSQLResult *result = sqlServer->Query(qu.Data());
700     TSQLRow *row = result->Next();
701     if ( row && result->GetRowCount() == 1 ){
702     obt_time_sync = (unsigned long int)atoll(row->GetField(0));
703     last_time_sync_info = (unsigned long int)atoll(row->GetField(1));
704     oss.str() = "";
705     oss << "(EM) found obt_time_sync and last_time_sync_info from DB! obt_time_sync = " <<obt_time_sync <<" last_time_sync_info = " << last_time_sync_info;
706     msg = oss.str();
707     mainLogUtil->logInfo(msg);
708     };
709     delete nomino;
710     };
711    
712     if ( obt_time_sync && last_time_sync_info ){
713     // if(!m_dbinfos.empty()){
714     // while(!m_dbinfos.empty()){
715     // dbinfo *app = m_dbinfos.back();
716     // m_dbinfos.pop_back();
717     Int_t ez=0;
718     while ( ez < arsize ){
719     Int_t eid = idtorecover->At(ez);
720     if ( eid > -1 ){
721 mocchiut 1.10
722 mocchiut 1.13 TString qu = Form("select FOLDER_NAME,FILE_NAME,PKT_NUMBER_INIT,PKT_NUMBER_FINAL,PKT_OBT_INIT,PKT_OBT_FINAL,BOOT_NUMBER,TIME_OFFSET,BAD_PKT,BAD_PKT_READ,BAD_PKT_CALREAD,NUM_PKT_SAVED,INPUT_NAME,TIME_IS_ESTIMATED from ROOT_TABLE_BAD where ID_N=%i;",eid);
723     TSQLResult *result = sqlServer->Query(qu.Data());
724     TSQLRow *row = result->Next();
725 mocchiut 1.10
726 mocchiut 1.13 TString efolder_name="";
727     TString efile_name="";
728     unsigned long int epkt_number_in=0ULL;
729     unsigned long int epkt_number_fin=0ULL;
730     unsigned long int eobt_in=0ULL;
731     unsigned long int eobt_fin=0ULL;
732     unsigned long int emboot_num=0ULL;
733     unsigned long int etime_offset=0ULL;
734     int ebad_pkt=0;
735     int ebad_pkt_read=0;
736     int ebad_pkt_CalRead=0;
737     int enum_PKT_Saved=0;
738     TString enome_input="";
739     bool e_time_is_estimated=false;
740    
741     if ( row ){
742     efolder_name = (TString)row->GetField(0);
743     efile_name = (TString)row->GetField(1);
744     epkt_number_in = (unsigned long int)atoll(row->GetField(2));
745     epkt_number_fin = (unsigned long int)atoll(row->GetField(3));
746     eobt_in = (unsigned long int)atoll(row->GetField(4));
747     eobt_fin = (unsigned long int)atoll(row->GetField(5));
748     emboot_num = (unsigned long int)atoll(row->GetField(6));
749     etime_offset = (unsigned long int)atoll(row->GetField(7));
750     ebad_pkt = (int)atoi(row->GetField(8));
751     ebad_pkt_read = (int)atoi(row->GetField(9));
752     ebad_pkt_CalRead = (int)atoi(row->GetField(10));
753     enum_PKT_Saved = (int)atoi(row->GetField(11));
754     enome_input = (TString)row->GetField(12);
755     e_time_is_estimated = (bool)atoi(row->GetField(13));
756     };
757     delete result;
758    
759     setReal_TimeRECOVERY(
760     real_time_init,
761     real_time_last,
762     eobt_in,
763     eobt_fin
764     );
765     //
766 mocchiut 1.10
767 mocchiut 1.13 if (saveROOT_DB(
768     Table_ROOT_Good,
769     efolder_name.Data(),
770     efile_name.Data(),
771     epkt_number_in,
772     epkt_number_fin, eobt_in, eobt_fin, obt_time_sync, last_time_sync_info,
773     real_time_init, real_time_last, emboot_num, etime_offset, ebad_pkt, ebad_pkt_read, ebad_pkt_CalRead,
774     enum_PKT_Saved, enome_input.Data(), e_time_is_estimated) == true) {
775     oss.str() = "";
776     oss << "\nTAG(tassa): RECOVERED!!!! Saved information regarding file: " << efile_name << " in table " << Table_ROOT_Good << " id= " << my_id;
777     msg = oss.str();
778     mainLogUtil->logInfo(msg);
779     /*merging we use global variable. we haveto set with current value*/
780 mocchiut 1.10
781 mocchiut 1.13 strcpy(outDir,efolder_name.Data() );
782     // outDir=efolder_name.Data();
783     strcpy(filename,efile_name.Data() );
784     // filename=efile_name.Data();
785     pkt_number_init=epkt_number_in;
786     pkt_number_last=epkt_number_fin;
787     obt_init=eobt_in;
788     obt_last=eobt_fin;
789     boot_number=emboot_num;
790     timeOffset=etime_offset;
791     bad_pkt=ebad_pkt;
792     bad_pkt_EventReader=ebad_pkt_read;
793     bad_pkt_CalibReader=ebad_pkt_CalRead;
794     numPKTSaved=enum_PKT_Saved;
795     strcpy(fni,enome_input.Data() );
796     // fni=enome_input.Data();
797     time_is_estimated=e_time_is_estimated;
798 mocchiut 1.10
799 mocchiut 1.13 if (tryMerge) {
800     merge_ROOTfiles();
801     }
802 mocchiut 1.10
803 mocchiut 1.13 TString qu2 = Form("update ROOT_TABLE_BAD set ON_DISK='MVD' where ID_N=%i;",eid);
804     sqlServer->Query(qu2.Data());
805 mocchiut 1.10
806    
807 mocchiut 1.13 }
808     else {
809     oss.str() = "";
810     oss << "Problem storing information in DB regarding file: " << filename;
811     msg = oss.str();
812     mainLogUtil->logError(msg);
813     }
814 mocchiut 1.10
815    
816 mocchiut 1.13 };
817     ez++;
818     }
819     //
820     idtorecover->Reset();
821     delete idtorecover;
822     idtorecover = new TArrayI(100);
823     arsize = 0;
824     // delete app;
825     };
826     };
827 mocchiut 1.10
828     CleanDisk();
829 pam-fi 1.8 if (!single_connection) {
830     CloseDBConnection();
831     }
832 mocchiut 1.1
833 pam-fi 1.8 }//pRun
834 mocchiut 1.1 }
835 mocchiut 1.17
836 mocchiut 1.10
837     void PacketUser::CleanDisk(){
838     if ( !candelete ) return;
839     //
840     // delete small files present in root_table_bad from disk:
841     //
842     TString qu = Form("select FOLDER_NAME,FILE_NAME from ROOT_TABLE_BAD where NUM_PKT_SAVED<=%i and INSERTED_BY='%s' and ON_DISK='YES';",recoverlimit,tag_value);
843     TSQLResult *result = sqlServer->Query(qu.Data());
844     TSQLRow *row = result->Next();
845     while ( row ){
846     TString tbdel = (TString)gSystem->ExpandPathName(row->GetField(0))+"/"+ (TString)row->GetField(1);
847     stringstream err;
848     string msg;
849     err.str() = "";
850     err << " Deleting file " << tbdel.Data() << " from disk! ";
851     msg = err.str();
852     mainLogUtil->logInfo(msg);
853     gSystem->Unlink(tbdel.Data());
854     // printf("ciccio %s \n",tbdel.Data());
855     TString q2u = Form("UPDATE ROOT_TABLE_BAD set ON_DISK='NO' where FOLDER_NAME='%s' and FILE_NAME='%s' and NUM_PKT_SAVED<=%i and INSERTED_BY='%s';",row->GetField(0),row->GetField(1),recoverlimit,tag_value);
856     // printf("pluto %s \n",q2u.Data());
857     sqlServer->Query(q2u.Data());
858     // printf("paperoga \n");
859     row=result->Next();
860     //
861     };
862    
863     }
864    
865 mocchiut 1.1 //save in Table_ROOT_Good or in Table_ROOT_Bad
866 mocchiut 1.10 bool PacketUser::saveROOT_DB(const char* table_name, const char* folder_name, const char* file_name,
867 pam-fi 1.8 unsigned long int pkt_number_in, unsigned long int pkt_number_fin, unsigned long int obt_in,
868     unsigned long int obt_fin, unsigned long int oT_sync, unsigned long int lT_sync_info, unsigned long int mtime_init,
869     unsigned long int mtime_last, unsigned long int mboot_num, unsigned long int time_offset, int bad_pkt,
870 mocchiut 1.10 int bad_pkt_read, int bad_pkt_CalRead, int num_PKT_Saved, const char* nome_input, bool _time_is_estimated) {
871 pam-fi 1.8 //TODO: forse far ritornare ID della cosa appena inserita se e' andatato tutto ok invece che true false?
872     stringstream oss;
873     oss.str("");
874     oss << "INSERT INTO " << table_name
875 mocchiut 1.10 << " (ID_N, FOLDER_NAME, FILE_NAME, PKT_NUMBER_INIT, PKT_NUMBER_FINAL, PKT_OBT_INIT, PKT_OBT_FINAL, OBT_TIME_SYNC, LAST_TIME_SYNC_INFO, REAL_TIME_INIT, REAL_TIME_LAST, BOOT_NUMBER, TIME_OFFSET,BAD_PKT,BAD_PKT_READ,BAD_PKT_CALREAD,NUM_PKT_SAVED,INPUT_NAME,INSERT_TIME,TIME_IS_ESTIMATED,INSERTED_BY)"
876 pam-fi 1.8 << " VALUES ('" << 0 << "','" << folder_name << "','" << file_name << "','" << pkt_number_in << "','"
877     << pkt_number_fin << "','" << obt_in << "','" << obt_fin << "','" << oT_sync << "','" << lT_sync_info << "','"
878     << mtime_init << "','" << mtime_last << "','" << mboot_num << "','" << time_offset << "','" << bad_pkt << "','"
879     << bad_pkt_read << "','" << bad_pkt_CalRead << "','" << num_PKT_Saved << "','" << nome_input << "'," << "NULL,"
880 mocchiut 1.10 << _time_is_estimated << ",'" << tag_value << "'" << ");";
881 pam-fi 1.8 string msg = oss.str();
882     mainLogUtil->logAll(msg);
883    
884     stringstream oss1;
885     oss1.str() = "";
886     string msg1;
887     string query;
888    
889     TSQLResult* res = NULL;
890    
891     query = oss.str();
892     msg1 = "SaveROOT_DB query: ";
893     msg1 += query;
894     mainLogUtil->logInfo(msg1);
895    
896     res = sqlServer->Query(query.c_str());
897     if (!res) {
898     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
899     msg1 = oss1.str();
900     mainLogUtil->logError(msg1);
901     return false;
902     }
903 mocchiut 1.1
904 mocchiut 1.10
905     if(!strcmp(table_name,Table_ROOT_Good)) {
906     //the ID of the current ROOT file in table Table_ROOT_Good
907     my_id = select_maxIDN_DB(table_name);
908     if (!boot_number) {
909     if (id_to_recover_index < 1000)
910     id_to_recover[id_to_recover_index++] = my_id;
911     }
912     else if (boot_number && id_to_recover_index && !is_new_route) {
913     recover_boot_number();
914     }
915 pam-fi 1.8 }
916     // cout<<"DBG: my_id = "<<my_id<<endl;
917     if (res) {
918     delete res;
919     res = NULL;
920     }
921     return true;
922 mocchiut 1.1 }
923    
924 pam-fi 1.8 void PacketUser::recover_boot_number() {
925 mocchiut 1.3 string msg1;
926     stringstream oss1;
927     stringstream oss;
928 pam-fi 1.8 oss.str("");
929     string query = "";
930     TSQLResult* res = NULL;
931     if (!boot_number || !id_to_recover_index)
932 mocchiut 1.3 return;
933 pam-fi 1.8
934     for (int i = 0; i < id_to_recover_index; i++) {
935 mocchiut 1.5 oss.str("");
936 pam-fi 1.8 oss << "UPDATE " << Table_ROOT_Good << " SET BOOT_NUMBER=" << boot_number << " WHERE ID_N=" << id_to_recover[i]
937     << ";";
938     query = oss.str();
939     res = sqlServer->Query(query.c_str());
940     if (!res) {
941     oss1 << "DBError UNABLE to: " << query.c_str() << endl;
942     msg1 = oss1.str();
943     mainLogUtil->logError(msg1);
944     return;
945     }
946 mocchiut 1.3 }
947    
948 pam-fi 1.8 for (int i = 0; i < id_to_recover_index; i++) {
949 mocchiut 1.5 oss.str("");
950 pam-fi 1.8 oss << "UPDATE " << Table_ROOT_Merging << " SET BOOT_NUMBER=" << boot_number << " WHERE ROOT_ID_N="
951     << id_to_recover[i] << ";";
952     query = oss.str();
953     res = sqlServer->Query(query.c_str());
954     if (!res) {
955     oss1 << "DBError UNABLE to: " << query.c_str() << endl;
956     msg1 = oss1.str();
957     mainLogUtil->logError(msg1);
958     return;
959     }
960 mocchiut 1.3 }
961    
962 pam-fi 1.8 id_to_recover_index = 0;
963 mocchiut 1.3 }
964    
965 mocchiut 1.1 /**********************************************************************************************/
966     /*###########################################################################################################*/
967     /********************************** MERGING *************************************************/
968     /*###########################################################################################################*/
969 mocchiut 1.3 // Merge ROT files: find other ROOT files in the same temporal ranges
970 mocchiut 1.1 // it finds ROOT files that covers particular temporal range of interest and save this info in DB
971     /**********************************************************************************************/
972     //try to merge current ROOT file with files in DB
973 pam-fi 1.8 bool PacketUser::merge_ROOTfiles() {
974     stringstream log;
975     log.str("");
976     string slog;
977 mocchiut 1.1
978 mocchiut 1.2 mainLogUtil->logInfo("Trying merging ROOT files");
979 pam-fi 1.8 double percentage = (double) (bad_pkt + bad_pkt_EventReader + bad_pkt_CalibReader) / numPKTSaved;
980 mocchiut 1.1
981 pam-fi 1.8 TSQLResult* res = NULL;
982     TSQLRow* row = NULL;
983     //numero di ROOT files trovati sul DB che hanno relaz di tipo dato
984     unsigned int num_rows = 0;
985    
986     //Record su DB:
987     unsigned int idN = 0;
988     unsigned int root_id_db = 0;
989     unsigned long int pkt_num_in_db = 0;
990     unsigned long int pkt_num_fin_db = 0;
991     unsigned long int pkt_obt_in_db = 0;
992     unsigned long int pkt_obt_fin_db = 0;
993     unsigned long int time_in_db = 0;
994     unsigned long int time_fin_db = 0;
995     unsigned int boot_num_db = 0;
996     double perc = 0;
997 mocchiut 1.2
998     //marco_new: non considero mai caso di continuita'(mio finale=DB iniz o viceversa), non mi interessa
999 mocchiut 1.1 //marco_new: after e before contengono anche smaller ma con un bordo comune
1000 pam-fi 1.8 for (int relaz = AFTER; relaz <= BIGGER; relaz++) {
1001     //marco_new: esci se sono arrivato a zero
1002     if (real_time_last == real_time_init) {
1003     log.str("");
1004     log << "Current File Lenght=0; real_time_last=real_time_init= " << real_time_last;
1005     slog = log.str();
1006     mainLogUtil->logAll(slog);
1007     mainLogUtil->logInfo("Finish merging ROOT files");
1008     if (res) {
1009     delete res;
1010     res = NULL;
1011     }
1012     if (row) {
1013     delete row;
1014     row = NULL;
1015     }
1016     return true;
1017     }
1018    
1019     num_rows = 0;
1020     res = Select_merging(Table_ROOT_Merging, real_time_init, real_time_last, (type_Rel_ROOT) relaz);
1021    
1022     if (!res) {
1023     mainLogUtil->logError("DB_ERROR: Unable to find ROOT files to be merged RES=null");
1024     return false;
1025     }
1026    
1027     num_rows = res->GetRowCount();
1028     log.str("");
1029     log << "Found " << num_rows << " ROOT file in DB with relation of kind = " << relaz;
1030     slog = log.str();
1031     mainLogUtil->logAll(slog);
1032    
1033     if (num_rows > 0) {
1034     for (unsigned int i = 0; i < num_rows; i++) {
1035     row = res->Next();
1036     if (!row) {
1037     mainLogUtil->logError("DB_ERROR: Unable to find ROOT files to be merged. ROW=null");
1038     if (res) {
1039     delete res;
1040     res = NULL;
1041     }
1042     return false;
1043     }
1044    
1045     //Leggi Record dal DB:
1046     idN = atoll(row->GetField(0));
1047     root_id_db = atoll(row->GetField(1));
1048     pkt_num_in_db = atoll(row->GetField(2));
1049     pkt_num_fin_db = atoll(row->GetField(3));
1050     pkt_obt_in_db = atoll(row->GetField(4));
1051     pkt_obt_fin_db = atoll(row->GetField(5));
1052     time_in_db = atoll(row->GetField(6));
1053     time_fin_db = atoll(row->GetField(7));
1054     boot_num_db = atoll(row->GetField(8));
1055     perc = atof(row->GetField(9));
1056    
1057     log.str("");
1058     log << "*** ROOT file found in DB has idN= " << idN << " root_id_db= " << root_id_db;
1059     log << " pkt_num_in_db= " << pkt_num_in_db << " pkt_num_fin_db= " << pkt_num_fin_db << " pkt_obt_in_db= "
1060     << pkt_obt_in_db << " pkt_obt_fin_db= " << pkt_obt_fin_db;
1061     log << " time_in_db= " << time_in_db << " time_fin_db= " << time_fin_db << " boot_num_db= " << boot_num_db
1062     << " perc= " << perc << " ***";
1063     log << "\n*** Current ROOT file has pkt_number_init= " << pkt_number_init << " obt_init= " << obt_init
1064     << " real_time_init= " << real_time_init;
1065     log << " pkt_number_last= " << pkt_number_last << " obt_last= " << obt_last << " real_time_last= "
1066     << real_time_last << " ***";
1067     slog = log.str();
1068     mainLogUtil->logAll(slog);
1069     if (perc > percentage) {
1070     mainLogUtil->logInfo("Current ROOT file is better than the one in DB");
1071     //modifica DB
1072     updateMergeROOT_DB(Table_ROOT_Merging, root_id_db, pkt_num_in_db, pkt_num_fin_db, pkt_obt_in_db,
1073     pkt_obt_fin_db, time_in_db, time_fin_db, boot_num_db, perc, idN, (type_Rel_ROOT) relaz);
1074     }
1075     else {
1076     mainLogUtil->logInfo("Found ROOT file in DB is better than current ROOT file");
1077     if (relaz == AFTER) {
1078     mainLogUtil->logInfo("Relaz:AFTER = Changing Init values of the Current ROOT file");
1079     pkt_number_init = (pkt_num_fin_db + 1);
1080     obt_init = pkt_obt_fin_db;
1081     real_time_init = time_fin_db;
1082     log.str("");
1083     log << "\n*** Current ROOT file becomes: pkt_number_init= " << pkt_number_init << " obt_init= "
1084     << obt_init << " real_time_init= " << real_time_init;
1085     log << " pkt_number_last= " << pkt_number_last << " obt_last= " << obt_last << " real_time_last= "
1086     << real_time_last << " ***";
1087     slog = log.str();
1088     mainLogUtil->logAll(slog);
1089     }
1090     else if (relaz == BEFORE) {
1091     mainLogUtil->logInfo("Relaz:BEFORE = Changing Last values of the Current ROOT file");
1092     pkt_number_last = (pkt_num_in_db - 1);
1093     obt_last = pkt_obt_in_db;
1094     real_time_last = time_in_db;
1095    
1096     log.str("");
1097     log << "\n*** Current ROOT file becomes: pkt_number_init= " << pkt_number_init << " obt_init= "
1098     << obt_init << " real_time_init= " << real_time_init;
1099     log << " pkt_number_last= " << pkt_number_last << " obt_last= " << obt_last << " real_time_last= "
1100     << real_time_last << " ***";
1101     slog = log.str();
1102     mainLogUtil->logAll(slog);
1103     }
1104     else if (relaz == SMALLER) {
1105     //non devo proprio salvarlo ed esco ...
1106     mainLogUtil->logInfo("Relaz:SMALLER = Nothing to save");
1107     mainLogUtil->logInfo("\nFinish merging ROOT files");
1108     if (res) {
1109     delete res;
1110     res = NULL;
1111     }
1112     if (row) {
1113     delete row;
1114     row = NULL;
1115     }
1116     return true;
1117     }
1118     else if (relaz == BIGGER)//spezzettamento
1119     {
1120     mainLogUtil->logInfo("Relaz:BIGGER = (1st part) Saving the first part of the Current ROOT file");
1121     saveMergeROOT_DB(Table_ROOT_Merging, my_id, pkt_number_init, (pkt_num_in_db - 1), obt_init, pkt_obt_in_db,
1122     real_time_init, time_in_db, boot_number, percentage);
1123    
1124     mainLogUtil->logInfo("Relaz:BIGGER = (2nd part)Changing Init values of the Current ROOT file");
1125     pkt_number_init = (pkt_num_fin_db + 1);
1126     obt_init = pkt_obt_fin_db;
1127     real_time_init = time_fin_db;
1128    
1129     log.str("");
1130     log << "\n*** Current ROOT file becomes: pkt_number_init= " << pkt_number_init << " obt_init= "
1131     << obt_init << " real_time_init= " << real_time_init;
1132     log << " pkt_number_last= " << pkt_number_last << " obt_last= " << obt_last << " real_time_last= "
1133     << real_time_last << " ***";
1134     slog = log.str();
1135     mainLogUtil->logAll(slog);
1136     }//if relaz
1137     }//if perc
1138     }//for num_rows
1139     }//if num_rows
1140    
1141     if (res) {
1142     delete res;
1143     res = NULL;
1144     }
1145     if (row) {
1146     delete row;
1147     row = NULL;
1148     }
1149    
1150     }//for relaz
1151    
1152     mainLogUtil->logInfo("Saving Current ROOT file");
1153     saveMergeROOT_DB(Table_ROOT_Merging, my_id, pkt_number_init, pkt_number_last, obt_init, obt_last, real_time_init,
1154     real_time_last, boot_number, percentage);
1155 mocchiut 1.1
1156 pam-fi 1.8 mainLogUtil->logInfo("Finish merging ROOT files");
1157 mocchiut 1.1 return true;
1158 mocchiut 1.2
1159 mocchiut 1.1 }
1160    
1161     //unsigned int root_id, percentage non le devo modificare
1162 pam-fi 1.8 bool PacketUser::updateMergeROOT_DB(const char* table_name, unsigned int root_id, unsigned long int pkt_number_in,
1163     unsigned long int pkt_number_fin, unsigned long int obt_in, unsigned long int obt_fin,
1164     unsigned long int mtime_init, unsigned long int mtime_last, unsigned long int mboot_num, double bad_perc,
1165     unsigned int ID_record, type_Rel_ROOT type_rel) {
1166    
1167     stringstream oss;
1168     oss.str("");
1169    
1170     if (type_rel == AFTER) {
1171     mainLogUtil->logInfo("Relaz:AFTER = Updating Last values of the DB ROOT file");
1172     //marco_new:tolti tutti gli apici che qui non devono essere
1173 mocchiut 1.11
1174     int good = 1;
1175     if ( pkt_number_in >= (pkt_number_init - 1) && abs((int)(pkt_number_in-(pkt_number_init-1)))<10 ) good = 0;
1176    
1177 pam-fi 1.8 oss << "UPDATE " << table_name << " SET PKT_NUMBER_FINAL =" << (pkt_number_init - 1) << ", PKT_OBT_FINAL ="
1178 mocchiut 1.11 << obt_init << ", REAL_TIME_LAST =" << real_time_init << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1179 pam-fi 1.8
1180     }
1181     else if (type_rel == BEFORE) {
1182     mainLogUtil->logInfo("Relaz:BEFORE = Updating Init values of the DB ROOT file");
1183 mocchiut 1.11
1184     int good = 1;
1185     if ( (pkt_number_last+1) >= pkt_number_fin && abs((int)((pkt_number_last+1)-pkt_number_fin))<10 ) good = 0;
1186    
1187 pam-fi 1.8 oss << "UPDATE " << table_name << " SET PKT_NUMBER_INIT =" << (pkt_number_last + 1) << ", PKT_OBT_INIT ="
1188 mocchiut 1.11 << obt_last << ", REAL_TIME_INIT =" << real_time_last << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1189 pam-fi 1.8 }
1190     else if (type_rel == SMALLER) {
1191     //spezzettamentento
1192     mainLogUtil->logInfo("Relaz:SMALLER = (1st part) Updating Last values of the DB ROOT file");
1193    
1194 mocchiut 1.11 int good = 1;
1195     if ( pkt_number_in >= (pkt_number_init - 1) && abs((int)(pkt_number_in-(pkt_number_init-1)))<10 ) good = 0;
1196    
1197 pam-fi 1.8 oss << "UPDATE " << table_name << " SET PKT_NUMBER_FINAL=" << (pkt_number_init - 1) << ", PKT_OBT_FINAL ="
1198 mocchiut 1.11 << obt_init << ", REAL_TIME_LAST =" << real_time_init << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1199 pam-fi 1.8
1200     mainLogUtil->logInfo("Relaz:SMALLER = (2nd part) Saving the second part of the DB ROOT file");
1201    
1202     saveMergeROOT_DB(table_name, root_id, (pkt_number_last + 1), pkt_number_fin, obt_last, obt_fin, real_time_last,
1203     mtime_last, mboot_num, bad_perc);
1204     }
1205     else if (type_rel == BIGGER) {
1206     //marco_new: ok anche se coincidenti etc
1207     // oss << "DELETE FROM "<< table_name <<" WHERE ID_N ="<< ID_record<<";"; // EMILIANO
1208     oss << "UPDATE " << table_name << " SET GOOD=0 WHERE ID_N =" << ID_record << ";"; // EMILIANO DO NOT DELETE FROM ROOT_TABLE_MERGING JUST SET GOOD FLAG TO ZERO
1209     mainLogUtil->logInfo("Record deleted from merging table");
1210     }
1211     else
1212     return false;
1213    
1214     string msg = oss.str();
1215     mainLogUtil->logInfo(msg);
1216    
1217     stringstream oss1;
1218     oss1.str() = "";
1219     string msg1;
1220    
1221     TSQLResult* res = NULL;
1222     res = sqlServer->Query(oss.str().c_str());
1223     if (!res) {
1224     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1225     msg1 = oss1.str();
1226     mainLogUtil->logError(msg1);
1227     return false;
1228     }
1229     if (res) {
1230     delete res;
1231     res = NULL;
1232     }
1233     return true;
1234 mocchiut 1.1 }
1235    
1236 mocchiut 1.2 //cerca eventuali ROOT files in DB che possono venire mergiati
1237     //marco_new bordi: messo in after a before casi in cui smaller con un bordo in comune
1238     //marco_new bordi: messo in bigger casi con bordi in comune; tra questi anche caso particolare di coincidente
1239     //marco_new bordi: smaller resta solo caso in cui DB e' piu largo sia a dx che a sx
1240 pam-fi 1.8 TSQLResult* PacketUser::Select_merging(const char* table_name, unsigned long int mtime_init, unsigned long int mtime_last,
1241     type_Rel_ROOT type_rel) {
1242     TSQLResult* res = NULL;
1243     stringstream query;
1244     query.str("");
1245    
1246     if (type_rel == AFTER)
1247     query << "select * from " << table_name << " where GOOD=1 and REAL_TIME_LAST > " << mtime_init
1248     << " and REAL_TIME_LAST <= " << mtime_last << " and REAL_TIME_INIT < " << mtime_init; // EMI
1249     else if (type_rel == BEFORE)
1250     query << "select * from " << table_name << " where GOOD=1 and REAL_TIME_INIT >= " << mtime_init
1251     << " and REAL_TIME_INIT < " << mtime_last << " and REAL_TIME_LAST > " << mtime_last; // EMI
1252     else if (type_rel == SMALLER)
1253     query << "select * from " << table_name << " where GOOD=1 and REAL_TIME_INIT < " << mtime_init
1254     << " and REAL_TIME_LAST > " << mtime_last; // EMI
1255     else if (type_rel == BIGGER)
1256     query << "select * from " << table_name << " where GOOD=1 and REAL_TIME_INIT >= " << mtime_init
1257     << " and REAL_TIME_LAST <= " << mtime_last; // EMI
1258     else
1259     return 0;
1260    
1261 mocchiut 1.11 query << " order by REAL_TIME_INIT ASC;";//marco_new: inutile
1262 pam-fi 1.8 //se volessi mettere un filtro sulla qualita'
1263     // query<<" and NUM_PKT_SAVED - BAD_PKT_CALREAD - BAD_PKT_READ - BAD_PKT >= 2" ;
1264     string msg = query.str();
1265     mainLogUtil->logAll(msg);
1266     res = sqlServer->Query(query.str().c_str());
1267     stringstream oss1;
1268     oss1.str() = "";
1269     string msg1;
1270    
1271     if (!res) {
1272     oss1 << "DBError UNABLE to: " << query.str().c_str() << endl;
1273     msg1 = oss1.str();
1274     mainLogUtil->logError(msg1);
1275     }
1276    
1277     return res;
1278     }
1279    
1280     bool PacketUser::saveMergeROOT_DB(const char* table_name, unsigned int root_id, unsigned long int pkt_number_in,
1281     unsigned long int pkt_number_fin, unsigned long int obt_in, unsigned long int obt_fin,
1282     unsigned long int mtime_init, unsigned long int mtime_last, unsigned long int mboot_num, double percentage) {
1283    
1284 mocchiut 1.11 int good = 1;
1285     if ( pkt_number_in >= pkt_number_fin && abs((int)(pkt_number_fin-pkt_number_in))<10 ) good = 0;
1286    
1287 pam-fi 1.8 stringstream oss;
1288     oss.str("");
1289     oss << "INSERT INTO " << table_name
1290 mocchiut 1.11 << " (ID_N, ROOT_ID_N, PKT_NUMBER_INIT, PKT_NUMBER_FINAL, PKT_OBT_INIT, PKT_OBT_FINAL, REAL_TIME_INIT, REAL_TIME_LAST, BOOT_NUMBER, BAD_PKT_PERCENTAGE, INSERT_TIME, INSERTED_BY,GOOD)"
1291 pam-fi 1.8 << " VALUES ('" << 0 << "','" << root_id << "','" << pkt_number_in << "','" << pkt_number_fin << "','" << obt_in
1292     << "','" << obt_fin << "','" << mtime_init << "','" << mtime_last << "','" << mboot_num << "','" << percentage
1293 mocchiut 1.11 << "'," << "NULL" << ",'" << tag_value << "','" << good <<"');";
1294 pam-fi 1.8
1295     string msg = oss.str();
1296     mainLogUtil->logAll(msg);
1297    
1298     //marco_new: controlla
1299     //marco_new: esci se sono arrivato a zero
1300     // if(real_time_last==real_time_init){
1301     if (mtime_init == mtime_last) {
1302     mainLogUtil->logAll("Nothing to be saved");
1303    
1304     // if(res){delete res; res = NULL;}
1305     // if(row){delete row; row = NULL;}
1306     return true;
1307     }
1308    
1309     stringstream oss1;
1310     oss1.str() = "";
1311     string msg1;
1312    
1313     TSQLResult* res = NULL;
1314     res = sqlServer->Query(oss.str().c_str());
1315     if (!res) {
1316     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1317     msg1 = oss1.str();
1318     mainLogUtil->logError(msg1);
1319     return false;
1320     }
1321     if (res) {
1322     delete res;
1323     res = NULL;
1324     }
1325     return true;
1326 mocchiut 1.1 }
1327    
1328     //Utility: return max(IDN)
1329 pam-fi 1.8 unsigned int PacketUser::select_maxIDN_DB(const char* table_name) {
1330 mocchiut 1.1
1331 pam-fi 1.8 if (!strcmp(table_name, Table_ROOT_Bad)) {
1332     return 0;
1333     }
1334     unsigned int idN = 0;
1335     TSQLResult* res = NULL;
1336     stringstream oss;
1337     oss.str("");
1338     oss << "select max(ID_N) from " << table_name;
1339     // string msg = oss.str();
1340     // mainLogUtil->logAll(msg);
1341     res = sqlServer->Query(oss.str().c_str());
1342    
1343     stringstream oss1;
1344     oss1.str() = "";
1345     string msg1;
1346    
1347     if (!res) {
1348     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1349     msg1 = oss1.str();
1350     mainLogUtil->logError(msg1);
1351     return 0;
1352     }
1353    
1354     TSQLRow* row = NULL;
1355     row = res->Next();
1356     if (!row) {
1357     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1358     msg1 = oss1.str();
1359     mainLogUtil->logError(msg1);
1360     return 0;
1361     }
1362    
1363     idN = atoi(row->GetField(0));
1364     if (row) {
1365     delete row;
1366     row = NULL;
1367     }
1368     if (res) {
1369     delete res;
1370     res = NULL;
1371     }
1372    
1373     oss << ". idN = " << idN;
1374     string msg = oss.str();
1375     mainLogUtil->logAll(msg);
1376 mocchiut 1.2
1377 pam-fi 1.8 return idN;
1378 mocchiut 1.1 }
1379    
1380     /**
1381     * Lock par=table, if par=null lock all tables
1382     */
1383 pam-fi 1.8 int PacketUser::LockTables(const char* tableTobeLocked) {
1384     //se non ho il DB :)
1385     if (!do_cont_check)
1386     return 999;
1387    
1388     TSQLResult* res = NULL;
1389     stringstream oss;
1390     oss.str("");
1391 mocchiut 1.17 // if (!tableTobeLocked)
1392     oss << "lock table " << Table_ROOT_Good << " write, " << Table_ROOT_Bad << " write, " << Table_GL_RESURS_OFFSET
1393     << " write, " << Table_ROOT_Merging << " write;";
1394     // else
1395     // oss << "lock table " << tableTobeLocked << " write; ";
1396 mocchiut 1.1
1397 pam-fi 1.8 string msg = oss.str();
1398     mainLogUtil->logAll(msg);
1399    
1400     res = sqlServer->Query(oss.str().c_str());
1401    
1402     stringstream oss1;
1403     oss1.str() = "";
1404     string msg1;
1405    
1406     if (!res) {
1407     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1408     msg1 = oss1.str();
1409     mainLogUtil->logError(msg1);
1410     return 1;
1411     }
1412    
1413     if (res) {
1414     delete res;
1415     res = NULL;
1416     }
1417     mainLogUtil->logAll("TABLES LOCKED");
1418     return 0;
1419 mocchiut 1.1 }
1420    
1421     /**
1422     * UNLock tables
1423     */
1424 pam-fi 1.8 int PacketUser::UnLockTables() {
1425     //se non ho il DB :)
1426     if (!do_cont_check)
1427     return 999;
1428    
1429     TSQLResult* res = NULL;
1430     stringstream oss;
1431     oss.str("");
1432     oss << "unlock tables;";
1433 mocchiut 1.1
1434 pam-fi 1.8 string msg = oss.str();
1435     mainLogUtil->logAll(msg);
1436    
1437     res = sqlServer->Query(oss.str().c_str());
1438    
1439     stringstream oss1;
1440     oss1.str() = "";
1441     string msg1;
1442    
1443     if (!res) {
1444     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1445     msg1 = oss1.str();
1446     mainLogUtil->logError(msg1);
1447     return 1;
1448     }
1449 mocchiut 1.1
1450 pam-fi 1.8 if (res) {
1451     delete res;
1452     res = NULL;
1453     }
1454     mainLogUtil->logAll("TABLES UNLOCKED");
1455 mocchiut 1.1
1456 pam-fi 1.8 return 0;
1457 mocchiut 1.1 }
1458    
1459     /*********************************************************/
1460     //marco_new_31
1461 pam-fi 1.8 void PacketUser::OpenDBConnection(const char* tableTobeLocked) {
1462     if (do_cont_check) {
1463     //controllo che non sia gia' aperta
1464     if (!sqlServer) {
1465 mocchiut 1.16 sqlServer = TSQLServer::Connect(pelosconnection, db_user, db_pwd);
1466 pam-fi 1.8 if ((!sqlServer) || (!(sqlServer->IsConnected()))) {
1467     cout << "Can not connect with MYSQL sever" << endl;
1468     }
1469     mainLogUtil->logAll("Connected to DB");
1470 mocchiut 1.9 stringstream myquery;
1471     myquery.str("");
1472     myquery << "SET time_zone='+0:00'";
1473     sqlServer->Query(myquery.str().c_str());
1474 pam-fi 1.8 //blocca le tabelle
1475     LockTables(tableTobeLocked);
1476     }
1477     }
1478 mocchiut 1.1
1479     }
1480    
1481     //marco_new_31
1482 pam-fi 1.8 void PacketUser::CloseDBConnection() {
1483     if (do_cont_check) {
1484     //controllo che ce ne sia una aperta
1485     if (sqlServer && sqlServer->IsConnected()) {
1486     //marco_new: sblocca tutte le tabelle
1487     UnLockTables();
1488     sqlServer->Close();
1489     delete sqlServer;
1490     sqlServer = NULL;
1491     mainLogUtil->logAll("Closed Connection to DB");
1492     }
1493     }
1494 mocchiut 1.1 }
1495    
1496     /***********************************************************************************************************************/
1497     /*#################################################### HIC SUNT LEONES ################################################*/
1498     /***********************************************************************************************************************/
1499     //UNUSED: dbg functions...
1500    
1501     //Return the system time in ms
1502 pam-fi 1.8 unsigned long long PacketUser::Record_Time() {
1503     timeval tv;
1504     gettimeofday(&tv, NULL);
1505     unsigned long long timems = (unsigned long long) tv.tv_sec * (unsigned long long) 1000 + tv.tv_usec / 1000;
1506     return timems;
1507 mocchiut 1.1 }
1508    
1509     //dbg_functions:
1510    
1511     //UNUSED. save a packet in a file
1512 pam-fi 1.8 void PacketUser::savePKT_file(char* headerPkt, char* pamPkt, long int length, bool append, char* nomefile) {
1513     char fno[80] = "";
1514     ofstream fout;
1515     sprintf(fno, "%s/pkt%d_of_%s.pkt", gSystem->ExpandPathName(outDir), numPKTSaved, nomefile); // EMI
1516    
1517     if (append == true)
1518     fout.open(fno, ios::binary | ios::app);
1519     else
1520     fout.open(fno, ios::binary);
1521    
1522     if (!fout) {
1523     cout << "can not open output file " << fno << endl;
1524     return;
1525     }
1526     fout.write(headerPkt, LENGTH_HEADER_PKT);
1527     fout.write(pamPkt, length);
1528     fout.close();
1529 mocchiut 1.1 }
1530    
1531     //UNUSED
1532 pam-fi 1.8 void PacketUser::saveALL_PKT(char* headerPkt, char* pamPkt, long int length, bool append) {
1533     char fno[80] = "";
1534     ofstream fout;
1535     if (append == true) {
1536     sprintf(fno, "%s/packets.pkt", gSystem->ExpandPathName(outDir)); // EMI
1537     fout.open(fno, ios::binary | ios::app);
1538     }
1539     else {
1540     sprintf(fno, "%s/packet%d.pkt", gSystem->ExpandPathName(outDir), numPKT); // EMI
1541     fout.open(fno, ios::binary);
1542     }
1543    
1544     if (!fout) {
1545     cout << "can not open output file " << fno << endl;
1546     return;
1547     }
1548     fout.write(headerPkt, LENGTH_HEADER_PKT);
1549     fout.write(pamPkt, length);
1550     fout.close();
1551 mocchiut 1.1 }
1552    
1553     }

  ViewVC Help
Powered by ViewVC 1.1.23