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

Contents of /chewbacca/PamOffLineSW/PacketUser.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (show annotations) (download)
Tue Nov 4 09:44:31 2008 UTC (16 years, 3 months ago) by mocchiut
Branch: MAIN
Changes since 1.1: +200 -180 lines
chewbacca upgrade, YP upgrade

1
2 //============================================================================
3 // $Id: PacketUser.cpp,v 1.69 2008-10-27 10:41:27 messineo Exp $
4 // Description :
5 //============================================================================
6 #include "PacketUser.h"
7 #include <sys/time.h>
8
9 namespace PamOffLineSW
10 {
11 extern LogUtil* mainLogUtil;
12 extern short compression ;
13 extern char *outDir;
14 extern TSQLServer *sqlServer;
15 extern bool multiFile;
16 extern char* fni;
17 extern char * nome_output;
18 extern bool is_new_route;
19 extern unsigned int download;
20
21 extern unsigned int mmm_number;
22 extern unsigned int orbit_number;
23 extern unsigned long int time_Offset;
24 extern bool tryMerge;
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* connection;
35
36 //per tenere conto reset obt
37 extern unsigned long int max_pkt_obt;
38
39
40 PacketUser PacketUser::instance;
41
42 int PacketUser::numDiscontinity=1;
43 int PacketUser::numPKT=0;
44 int PacketUser::numPKTSaved=0;
45
46 PacketUser& PacketUser::getInstance()
47 {
48 return instance;
49 }
50
51 PacketUser::PacketUser()
52 {
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 real_time_init=0;
64 real_time_last=0;
65 bad_pkt=0;
66 bad_pkt_EventReader=0;
67 bad_pkt_CalibReader=0;
68 reader= NULL;
69 pRun=NULL;
70 reader=new pamela::techmodel::EventReader();
71 Table_ROOT_Good="ROOT_TABLE";
72 Table_ROOT_Bad="ROOT_TABLE_BAD";
73 Table_GL_RESURS_OFFSET="GL_RESURS_OFFSET";
74 Table_ROOT_Merging="ROOT_TABLE_MERGING";
75 // good_pkt_Calib=0;
76 my_id=0;
77 boot_number=0;
78 }
79
80 PacketUser::~PacketUser()
81 {
82 if(reader){delete reader; reader = NULL;}
83 numDiscontinity=1;
84 numPKTSaved=0;
85 numPKT=0;
86 pkt_number_init=0;
87 obt_init=0;
88 pkt_number_last=0;
89 obt_last=0;
90 obt_time_sync = 0;
91 last_time_sync_info = 0;
92 real_time_init=0;
93 real_time_last=0;
94 bad_pkt=0;
95 bad_pkt_EventReader=0;
96 bad_pkt_CalibReader=0;
97 // good_pkt_Calib=0;
98 my_id=0;
99 boot_number=0;
100 }
101
102
103 //Put the packet in a root file. Create a new ROOT file for each group of packets
104 void PacketUser::usePKT(char*& headerPkt, char*& pamPkt, long int length, bool isCons, bool isPKTGood, const PacketType* type,
105 unsigned long int counter, unsigned long int obt)
106 {
107 //If the packet type was not recognised before
108 if(!type){return;}
109
110 //in order to start ...
111 if(numPKT==0)
112 {
113 if(single_connection){
114 OpenDBConnection(NULL);
115 }
116
117 setInit(counter,obt);
118 StartGroup();
119 }
120
121 //here we know if the incoming packet can be considered consecutive to the previuos one
122 if((!isCons)&&(numPKT!=0))
123 {
124 setReal_Time();
125 //closing the group in file rootfilename
126 FinishGroup(rootfilename);
127
128 //se gia' e' cambiato download non cambio numdisco
129 if(!is_new_route){numDiscontinity++;}
130
131 //the current pkt will be placed in a new group: rootfilename
132 setInit(counter,obt);
133 StartGroup();
134 }
135
136 //add current packet to the group and calculate bad_pkt_EventReader and bad_pkt_CalibReader
137 int ret=
138 reader->PKT_RunEvent(headerPkt, pamPkt, length, type);
139 /*
140 ret
141 0 packet good
142 1 exception but used //never happen
143 2 CRC exception but used
144 3 CALIBRATION PACKET with error but used
145 -1 CRC exception packet DISCARDED
146 -2 FATAL exception packet DISCARDED //never happen
147 -3 No way to read events of this type. packet DISCARDED( es OLD CalibCal)
148 ret = 10 if the packet is good but comes from a cadre with VRL problems
149 */
150
151 //here we also know if the packet comes from one or more corrupted cadres
152 if((!isPKTGood)&&(!ret)){ret=10;}
153 switch (ret)
154 {
155 case 0: {numPKTSaved++; break;}
156 case 1: {bad_pkt_EventReader++; numPKTSaved++; break;}
157 case 2: {bad_pkt_EventReader++;numPKTSaved++; break;}
158 case 3: {bad_pkt_CalibReader++; numPKTSaved++; break;}
159 case 10: {bad_pkt++; numPKTSaved++; break;}
160 default:{
161 stringstream oss;
162 oss.str()="";
163 oss<<"Packet DISCARDED, reason = "<<ret;
164 string msg = oss.str();
165 mainLogUtil->logAll(msg);
166 break;
167 }
168 }
169
170 /*
171 if ((ret==0)&&((type==PacketType::CalibTrk1)||(type==PacketType::CalibTrk2)|| (type==PacketType::CalibCalPed)))
172 {
173 good_pkt_Calib++;//maybe I will remove this in future
174 }
175 */
176
177 if(ret>=0)// only the packet not discarded of course
178 setLast(counter,obt);
179
180 //TODO: decide what kind of packet I can use here
181 // if((ret==0)||(ret==10))//I want to use only good packet
182 if(ret>=0)//I want to use only accepted packet
183 {
184 setTimeSync(pamPkt, length, type);//here I retrieve also the boot_number if packet type is vardump
185 }
186
187 //just to be sure ...
188 if(pamPkt){delete[] pamPkt; pamPkt = NULL;}
189 if(headerPkt){delete[] headerPkt; headerPkt = NULL;}
190
191 numPKT++;
192 }
193
194 //set the value of the counter and obt of the first packet of the group
195 void PacketUser::setInit(unsigned long int counter, unsigned long int obt)
196 {
197 sprintf(nnnn_mmm_ppp,"%05d_%03d_%03d", orbit_number, mmm_number, download);
198 sprintf(rootfilename,"%s_%s_%d", nome_output, nnnn_mmm_ppp, numDiscontinity);
199 pkt_number_init=counter;
200 obt_init=obt;
201 pkt_number_last=0;
202 obt_last=0;
203 real_time_init=0;
204 real_time_last=0;
205 bad_pkt=0;
206 numPKTSaved=0;
207 bad_pkt_EventReader=0; bad_pkt_CalibReader=0;
208 //good_pkt_Calib=0;
209
210 //marco_NB:
211 //ogni volta che trovo una discontinuit� resetto come se mi trovassi in un nuovo download oppure uso i vecchi valori se esistono?
212 obt_time_sync=0; last_time_sync_info=0; boot_number=0;
213 // NB: se ho discontinuita in genere non so a che download appartiene potrebbe proprio essere sbagliato tenere i vecchi valori
214
215 }
216
217 //starts a new root file
218 void PacketUser::StartGroup()
219 {
220 pRun = new PamelaRun(rootfilename, outDir, multiFile, compression);
221 strcat(rootfilename,".root");
222 reader->Init(pRun);
223 stringstream oss;
224 oss.str()="";
225 oss<<"######################### Start a new group in file: "<< rootfilename <<" ############################";
226 string msg = oss.str();
227 mainLogUtil->logInfo(msg);
228 }
229
230 //set the value of the counter and obt of the last packet of the group
231 void PacketUser::setLast(unsigned long int counter, unsigned long int obt)
232 {
233 pkt_number_last=counter;
234 obt_last=obt;
235 }
236
237
238
239 //retrieve obt_time_sync and last_time_sync_info from packet if type has special values and BOOT_NUMBER
240 void PacketUser::setTimeSync(char* packet, long int pktLength, const PacketType* type)
241 {
242 //do nothing
243 if(!do_cont_check) {
244 if(is_new_route)
245 is_new_route=false;
246 return;
247 }
248
249 //TODO: usare anche MCMD ... NOTA: questo da sempre errore ret != 0
250 //In RunHeader e RunTrailer sono in secondi(?), controllare se aggiungo altri tipi di paccheti se invece sono in secondi
251 // devo ricalcolare tutto non per ogni gruppetto (ROOT file) ma solo se cambia download
252 //When I found a new download I need to reset all values
253 if(is_new_route)
254 {
255 //reset
256 is_new_route=false;
257 obt_time_sync=0; last_time_sync_info=0;
258 boot_number=0;
259 if(time_Offset)
260 timeOffset=time_Offset;
261 else
262 timeOffset=retrieveTimeOffset(Table_GL_RESURS_OFFSET);
263 }
264
265 //retrieve boot number if possible
266 setBootNumber(packet,pktLength,type);
267
268 //Retrieve if possible obt_time_sync and last_time_sync_info
269 int offset=0;
270 if(type==PacketType::RunHeader)
271 {
272 offset=0;
273 }
274 else if(type==PacketType::RunTrailer)
275 {
276 offset=3;
277 }
278 else if(type==PacketType::Mcmd)
279 {
280 // mainLogUtil->logAll("TODO: Packet Mcmd now is not used to retrieve Absolute time. This may cause problems somewhere.");
281 return;
282 }
283 else
284 {
285 return;
286 }
287
288 //I don't need to retrieve them again if they are good
289 if((obt_time_sync)||(last_time_sync_info)) return;
290
291 obt_time_sync = (((UINT32)packet[5+offset]<<24)&0xFF000000) + (((UINT32)packet[6+offset]<<16)&0x00FF0000) + (((UINT32)packet[7+offset]<<8)&0x0000FF00) + (((UINT32)packet[8+offset])&0x000000FF);
292 last_time_sync_info = (((UINT32)packet[9+offset]<<24)&0xFF000000) + (((UINT32)packet[10+offset]<<16)&0x00FF0000) + (((UINT32)packet[11+offset]<<8)&0x0000FF00) + (((UINT32)packet[12+offset])&0x000000FF);
293
294 stringstream oss;
295 oss.str()="";
296 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();
297 string msg = oss.str();
298 mainLogUtil->logAll(msg);
299 }
300
301 //Boot Number
302 void PacketUser::setBootNumber(char* packet, long int pktLength, const PacketType* type)
303 {
304 //se gia calcolato esco: lo calcolo una volta per download e per continuita'
305 if(boot_number) return;
306
307 if(type==PacketType::VarDump)
308 {
309 int b_offset = 34;//4+5*6
310 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);
311
312 /*
313 long int dataLength = pktLength - 2; //the block of data
314 int b_offset = 4;
315 while (b_offset < dataLength){
316 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);
317 b_offset = b_offset + 5;
318 }
319 */
320 stringstream oss;
321 oss.str()="";
322 oss<<"In download: "<<download<<" boot_number: "<<boot_number<<" using Packet Type: "<<type->GetName().c_str();
323 string msg = oss.str();
324 mainLogUtil->logAll(msg);
325 return;
326 }
327 else
328 {
329 return;
330 }
331
332 }
333 //set the real time of the first packet and the last packet oif a group of packet if possible
334 void PacketUser::setReal_Time()
335 {
336 if((obt_time_sync)||(last_time_sync_info))
337 {
338
339 real_time_init=(obt_init/1000-obt_time_sync)+last_time_sync_info;
340 //se obt si e' resettato
341 if(obt_last<obt_init)
342 {
343 real_time_last=(max_pkt_obt/1000+ obt_last/1000-obt_time_sync)+last_time_sync_info;
344 stringstream oss;
345 oss.str()="";
346 oss<<"obt_last("<<obt_last<<") < obt_init("<<obt_init<<"). It is due to Pamela Reset. Adding max_pkt_obt("<<max_pkt_obt<<") to obt_last in order to compute real_time_last";
347 string msg = oss.str();
348 mainLogUtil->logWarning(msg);
349 }
350 else
351 real_time_last=(obt_last/1000-obt_time_sync)+last_time_sync_info;
352 real_time_init+=timeOffset;
353 real_time_last+=timeOffset;
354
355
356 }
357 }
358
359 //timeOffset
360 //retrieve from table Table_GL_RESURS_OFFSET timeOffset
361 unsigned long int PacketUser::retrieveTimeOffset(char * table)
362 {
363 if(!do_cont_check) return 0;
364
365 //if(!table){table=Table_GL_RESURS_OFFSET}
366
367 if(!single_connection){
368 OpenDBConnection(table);//Nota qui ho deciso di lockare solo questa tabella e non tutte
369 }
370
371 UInt_t t0 = 0;//toffset
372 stringstream oss;
373 oss.str("");
374 oss << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM "<< table <<" WHERE SPECIAL_FILE='"
375 << nnnn_mmm_ppp << "';";
376
377 string msg = oss.str();
378 mainLogUtil->logAll(msg);
379
380 TSQLResult* res=NULL;
381 TSQLRow* row=NULL;
382 res= sqlServer->Query(oss.str().c_str());
383 if(!res)
384 {
385 mainLogUtil->logError("DBError retrieveTimeOffset 1");
386 return 0;
387 }
388
389 row=res->Next();
390 if (!row )
391 {
392 if(res){delete res; res = NULL;}
393
394 oss.str("");
395 oss << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM "<< table <<" WHERE FROM_ORBIT < "
396 << orbit_number << " order by FROM_ORBIT desc limit 1;";
397
398 string msg2 = oss.str();
399 mainLogUtil->logAll(msg2);
400
401 res= sqlServer->Query(oss.str().c_str());
402 if(!res)
403 {
404 mainLogUtil->logError("DBError retrieveTimeOffset 2");
405 return 0;
406 }
407 row=res->Next();
408 if (!row)
409 {
410 mainLogUtil->logError("DBError retrieveTimeOffset 3");
411 return 0;
412 }
413
414 }
415
416 TTimeStamp tu = TTimeStamp((UInt_t)atoi(row->GetField(0)),(UInt_t)atoi(row->GetField(1)),(UInt_t)atoi(row->GetField(2)),(UInt_t)atoi(row->GetField(3)),(UInt_t)atoi(row->GetField(4)),(UInt_t)atoi(row->GetField(5)),0,true,0);
417 t0 = (UInt_t)tu.GetSec();
418
419 if(res){delete res; res = NULL;}
420 if(row){delete row; row = NULL;}
421
422 if(!single_connection){
423 CloseDBConnection();
424 }
425 return t0;
426 }
427
428 //this is public and can be called from the main at the end of the game
429 void PacketUser::FinishLastGroup()
430 {
431 mainLogUtil->logAll("######################### Closing the last group ############################");
432 setReal_Time();
433 FinishGroup(rootfilename);
434 mainLogUtil->logAll("######################### Closed the last group ############################");
435 if(single_connection){
436 CloseDBConnection();
437 }
438 }
439
440 //Finish the old root file
441 void PacketUser::FinishGroup(char * filename)
442 {
443 if(pRun)
444 {
445 pRun->WriteFiles();
446 delete pRun; pRun = NULL;
447 stringstream close;
448 close.str()="";
449 string msg;
450
451 close<<"######################### Close group in file: "<< rootfilename <<" ############################";
452 msg = close.str();
453 mainLogUtil->logInfo(msg);
454
455 // se non faccio proprio controlli su continuita' neanche salvo su DB
456 if(!do_cont_check) return;
457
458 stringstream oss;
459 oss.str()="";
460
461 //TODO: check when I don't want to log in DB informations
462 // se non ho salvato nessun pacchetto
463 if(numPKTSaved==0){
464 stringstream err;
465 err.str()="";
466 err<<"NO PACKET SAVED in file: "<< rootfilename <<" The group is empty: you can remove this file.";
467 msg = err.str();
468 mainLogUtil->logError(msg);
469 return;
470 }
471
472 //se non ho salvato nessun pacchetto buono
473 if((numPKTSaved-bad_pkt_EventReader-bad_pkt_CalibReader-bad_pkt)==0){
474 stringstream err;
475 err.str()="";
476 err<<"NO GOOD PACKET SAVED in file: "<< rootfilename <<" The group is BAD: you may want to remove this file.";
477 msg = err.str();
478 mainLogUtil->logInfo(msg);
479 // mainLogUtil->logError(msg);
480 // return; //TODO: decidi se nn vuoi affatto usarlo o addirittura salvarlo tra i BAD???
481 }
482
483 if(!single_connection){
484 OpenDBConnection(NULL);//Nota qui ho deciso di lockare tutte le tabelle
485 }
486
487 //don't save in Table_ROOT_Good and don't search for ROOT files in the same temporal range
488 if((!real_time_init)&&(!real_time_last))
489 {
490 //saved in another table for future study
491 if(saveROOT_DB(Table_ROOT_Bad, outDir,
492 filename,
493 pkt_number_init, pkt_number_last,
494 obt_init, obt_last,
495 obt_time_sync, last_time_sync_info,
496 real_time_init, real_time_last,
497 boot_number,
498 timeOffset,
499 bad_pkt, bad_pkt_EventReader, bad_pkt_CalibReader, numPKTSaved,
500 fni)==true)
501 {
502 oss.str()="";
503 oss<<"Saved information regarding file: "<<filename<<" in table "<<Table_ROOT_Bad;
504 msg = oss.str();
505 mainLogUtil->logInfo(msg);
506 }
507 else
508 {
509 oss.str()="";
510 oss<<"Problem storing information in DB regarding file: "<<filename;
511 msg = oss.str();
512 mainLogUtil->logError(msg);
513 }
514
515 if(!single_connection){
516 CloseDBConnection();
517 }
518
519 return;
520 }
521
522 //saves info in DB in table Table_ROOT_Good
523 if(saveROOT_DB(Table_ROOT_Good, outDir,
524 filename,
525 pkt_number_init, pkt_number_last,
526 obt_init, obt_last,
527 obt_time_sync, last_time_sync_info,
528 real_time_init, real_time_last,
529 boot_number,
530 timeOffset,
531 bad_pkt, bad_pkt_EventReader, bad_pkt_CalibReader, numPKTSaved,
532 fni)==true)
533 {
534 oss<<"Saved information regarding file: "<<filename<<" in table "<<Table_ROOT_Good<< " id= "<<my_id;
535 msg = oss.str();
536 mainLogUtil->logInfo(msg);
537
538 if(tryMerge){
539 merge_ROOTfiles();
540 }
541 }
542 else
543 {
544 oss<<"Problem storing information in DB regarding file: "<<filename;
545 msg = oss.str();
546 mainLogUtil->logError(msg);
547 }
548
549 if(!single_connection){
550 CloseDBConnection();
551 }
552
553 }//pRun
554 }
555
556 //save in Table_ROOT_Good or in Table_ROOT_Bad
557 bool PacketUser::saveROOT_DB(char* table_name, char* folder_name, char* file_name,
558 unsigned long int pkt_number_in, unsigned long int pkt_number_fin,
559 unsigned long int obt_in, unsigned long int obt_fin,
560 unsigned long int oT_sync, unsigned long int lT_sync_info,
561 unsigned long int mtime_init, unsigned long int mtime_last,
562 unsigned long int mboot_num,
563 unsigned long int time_offset,
564 int bad_pkt, int bad_pkt_read, int bad_pkt_CalRead, int num_PKT_Saved,
565 char* nome_input){
566 //TODO: forse far ritornare ID della cosa appena inserita se e' andatato tutto ok invece che true false?
567 stringstream oss;
568 oss.str("");
569 oss << "INSERT INTO "<< table_name <<" (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)"
570 << " VALUES ('"<<0<< "','" <<folder_name<<"','" <<file_name<< "','" << pkt_number_in <<"','"<< pkt_number_fin << "','"<< obt_in <<"','"<< obt_fin<< "','"
571 << oT_sync << "','" << lT_sync_info << "','"
572 << mtime_init << "','" << mtime_last << "','"
573 << mboot_num << "','"
574 << time_offset << "','"
575 << bad_pkt <<"','" << bad_pkt_read <<"','"<< bad_pkt_CalRead <<"','"<< num_PKT_Saved<<"','"
576 << nome_input <<"',"
577 <<"NULL"<<
578 ")";
579 string msg = oss.str();
580 mainLogUtil->logAll(msg);
581
582 stringstream oss1;
583 oss1.str()="";
584 string msg1;
585
586 TSQLResult* res=NULL;
587 res= sqlServer->Query(oss.str().c_str());
588 if(!res)
589 {
590 oss1<<"DBError UNABLE to: "<<oss.str().c_str()<<endl;
591 msg1=oss1.str();
592 mainLogUtil->logError(msg1);
593 return false;
594 }
595
596 //the ID of the current ROOT file in table Table_ROOT_Good
597 my_id = select_maxIDN_DB(table_name);
598 // cout<<"DBG: my_id = "<<my_id<<endl;
599 if(res){delete res; res = NULL;}
600 return true;
601 }
602
603 /**********************************************************************************************/
604 /*###########################################################################################################*/
605 /********************************** MERGING *************************************************/
606 /*###########################################################################################################*/
607 // Merge ROOT files: find other ROOT files in the same temporal ranges
608 // it finds ROOT files that covers particular temporal range of interest and save this info in DB
609 /**********************************************************************************************/
610 //try to merge current ROOT file with files in DB
611 bool PacketUser::merge_ROOTfiles()
612 {
613 stringstream log;
614 log.str("");
615 string slog;
616
617 mainLogUtil->logInfo("Trying merging ROOT files");
618 double percentage=(double)(bad_pkt+bad_pkt_EventReader+bad_pkt_CalibReader)/numPKTSaved;
619
620 TSQLResult* res=NULL;
621 TSQLRow* row =NULL;
622 //numero di ROOT files trovati sul DB che hanno relaz di tipo dato
623 unsigned int num_rows=0;
624
625 //Record su DB:
626 unsigned int idN = 0;
627 unsigned int root_id_db=0;
628 unsigned long int pkt_num_in_db=0;
629 unsigned long int pkt_num_fin_db=0;
630 unsigned long int pkt_obt_in_db=0;
631 unsigned long int pkt_obt_fin_db=0;
632 unsigned long int time_in_db=0;
633 unsigned long int time_fin_db=0;
634 unsigned int boot_num_db=0;
635 double perc=0;
636
637
638 //marco_new: non considero mai caso di continuita'(mio finale=DB iniz o viceversa), non mi interessa
639 //marco_new: after e before contengono anche smaller ma con un bordo comune
640 for(int relaz=AFTER; relaz<=BIGGER; relaz++)
641 {
642 //marco_new: esci se sono arrivato a zero
643 if(real_time_last==real_time_init)
644 {
645 log.str("");
646 log<<"Current File Lenght=0; real_time_last=real_time_init= "<<real_time_last;
647 slog=log.str();
648 mainLogUtil->logAll(slog);
649 mainLogUtil->logInfo("Finish merging ROOT files");
650 if(res){delete res; res = NULL;}
651 if(row){delete row; row = NULL;}
652 return true;
653 }
654
655 num_rows=0;
656 res = Select_merging(Table_ROOT_Merging, real_time_init, real_time_last, (type_Rel_ROOT)relaz);
657
658 if (!res)
659 {
660 mainLogUtil->logError("DB_ERROR: Unable to find ROOT files to be merged RES=null");
661 return false;
662 }
663
664 num_rows=res->GetRowCount();
665 log.str("");
666 log<<"Found "<<num_rows<<" ROOT file in DB with relation of kind = "<<relaz;
667 slog=log.str();
668 mainLogUtil->logAll(slog);
669
670 if(num_rows>0)
671 {
672 for(unsigned int i=0; i<num_rows; i++)
673 {
674 row=res->Next();
675 if (!row)
676 {
677 mainLogUtil->logError("DB_ERROR: Unable to find ROOT files to be merged. ROW=null");
678 if(res){delete res; res = NULL;}
679 return false;
680 }
681
682 //Leggi Record dal DB:
683 idN=atoll(row->GetField(0));
684 root_id_db=atoll(row->GetField(1));
685 pkt_num_in_db=atoll(row->GetField(2));
686 pkt_num_fin_db=atoll(row->GetField(3));
687 pkt_obt_in_db=atoll(row->GetField(4));
688 pkt_obt_fin_db=atoll(row->GetField(5));
689 time_in_db=atoll(row->GetField(6));
690 time_fin_db=atoll(row->GetField(7));
691 boot_num_db=atoll(row->GetField(8));
692 perc=atof(row->GetField(9));
693
694 log.str("");
695 log<<"*** ROOT file found in DB has idN= "<<idN<<" root_id_db= "<<root_id_db;
696 log<<" pkt_num_in_db= "<<pkt_num_in_db<<" pkt_num_fin_db= "<<pkt_num_fin_db<<" pkt_obt_in_db= "<<pkt_obt_in_db<<" pkt_obt_fin_db= "<<pkt_obt_fin_db;
697 log<<" time_in_db= "<<time_in_db<<" time_fin_db= "<<time_fin_db<<" boot_num_db= "<<boot_num_db<<" perc= "<<perc<<" ***";
698 log<<"\n*** Current ROOT file has pkt_number_init= "<<pkt_number_init<<" obt_init= "<<obt_init<<" real_time_init= "<<real_time_init;
699 log<<" pkt_number_last= "<<pkt_number_last<<" obt_last= "<<obt_last<<" real_time_last= "<<real_time_last<<" ***";
700 slog=log.str();
701 mainLogUtil->logAll(slog);
702 if(perc>percentage)
703 {
704 mainLogUtil->logInfo("Current ROOT file is better than the one in DB");
705 //modifica DB
706 updateMergeROOT_DB(Table_ROOT_Merging,
707 root_id_db,
708 pkt_num_in_db, pkt_num_fin_db,
709 pkt_obt_in_db, pkt_obt_fin_db,
710 time_in_db, time_fin_db,
711 boot_num_db,
712 perc,
713 idN,(type_Rel_ROOT)relaz);
714 }
715 else
716 {
717 mainLogUtil->logInfo("Found ROOT file in DB is better than current ROOT file");
718 if(relaz == AFTER)
719 {
720 mainLogUtil->logInfo("Relaz:AFTER = Changing Init values of the Current ROOT file");
721 pkt_number_init = pkt_num_fin_db;
722 obt_init = pkt_obt_fin_db;
723 real_time_init = time_fin_db;
724 log.str("");
725 log<<"\n*** Current ROOT file becomes: pkt_number_init= "<<pkt_number_init<<" obt_init= "<<obt_init<<" real_time_init= "<<real_time_init;
726 log<<" pkt_number_last= "<<pkt_number_last<<" obt_last= "<<obt_last<<" real_time_last= "<<real_time_last<<" ***";
727 slog=log.str();
728 mainLogUtil->logAll(slog);
729 }
730 else if(relaz == BEFORE)
731 {
732 mainLogUtil->logInfo("Relaz:BEFORE = Changing Last values of the Current ROOT file");
733 pkt_number_last = pkt_num_in_db;
734 obt_last = pkt_obt_in_db;
735 real_time_last = time_in_db;
736
737 log.str("");
738 log<<"\n*** Current ROOT file becomes: pkt_number_init= "<<pkt_number_init<<" obt_init= "<<obt_init<<" real_time_init= "<<real_time_init;
739 log<<" pkt_number_last= "<<pkt_number_last<<" obt_last= "<<obt_last<<" real_time_last= "<<real_time_last<<" ***";
740 slog=log.str();
741 mainLogUtil->logAll(slog);
742 }
743 else if(relaz == SMALLER)
744 {
745 //non devo proprio salvarlo ed esco ...
746 mainLogUtil->logInfo("Relaz:SMALLER = Nothing to save");
747 mainLogUtil->logInfo("\nFinish merging ROOT files");
748 if(res){delete res; res = NULL;}
749 if(row){delete row; row = NULL;}
750 return true;
751 }
752 else if(relaz == BIGGER)//spezzettamento
753 {
754 mainLogUtil->logInfo("Relaz:BIGGER = (1st part) Saving the first part of the Current ROOT file");
755 saveMergeROOT_DB(Table_ROOT_Merging, my_id,
756 pkt_number_init, pkt_num_in_db,
757 obt_init, pkt_obt_in_db,
758 real_time_init, time_in_db,
759 boot_number,
760 percentage);
761
762 mainLogUtil->logInfo("Relaz:BIGGER = (2nd part)Changing Init values of the Current ROOT file");
763 pkt_number_init = pkt_num_fin_db;
764 obt_init= pkt_obt_fin_db;
765 real_time_init= time_fin_db;
766
767 log.str("");
768 log<<"\n*** Current ROOT file becomes: pkt_number_init= "<<pkt_number_init<<" obt_init= "<<obt_init<<" real_time_init= "<<real_time_init;
769 log<<" pkt_number_last= "<<pkt_number_last<<" obt_last= "<<obt_last<<" real_time_last= "<<real_time_last<<" ***";
770 slog=log.str();
771 mainLogUtil->logAll(slog);
772 }//if relaz
773 }//if perc
774 }//for num_rows
775 }//if num_rows
776
777 if(res){delete res; res = NULL;}
778 if(row){delete row; row = NULL;}
779
780 }//for relaz
781
782 mainLogUtil->logInfo("Saving Current ROOT file");
783 saveMergeROOT_DB(Table_ROOT_Merging, my_id,
784 pkt_number_init, pkt_number_last,
785 obt_init, obt_last,
786 real_time_init, real_time_last,
787 boot_number,
788 percentage);
789
790 mainLogUtil->logInfo("Finish merging ROOT files");
791 return true;
792
793 }
794
795 //unsigned int root_id, percentage non le devo modificare
796 bool PacketUser::updateMergeROOT_DB(char* table_name,
797 unsigned int root_id,
798 unsigned long int pkt_number_in, unsigned long int pkt_number_fin,
799 unsigned long int obt_in, unsigned long int obt_fin,
800 unsigned long int mtime_init, unsigned long int mtime_last,
801 unsigned long int mboot_num,
802 double bad_perc,
803 unsigned int ID_record, type_Rel_ROOT type_rel){
804
805 stringstream oss;
806 oss.str("");
807
808 if(type_rel == AFTER){
809 mainLogUtil->logInfo("Relaz:AFTER = Updating Last values of the DB ROOT file");
810 //marco_new:tolti tutti gli apici che qui non devono essere
811 oss << "UPDATE "<< table_name
812 << " SET PKT_NUMBER_FINAL ="<< pkt_number_init
813 <<", PKT_OBT_FINAL ="<< obt_init
814 <<", REAL_TIME_LAST ="<< real_time_init<<" WHERE ID_N ="<< ID_record <<";";
815
816 }
817 else if(type_rel == BEFORE){
818 mainLogUtil->logInfo("Relaz:BEFORE = Updating Init values of the DB ROOT file");
819 oss << "UPDATE "<< table_name
820 << " SET PKT_NUMBER_INIT ="<< pkt_number_last
821 <<", PKT_OBT_INIT ="<< obt_last
822 <<", REAL_TIME_INIT ="<< real_time_last<<" WHERE ID_N ="<< ID_record<<";";
823 }
824 else if(type_rel == SMALLER){
825 //spezzettamentento
826 mainLogUtil->logInfo("Relaz:SMALLER = (1st part) Updating Last values of the DB ROOT file");
827
828 oss << "UPDATE "<< table_name
829 << " SET PKT_NUMBER_FINAL="<< pkt_number_init
830 <<", PKT_OBT_FINAL ="<< obt_init
831 <<", REAL_TIME_LAST ="<< real_time_init<<" WHERE ID_N ="<< ID_record<<";";
832
833 mainLogUtil->logInfo("Relaz:SMALLER = (2nd part) Saving the second part of the DB ROOT file");
834
835 saveMergeROOT_DB(table_name, root_id,
836 pkt_number_last, pkt_number_fin,
837 obt_last, obt_fin,
838 real_time_last, mtime_last,
839 mboot_num,
840 bad_perc);
841 }
842 else if(type_rel == BIGGER){
843 //marco_new: ok anche se coincidenti etc
844 oss << "DELETE FROM "<< table_name <<" WHERE ID_N ="<< ID_record<<";";
845 mainLogUtil->logInfo("Record deleted from merging table");
846 }
847 else
848 return false;
849
850 string msg = oss.str();
851 mainLogUtil->logInfo(msg);
852
853 stringstream oss1;
854 oss1.str()="";
855 string msg1;
856
857 TSQLResult* res=NULL;
858 res= sqlServer->Query(oss.str().c_str());
859 if(!res)
860 {
861 oss1<<"DBError UNABLE to: "<<oss.str().c_str()<<endl;
862 msg1=oss1.str();
863 mainLogUtil->logError(msg1);
864 return false;
865 }
866 if(res){delete res; res = NULL;}
867 return true;
868 }
869
870 //cerca eventuali ROOT files in DB che possono venire mergiati
871 //marco_new bordi: messo in after a before casi in cui smaller con un bordo in comune
872 //marco_new bordi: messo in bigger casi con bordi in comune; tra questi anche caso particolare di coincidente
873 //marco_new bordi: smaller resta solo caso in cui DB e' piu largo sia a dx che a sx
874 TSQLResult* PacketUser::Select_merging(char* table_name, unsigned long int mtime_init, unsigned long int mtime_last, type_Rel_ROOT type_rel)
875 {
876 TSQLResult* res=NULL;
877 stringstream query;
878 query.str("");
879
880 if(type_rel == AFTER)
881 query<<"select * from "<<table_name<<" where REAL_TIME_LAST > "<< mtime_init <<" and REAL_TIME_LAST <= "<< mtime_last <<" and REAL_TIME_INIT < "<< mtime_init;
882 else if(type_rel == BEFORE)
883 query<<"select * from "<<table_name<<" where REAL_TIME_INIT >= "<< mtime_init <<" and REAL_TIME_INIT < "<< mtime_last <<" and REAL_TIME_LAST > "<< mtime_last;
884 else if(type_rel == SMALLER)
885 query<<"select * from "<<table_name<<" where REAL_TIME_INIT < "<< mtime_init <<" and REAL_TIME_LAST > "<< mtime_last;
886 else if(type_rel == BIGGER)
887 query<<"select * from "<<table_name<<" where REAL_TIME_INIT >= "<< mtime_init <<" and REAL_TIME_LAST <= "<< mtime_last;
888 else
889 return 0;
890
891 query<< " order by REAL_TIME_INIT ASC";//marco_new: inutile
892 //se volessi mettere un filtro sulla qualita'
893 // query<<" and NUM_PKT_SAVED - BAD_PKT_CALREAD - BAD_PKT_READ - BAD_PKT >= 2" ;
894 string msg = query.str();
895 mainLogUtil->logAll(msg);
896 res= sqlServer->Query(query.str().c_str());
897 stringstream oss1;
898 oss1.str()="";
899 string msg1;
900
901 if (!res)
902 {
903 oss1<<"DBError UNABLE to: "<<query.str().c_str()<<endl;
904 msg1=oss1.str();
905 mainLogUtil->logError(msg1);
906 }
907
908 return res;
909 }
910
911 bool PacketUser::saveMergeROOT_DB(char* table_name, unsigned int root_id,
912 unsigned long int pkt_number_in, unsigned long int pkt_number_fin,
913 unsigned long int obt_in, unsigned long int obt_fin,
914 unsigned long int mtime_init, unsigned long int mtime_last,
915 unsigned long int mboot_num,
916 double percentage)
917 {
918
919 stringstream oss;
920 oss.str("");
921 oss << "INSERT INTO "<< table_name <<" (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)"
922 << " VALUES ('"<<0<< "','" <<root_id<<"','"<< pkt_number_in <<"','"<< pkt_number_fin << "','"<< obt_in <<"','"<< obt_fin<< "','"
923 << mtime_init << "','" << mtime_last << "','"
924 << mboot_num <<"','"
925 << percentage <<"',"
926 <<"NULL"<<
927 ")";
928
929 string msg = oss.str();
930 mainLogUtil->logAll(msg);
931
932
933 //marco_new: controlla
934 //marco_new: esci se sono arrivato a zero
935 // if(real_time_last==real_time_init){
936 if(mtime_init==mtime_last){
937 mainLogUtil->logAll("Nothing to be saved");
938
939 // if(res){delete res; res = NULL;}
940 // if(row){delete row; row = NULL;}
941 return true;
942 }
943
944 stringstream oss1;
945 oss1.str()="";
946 string msg1;
947
948 TSQLResult* res=NULL;
949 res= sqlServer->Query(oss.str().c_str());
950 if(!res)
951 {
952 oss1<<"DBError UNABLE to: "<<oss.str().c_str()<<endl;
953 msg1=oss1.str();
954 mainLogUtil->logError(msg1);
955 return false;
956 }
957 if(res){delete res; res = NULL;}
958 return true;
959 }
960
961 //Utility: return max(IDN)
962 unsigned int PacketUser::select_maxIDN_DB(char* table_name)
963 {
964
965 if (!strcmp(table_name,Table_ROOT_Bad))
966 {
967 return 0;
968 }
969 unsigned int idN=0;
970 TSQLResult* res=NULL;
971 stringstream oss;
972 oss.str("");
973 oss<<"select max(ID_N) from "<<table_name;
974 // string msg = oss.str();
975 // mainLogUtil->logAll(msg);
976 res= sqlServer->Query(oss.str().c_str());
977
978 stringstream oss1;
979 oss1.str()="";
980 string msg1;
981
982 if(!res)
983 {
984 oss1<<"DBError UNABLE to: "<<oss.str().c_str()<<endl;
985 msg1=oss1.str();
986 mainLogUtil->logError(msg1);
987 return 0;
988 }
989
990 TSQLRow* row=NULL;
991 row=res->Next();
992 if (!row )
993 {
994 oss1<<"DBError UNABLE to: "<<oss.str().c_str()<<endl;
995 msg1=oss1.str();
996 mainLogUtil->logError(msg1);
997 return 0;
998 }
999
1000 idN=atoi(row->GetField(0));
1001 if(row){delete row; row = NULL;}
1002 if(res){delete res; res = NULL;}
1003
1004 oss<<". idN = "<<idN;
1005 string msg = oss.str();
1006 mainLogUtil->logAll(msg);
1007
1008 return idN;
1009 }
1010
1011 /**
1012 * Lock par=table, if par=null lock all tables
1013 */
1014 int PacketUser::LockTables(char* tableTobeLocked)
1015 {
1016 //se non ho il DB :)
1017 if(!do_cont_check) return 999;
1018
1019 TSQLResult* res=NULL;
1020 stringstream oss;
1021 oss.str("");
1022 if(!tableTobeLocked)
1023 oss << "lock table "<<Table_ROOT_Good<<" write, "<<Table_ROOT_Bad<<" write, "<<Table_GL_RESURS_OFFSET<<" write, "<<Table_ROOT_Merging<<" write;";
1024 else
1025 oss << "lock table "<<tableTobeLocked<<" write; ";
1026
1027 string msg = oss.str();
1028 mainLogUtil->logAll(msg);
1029
1030 res= sqlServer->Query(oss.str().c_str());
1031
1032 stringstream oss1;
1033 oss1.str()="";
1034 string msg1;
1035
1036 if(!res)
1037 {
1038 oss1<<"DBError UNABLE to: "<<oss.str().c_str()<<endl;
1039 msg1=oss1.str();
1040 mainLogUtil->logError(msg1);
1041 return 1;
1042 }
1043
1044 if(res){delete res; res = NULL;}
1045 mainLogUtil->logAll("TABLES LOCKED");
1046 return 0;
1047 }
1048
1049 /**
1050 * UNLock tables
1051 */
1052 int PacketUser::UnLockTables(){
1053 //se non ho il DB :)
1054 if(!do_cont_check) return 999;
1055
1056 TSQLResult* res=NULL;
1057 stringstream oss;
1058 oss.str("");
1059 oss << "unlock tables;";
1060
1061 string msg = oss.str();
1062 mainLogUtil->logAll(msg);
1063
1064 res= sqlServer->Query(oss.str().c_str());
1065
1066 stringstream oss1;
1067 oss1.str()="";
1068 string msg1;
1069
1070 if(!res)
1071 {
1072 oss1<<"DBError UNABLE to: "<<oss.str().c_str()<<endl;
1073 msg1=oss1.str();
1074 mainLogUtil->logError(msg1);
1075 return 1;
1076 }
1077
1078 if(res){delete res; res = NULL;}
1079 mainLogUtil->logAll("TABLES UNLOCKED");
1080
1081 return 0;
1082 }
1083
1084 /*********************************************************/
1085 //marco_new_31
1086 void PacketUser::OpenDBConnection(char* tableTobeLocked){
1087 if(do_cont_check){
1088 //controllo che non sia gia' aperta
1089 if(!sqlServer){
1090 sqlServer = TSQLServer::Connect(connection,db_user,db_pwd);
1091 if ((!sqlServer)||(!(sqlServer->IsConnected()))){cout<<"Can not connect with MYSQL sever"<<endl;}
1092 mainLogUtil->logAll("Connected to DB");
1093 //blocca le tabelle
1094 LockTables(tableTobeLocked);
1095 }
1096 }
1097
1098 }
1099
1100 //marco_new_31
1101 void PacketUser::CloseDBConnection(){
1102 if(do_cont_check){
1103 //controllo che ce ne sia una aperta
1104 if(sqlServer && sqlServer->IsConnected()){
1105 //marco_new: sblocca tutte le tabelle
1106 UnLockTables();
1107 sqlServer->Close();
1108 delete sqlServer;
1109 sqlServer=NULL;
1110 mainLogUtil->logAll("Closed Connection to DB");
1111 }
1112 }
1113 }
1114
1115
1116
1117 /***********************************************************************************************************************/
1118 /*#################################################### HIC SUNT LEONES ################################################*/
1119 /***********************************************************************************************************************/
1120 //UNUSED: dbg functions...
1121
1122 //Return the system time in ms
1123 unsigned long long PacketUser::Record_Time(){
1124 timeval tv;
1125 gettimeofday(&tv,NULL);
1126 unsigned long long timems = (unsigned long long)tv.tv_sec * (unsigned long long)1000 + tv.tv_usec / 1000;
1127 return timems;
1128 }
1129
1130 //dbg_functions:
1131
1132 //UNUSED. save a packet in a file
1133 void PacketUser::savePKT_file(char* headerPkt,
1134 char* pamPkt,
1135 long int length,
1136 bool append,
1137 char* nomefile)
1138 {
1139 char fno[80]="";
1140 ofstream fout;
1141 sprintf(fno,"%s/pkt%d_of_%s.pkt", outDir, numPKTSaved, nomefile);
1142
1143 if(append==true)
1144 fout.open(fno, ios::binary | ios::app);
1145 else
1146 fout.open(fno, ios::binary);
1147
1148 if (!fout) {cout<<"can not open output file "<<fno<<endl; return;}
1149 fout.write(headerPkt,LENGTH_HEADER_PKT);
1150 fout.write(pamPkt,length);
1151 fout.close();
1152 }
1153
1154 //UNUSED
1155 void PacketUser::saveALL_PKT(char* headerPkt, char* pamPkt, long int length, bool append)
1156 {
1157 char fno[80]="";
1158 ofstream fout;
1159 if(append==true)
1160 {
1161 sprintf(fno,"%s/packets.pkt", outDir);
1162 fout.open(fno, ios::binary | ios::app);
1163 }
1164 else{
1165 sprintf(fno,"%s/packet%d.pkt", outDir, numPKT );
1166 fout.open(fno, ios::binary);
1167 }
1168
1169 if (!fout) {cout<<"can not open output file "<<fno<<endl; return;}
1170 fout.write(headerPkt,LENGTH_HEADER_PKT);
1171 fout.write(pamPkt,length);
1172 fout.close();
1173 }
1174
1175
1176 }

  ViewVC Help
Powered by ViewVC 1.1.23