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

Contents of /chewbacca/PamOffLineSW/PacketUser.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

1 //============================================================================
2 // $Id: PacketUser.cpp,v 1.16 2010/02/02 15:26:09 mocchiut Exp $
3 // Description :
4 //============================================================================
5 #include "PacketUser.h"
6 #include <sys/time.h>
7 #include <iostream>
8
9 namespace PamOffLineSW {
10 extern LogUtil* mainLogUtil;
11 extern short compression;
12 extern char *outDir;
13 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 extern unsigned int mmm_number;
21 extern unsigned int orbit_number;
22 extern unsigned long int time_Offset;
23 extern bool tryMerge;
24 extern bool candelete; // EM
25 //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 extern char* db_user;
33 extern char* db_pwd;
34 extern char* pelosconnection;
35
36 //per tenere conto reset obt
37 extern unsigned long int max_pkt_obt;
38
39 #define TAGVALUELEN 4
40 extern char tag_value[TAGVALUELEN];
41
42 PacketUser PacketUser::instance;
43
44 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 //EM
70 recoverlimit = 400;
71 idtorecover = new TArrayI(100);
72 arsize = 0;
73
74 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 }
242
243 //set the value of the counter and obt of the first packet of the group
244 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 //ogni volta che trovo una discontinuita` resetto come se mi trovassi in un nuovo download oppure uso i vecchi valori se esistono?
261
262 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 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
270 // NB: se ho discontinuita in genere non so a che download appartiene potrebbe proprio essere sbagliato tenere i vecchi valori
271
272 }
273
274 //starts a new root file
275 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 }
285
286 //set the value of the counter and obt of the last packet of the group
287 void PacketUser::setLast(unsigned long int counter, unsigned long int obt) {
288 pkt_number_last = counter;
289 obt_last = obt;
290 }
291
292 //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
326 //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
342 //I don't need to retrieve them again if they are good
343 // 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
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 }
361
362 //Boot Number
363 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
394 }
395 //set the real time of the first packet and the last packet oif a group of packet if possible
396 void PacketUser::setReal_Time() {
397
398 if (!obt_time_sync && !last_time_sync_info && numPKTSaved > recoverlimit) {
399 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 }
422
423 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 //timeOffset
452 //retrieve from table Table_GL_RESURS_OFFSET timeOffset
453 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 OpenDBConnection(NULL);// no, locak tutto Nota qui ho deciso di lockare solo questa tabella e non tutte
461 }
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 }
528
529 //this is public and can be called from the main at the end of the game
530 void PacketUser::FinishLastGroup() {
531 mainLogUtil->logAll("######################### Closing the last group ############################");
532 setReal_Time();
533 FinishGroup(rootfilename);
534 mainLogUtil->logAll("######################### Closed the last group ############################");
535 //
536 if (single_connection) {
537 CloseDBConnection();
538 }
539 }
540
541 //Finish the old root file
542 void PacketUser::FinishGroup(char * filename) {
543 if (pRun) {
544 if ( !( !real_time_init && !real_time_last && numPKTSaved <= recoverlimit ) || !candelete ) pRun->WriteFiles();
545 delete pRun;
546 pRun = NULL;
547 stringstream close;
548 close.str() = "";
549 string msg;
550
551 close << "TAG XX ######################### Close group in file: " << rootfilename << " ############################";
552 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 // return;
571 }
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
589 //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
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 // 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 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 // if (!single_connection) {
652 // CloseDBConnection();
653 // }
654 // return; // commented here...
655
656 };
657 }
658
659 if ( real_time_init || real_time_last) {
660 //saves info in DB in table Table_ROOT
661 if (boot_number == 0)
662 boot_number = boot_number_prevvalue;
663
664 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 oss.str() = "";
680 oss << "Problem storing information in DB regarding file: " << filename;
681 msg = oss.str();
682 mainLogUtil->logError(msg);
683 }
684 };
685
686 // if dbinfo is not empty than
687 if ( arsize > 0 ){
688
689 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
722 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
726 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
767 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
781 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
799 if (tryMerge) {
800 merge_ROOTfiles();
801 }
802
803 TString qu2 = Form("update ROOT_TABLE_BAD set ON_DISK='MVD' where ID_N=%i;",eid);
804 sqlServer->Query(qu2.Data());
805
806
807 }
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
815
816 };
817 ez++;
818 }
819 //
820 idtorecover->Reset();
821 delete idtorecover;
822 idtorecover = new TArrayI(100);
823 arsize = 0;
824 // delete app;
825 };
826 };
827
828 CleanDisk();
829 if (!single_connection) {
830 CloseDBConnection();
831 }
832
833 }//pRun
834 }
835
836
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 //save in Table_ROOT_Good or in Table_ROOT_Bad
866 bool PacketUser::saveROOT_DB(const char* table_name, const char* folder_name, const char* file_name,
867 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 int bad_pkt_read, int bad_pkt_CalRead, int num_PKT_Saved, const char* nome_input, bool _time_is_estimated) {
871 //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 << " (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 << " 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 << _time_is_estimated << ",'" << tag_value << "'" << ");";
881 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
904
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 }
916 // cout<<"DBG: my_id = "<<my_id<<endl;
917 if (res) {
918 delete res;
919 res = NULL;
920 }
921 return true;
922 }
923
924 void PacketUser::recover_boot_number() {
925 string msg1;
926 stringstream oss1;
927 stringstream oss;
928 oss.str("");
929 string query = "";
930 TSQLResult* res = NULL;
931 if (!boot_number || !id_to_recover_index)
932 return;
933
934 for (int i = 0; i < id_to_recover_index; i++) {
935 oss.str("");
936 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 }
947
948 for (int i = 0; i < id_to_recover_index; i++) {
949 oss.str("");
950 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 }
961
962 id_to_recover_index = 0;
963 }
964
965 /**********************************************************************************************/
966 /*###########################################################################################################*/
967 /********************************** MERGING *************************************************/
968 /*###########################################################################################################*/
969 // Merge ROT files: find other ROOT files in the same temporal ranges
970 // 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 bool PacketUser::merge_ROOTfiles() {
974 stringstream log;
975 log.str("");
976 string slog;
977
978 mainLogUtil->logInfo("Trying merging ROOT files");
979 double percentage = (double) (bad_pkt + bad_pkt_EventReader + bad_pkt_CalibReader) / numPKTSaved;
980
981 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
998 //marco_new: non considero mai caso di continuita'(mio finale=DB iniz o viceversa), non mi interessa
999 //marco_new: after e before contengono anche smaller ma con un bordo comune
1000 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
1156 mainLogUtil->logInfo("Finish merging ROOT files");
1157 return true;
1158
1159 }
1160
1161 //unsigned int root_id, percentage non le devo modificare
1162 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
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 oss << "UPDATE " << table_name << " SET PKT_NUMBER_FINAL =" << (pkt_number_init - 1) << ", PKT_OBT_FINAL ="
1178 << obt_init << ", REAL_TIME_LAST =" << real_time_init << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1179
1180 }
1181 else if (type_rel == BEFORE) {
1182 mainLogUtil->logInfo("Relaz:BEFORE = Updating Init values of the DB ROOT file");
1183
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 oss << "UPDATE " << table_name << " SET PKT_NUMBER_INIT =" << (pkt_number_last + 1) << ", PKT_OBT_INIT ="
1188 << obt_last << ", REAL_TIME_INIT =" << real_time_last << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1189 }
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 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 oss << "UPDATE " << table_name << " SET PKT_NUMBER_FINAL=" << (pkt_number_init - 1) << ", PKT_OBT_FINAL ="
1198 << obt_init << ", REAL_TIME_LAST =" << real_time_init << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1199
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 }
1235
1236 //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 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 query << " order by REAL_TIME_INIT ASC;";//marco_new: inutile
1262 //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 int good = 1;
1285 if ( pkt_number_in >= pkt_number_fin && abs((int)(pkt_number_fin-pkt_number_in))<10 ) good = 0;
1286
1287 stringstream oss;
1288 oss.str("");
1289 oss << "INSERT INTO " << table_name
1290 << " (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 << " VALUES ('" << 0 << "','" << root_id << "','" << pkt_number_in << "','" << pkt_number_fin << "','" << obt_in
1292 << "','" << obt_fin << "','" << mtime_init << "','" << mtime_last << "','" << mboot_num << "','" << percentage
1293 << "'," << "NULL" << ",'" << tag_value << "','" << good <<"');";
1294
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 }
1327
1328 //Utility: return max(IDN)
1329 unsigned int PacketUser::select_maxIDN_DB(const char* table_name) {
1330
1331 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
1377 return idN;
1378 }
1379
1380 /**
1381 * Lock par=table, if par=null lock all tables
1382 */
1383 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 // 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
1397 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 }
1420
1421 /**
1422 * UNLock tables
1423 */
1424 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
1434 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
1450 if (res) {
1451 delete res;
1452 res = NULL;
1453 }
1454 mainLogUtil->logAll("TABLES UNLOCKED");
1455
1456 return 0;
1457 }
1458
1459 /*********************************************************/
1460 //marco_new_31
1461 void PacketUser::OpenDBConnection(const char* tableTobeLocked) {
1462 if (do_cont_check) {
1463 //controllo che non sia gia' aperta
1464 if (!sqlServer) {
1465 sqlServer = TSQLServer::Connect(pelosconnection, db_user, db_pwd);
1466 if ((!sqlServer) || (!(sqlServer->IsConnected()))) {
1467 cout << "Can not connect with MYSQL sever" << endl;
1468 }
1469 mainLogUtil->logAll("Connected to DB");
1470 stringstream myquery;
1471 myquery.str("");
1472 myquery << "SET time_zone='+0:00'";
1473 sqlServer->Query(myquery.str().c_str());
1474 //blocca le tabelle
1475 LockTables(tableTobeLocked);
1476 }
1477 }
1478
1479 }
1480
1481 //marco_new_31
1482 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 }
1495
1496 /***********************************************************************************************************************/
1497 /*#################################################### HIC SUNT LEONES ################################################*/
1498 /***********************************************************************************************************************/
1499 //UNUSED: dbg functions...
1500
1501 //Return the system time in ms
1502 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 }
1508
1509 //dbg_functions:
1510
1511 //UNUSED. save a packet in a file
1512 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 }
1530
1531 //UNUSED
1532 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 }
1552
1553 }

  ViewVC Help
Powered by ViewVC 1.1.23