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

Annotation of /chewbacca/PamOffLineSW/PacketUser.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.19 - (hide annotations) (download)
Tue Feb 16 13:38:12 2010 UTC (14 years, 9 months ago) by mocchiut
Branch: MAIN
CVS Tags: v9r00, v9r01
Changes since 1.18: +3 -3 lines
150 seconds bug fixed

1 mocchiut 1.1 //============================================================================
2 mocchiut 1.19 // $Id: PacketUser.cpp,v 1.18 2010/02/11 09:02: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 mocchiut 1.18 //if ( !pRun ) printf(" horror! -%s- \n",rootfilename);
279 pam-fi 1.8 reader->Init(pRun);
280     stringstream oss;
281     oss.str() = "";
282     oss << "######################### Start a new group in file: " << rootfilename << " ############################";
283     string msg = oss.str();
284     mainLogUtil->logInfo(msg);
285 mocchiut 1.1 }
286    
287     //set the value of the counter and obt of the last packet of the group
288 pam-fi 1.8 void PacketUser::setLast(unsigned long int counter, unsigned long int obt) {
289     pkt_number_last = counter;
290     obt_last = obt;
291 mocchiut 1.1 }
292    
293 pam-fi 1.8 //retrieve obt_time_sync and last_time_sync_info from packet if type has special values and BOOT_NUMBER
294     void PacketUser::setTimeSync(char* packet, long int pktLength, const PacketType* type) {
295     //do nothing
296     if (!do_cont_check) {
297     if (is_new_route)
298     is_new_route = false;
299     return;
300     }
301    
302     //TODO: usare anche MCMD ... NOTA: questo da sempre errore ret != 0
303     //In RunHeader e RunTrailer sono in secondi(?), controllare se aggiungo altri tipi di paccheti se invece sono in secondi
304     // devo ricalcolare tutto non per ogni gruppetto (ROOT file) ma solo se cambia download
305     //When I found a new download I need to reset all values
306     if (is_new_route) {
307     //reset
308     is_new_route = false;
309     //(tassa) ci ho ripensato se stiamo in un secondo download non prendiamo i bootnumber e timesync del precedente!
310     obt_time_sync_prevvalue = 0;//obt_time_sync;
311     last_time_sync_info_prevvalue = 0;//last_time_sync_info;
312    
313     obt_time_sync = 0;
314     last_time_sync_info = 0;
315     boot_number_prevvalue = 0;//boot_number;
316     boot_number = 0;
317     time_is_estimated = false;
318     if (time_Offset)
319     timeOffset = time_Offset;
320     else
321     timeOffset = retrieveTimeOffset(Table_GL_RESURS_OFFSET);
322     }
323    
324     //retrieve boot number if possible
325     setBootNumber(packet, pktLength, type);
326 mocchiut 1.1
327 pam-fi 1.8 //Retrieve if possible obt_time_sync and last_time_sync_info
328     int offset = 0;
329     if (type == PacketType::RunHeader) {
330     offset = 0;
331     }
332     else if (type == PacketType::RunTrailer) {
333     offset = 3;
334     }
335     else if (type == PacketType::Mcmd) {
336     // mainLogUtil->logAll("TODO: Packet Mcmd now is not used to retrieve Absolute time. This may cause problems somewhere.");
337 mocchiut 1.18 // return;
338     offset = -1;
339 pam-fi 1.8 }
340     else {
341     return;
342     }
343 mocchiut 1.1
344 pam-fi 1.8 //I don't need to retrieve them again if they are good
345 mocchiut 1.10 // if ((obt_time_sync) || (last_time_sync_info))
346     // return;
347     // no, do it, since there is a (small indeed) time drift due to different clock of PAMELA CPU and RESURS CPU...
348 mocchiut 1.18 // printf(" %s %lu %lu %lu %lu \n", rootfilename, pkt_number_init, pkt_number_last, obt_init, obt_last);
349     if ( offset >= 0 ){
350     // use Runheader or RunTrailer
351     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);
352     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);
353     //
354     // if you arrive here and RH/RT timesync is zero try to get the correct info from DB (dangerous??)
355     //
356     // printf("qui\n");
357     if ( !obt_time_sync && !last_time_sync_info ){
358     // if ( true ){
359     stringstream os;
360     os.str() = "";
361     os << " NEW (EM) AGH! NO GOOD TIMESYNC INFOS IN RH OR RT!! TRY TO LOOK IN DB";
362     string msg = os.str();
363     mainLogUtil->logAll(msg);
364    
365     // mysql> select ID_N,FOLDER_NAME,FILE_NAME,PKT_NUMBER_INIT,PKT_NUMBER_FINAL,BAD_PKT,NUM_PKT_SAVED,INPUT_NAME,INSERT_TIME,INSERTED_BY from ROOT_TABLE_BAD where ON_DISK='YES' order by NUM_PKT_SAVED asc;
366     // +------+-------------+----------------------------+-----------------+------------------+---------+---------------+---------------------------------------------------------+---------------------+-------------+
367     // | ID_N | FOLDER_NAME | FILE_NAME | PKT_NUMBER_INIT | PKT_NUMBER_FINAL | BAD_PKT | NUM_PKT_SAVED | INPUT_NAME | INSERT_TIME | INSERTED_BY |
368     // +------+-------------+----------------------------+-----------------+------------------+---------+---------------+---------------------------------------------------------+---------------------+-------------+
369     // | 6493 | $PAM_L0FIA | L0PAM_00540_002_012_4.root | 12253479 | 12254111 | 626 | 626 | /wizard/03/pamela_data/preRawreader/00540002.pam | 2010-02-03 21:50:15 | FI |
370     // | 6463 | $PAM_L0FIA | L0PAM_00540_002_010_4.root | 12252097 | 12252730 | 627 | 627 | /wizard/03/pamela_data/preRawreader/00540002.pam | 2010-02-03 21:47:16 | FI |
371     // | 6525 | $PAM_L0FIA | L0PAM_00540_002_014_4.root | 12254906 | 12255539 | 627 | 629 | /wizard/03/pamela_data/preRawreader/00540002.pam | 2010-02-03 21:53:24 | FI |
372     // | 321 | $PAM_L0FIA | L0PAM_00383_001_001_2.root | 601639 | 602281 | 489 | 639 | /wizard/03/pamela_data/preRawreader/00383001.pam | 2010-02-03 16:49:55 | FI |
373     // | 306 | $PAM_L0FIA | L0PAM_00383_002_001_2.root | 601572 | 602213 | 0 | 642 | /wizard/03/pamela_data/preRawreader/00383002.pam | 2010-02-03 16:48:55 | FI |
374     // | 400 | $PAM_L0FIA | L0PAM_00383_001_005_2.root | 605234 | 605893 | 499 | 656 | /wizard/03/pamela_data/preRawreader/00383001.pam | 2010-02-03 16:57:08 | FI |
375     // | 372 | $PAM_L0FIA | L0PAM_00383_001_003_2.root | 603600 | 604258 | 290 | 659 | /wizard/03/pamela_data/preRawreader/00383001.pam | 2010-02-03 16:53:44 | FI |
376     // | 6483 | $PAM_L0FIA | L0PAM_00540_002_011_4.root | 12252731 | 12253478 | 739 | 739 | /wizard/03/pamela_data/preRawreader/00540002.pam | 2010-02-03 21:48:52 | FI |
377     // | 6428 | $PAM_L0FIA | L0PAM_00540_002_009_4.root | 12251326 | 12252096 | 764 | 765 | /wizard/03/pamela_data/preRawreader/00540002.pam | 2010-02-03 21:45:51 | FI |
378     // | 6507 | $PAM_L0FIA | L0PAM_00540_002_013_4.root | 12254112 | 12254905 | 781 | 781 | /wizard/03/pamela_data/preRawreader/00540002.pam | 2010-02-03 21:52:01 | FI |
379     // | 378 | $PAM_L0FIA | L0PAM_00374_001_001_1.root | 368888 | 369754 | 0 | 867 | /wizard/03/pamela_data/preRawreader/00374001.pam | 2010-02-03 16:54:30 | FI |
380     // | 6565 | $PAM_L0FIA | L0PAM_00540_002_015_4.root | 12255540 | 12256457 | 907 | 907 | /wizard/03/pamela_data/preRawreader/00540002.pam | 2010-02-03 21:55:22 | FI |
381     // | 413 | $PAM_L0FIA | L0PAM_00383_001_006_2.root | 605894 | 606807 | 417 | 913 | /wizard/03/pamela_data/preRawreader/00383001.pam | 2010-02-03 16:58:52 | FI |
382     // | 390 | $PAM_L0FIA | L0PAM_00383_001_004_2.root | 604259 | 605233 | 684 | 975 | /wizard/03/pamela_data/preRawreader/00383001.pam | 2010-02-03 16:55:45 | FI |
383     // | 358 | $PAM_L0FIA | L0PAM_00383_001_002_2.root | 602282 | 603599 | 649 | 1316 | /wizard/03/pamela_data/preRawreader/00383001.pam | 2010-02-03 16:52:23 | FI |
384     // | 185 | $PAM_L0NAA | L0PAM_01737_001_001_1.root | 9373563 | 9375405 | 0 | 1843 | /storage02/pamela/pamela_data/preRawreader/01737001.pam | 2010-02-03 16:24:50 | NA |
385     // | 375 | $PAM_L0FIA | L0PAM_00383_002_002_2.root | 602214 | 608541 | 0 | 6328 | /wizard/03/pamela_data/preRawreader/00383002.pam | 2010-02-03 16:54:08 | FI |
386     // | 1419 | $PAM_L0FIA | L0PAM_00383_001_007_2.root | 606808 | 620604 | 9086 | 13764 | /wizard/03/pamela_data/preRawreader/00383001.pam | 2010-02-03 17:26:39 | FI |
387     // | 6118 | $PAM_L0NAA | L0PAM_02144_002_001_1.root | 0 | 123139 | 6 | 123139 | /storage02/pamela/pamela_data/preRawreader/02144002.pam | 2010-02-03 21:29:51 | NA |
388     // | 4470 | $PAM_L0FIA | L0PAM_00614_001_001_1.root | 1409 | 130146 | 6 | 128722 | /wizard/03/pamela_data/preRawreader/00614001.pam | 2010-02-03 18:47:26 | FI |
389     // +------+-------------+----------------------------+-----------------+------------------+---------+---------------+---------------------------------------------------------+---------------------+-------------+
390     // 20 rows in set (0.05 sec)
391     // mysql> select FILE_NAME, abs(PKT_NUMBER_INIT-123139), abs(0-PKT_NUMBER_FINAL) from ROOT_TABLE where (abs(PKT_NUMBER_INIT-123139)<10000 or abs(0-PKT_NUMBER_FINAL)<10000) and FILE_NAME like "L0PAM_021%";
392     // +-----------------------------+-----------------------------+-------------------------+
393     // | FILE_NAME | abs(PKT_NUMBER_INIT-123139) | abs(0-PKT_NUMBER_FINAL) |
394     // +-----------------------------+-----------------------------+-------------------------+
395     // | L0PAM_02173_001_001_11.root | 123103 | 251 |
396     // +-----------------------------+-----------------------------+-------------------------+
397     // 1 row in set (0.07 sec)
398     //
399     TString *nomino=new TString(rootfilename);
400     nomino->Remove(9);
401     TString mmyy=Form("select OBT_TIME_SYNC, LAST_TIME_SYNC_INFO from ROOT_TABLE where (abs(PKT_NUMBER_INIT-%lu)<10000 or abs(%lu-PKT_NUMBER_FINAL)<10000) and FILE_NAME like '%s%%' limit 1;",pkt_number_last, pkt_number_init,nomino->Data());
402     delete nomino;
403     stringstream os3;
404     os3.str() = "";
405     os3 << " NEW (EM) TRY TO FIND TSYNC IN DB QUERY: " << mmyy.Data();
406     string msg3 = os3.str();
407     mainLogUtil->logAll(msg3);
408     //
409     TSQLResult* res = NULL;
410     TSQLRow* row = NULL;
411     Bool_t apro = false;
412     if (!single_connection && !sqlServer ) {
413     OpenDBConnection(NULL);// no, locak tutto Nota qui ho deciso di lockare solo questa tabella e non tutte
414     apro = true;
415     }
416     res = sqlServer->Query(mmyy.Data());
417     if (!res) {
418     mainLogUtil->logError("DBError retrieve time sync");
419     return;
420     };
421     row = res->Next();
422     if ( row ){
423     obt_time_sync = (ULong_t)atoi(row->GetField(0));
424     last_time_sync_info = (ULong_t)atoi(row->GetField(1));
425     //
426     stringstream os2;
427     os2.str() = "";
428     os2 << " NEW (EM) FOUND TSYNC IN DB ";
429     string msg2 = os2.str();
430     mainLogUtil->logAll(msg2);
431     //
432     };
433     if (res) {
434     delete res;
435     res = NULL;
436     };
437     //
438     if (!single_connection && apro) {
439     CloseDBConnection();
440     };
441     };
442    
443     } else {
444     // Use Packet Mcmd now is not used to retrieve Absolute time
445     // printf(" Pointer to Mcmd obj is %p \n",reader->GetPtr("Mcmd"));
446    
447     UInt_t recEntries = 0;
448     Double_t minimum = 0.;
449     Double_t maximum = 0.;
450     Double_t minimum2 = 0.;
451     Double_t maximum2 = 0.;
452     UInt_t TSYNC = 0;
453     UInt_t OBT = 0;
454     Bool_t existsts = false;
455     //
456     pamela::McmdEvent *mc = (pamela::McmdEvent*)(((pamela::techmodel::McmdReader*)reader->GetPtr("Mcmd"))->GetMcmd());
457     pamela::McmdRecord *mcrc = 0;
458     TArrayC *mcmddata = 0;
459     //
460     minimum = numeric_limits<Double_t>::max();
461     maximum = numeric_limits<Double_t>::min();
462     minimum2 = numeric_limits<Double_t>::max();
463     maximum2 = numeric_limits<Double_t>::min();
464     //
465     recEntries = mc->Records->GetEntries();
466     // printf(" recEntries is %i \n",recEntries);
467    
468     for (UInt_t j = 0; j < recEntries; j++){
469     mcrc = (pamela::McmdRecord*)mc->Records->At(j);
470     mcmddata = mcrc->McmdData;
471     //
472     if (mcrc->ID1 == 0xE0 && mcrc->Mcmd_Block_crc_ok == 1 ){ // mcmd timesync
473     //
474     OBT = (Int_t)(mcrc->MCMD_RECORD_OBT);
475     //
476     TSYNC = (((UInt_t)mcmddata->At(0)<<24)&0xFF000000) + (((UInt_t)mcmddata->At(1)<<16)&0x00FF0000) + (((UInt_t)mcmddata->At(2)<<8)&0x0000FF00) + (((UInt_t)mcmddata->At(3))&0x000000FF);
477     //
478     // printf("mcmd tsync tsync %u obt %u \n",TSYNC,OBT);
479     //
480     if ( TSYNC && OBT ){
481     existsts = true;
482     stringstream os;
483     os.str() = "";
484     os << " NEW (EM) FOUND TIMESYNC IN TIMESYNC MCMD";
485     string msg = os.str();
486     mainLogUtil->logAll(msg);
487     break;
488     };
489     //
490     };
491     };
492     //
493 mocchiut 1.19 if ( !existsts && !obt_time_sync && !last_time_sync_info ){ // try with inclination mcmd but only if everything else fails and check that the result is good
494 mocchiut 1.18 //
495     Double_t timesync = 0.;
496     //
497     for (UInt_t j = 0; j < recEntries; j++){
498     mcrc = (pamela::McmdRecord*)mc->Records->At(j);
499     mcmddata = mcrc->McmdData;
500     //
501     if (mcrc->ID1 == 0xE2 && mcrc->Mcmd_Block_crc_ok == 1 ){ // mcmd inclination
502     timesync = 0.;
503     timesync = (Double_t)(((((UInt_t)mcmddata->At(0) << 24) & 0xFF000000) + (((UInt_t)mcmddata->At(1) << 16) & 0x00FF0000) + (((UInt_t)mcmddata->At(2) << 8) & 0x0000FF00) + ((UInt_t)mcmddata->At(3) & 0x000000FF))/128.0);
504     //
505     if ( timesync > maximum2){
506     maximum2 = timesync;
507     OBT = (Int_t)(mcrc->MCMD_RECORD_OBT);
508     };
509     };
510     //
511     };
512     if ( maximum2 > numeric_limits<Double_t>::min() ){
513     TSYNC = (UInt_t)(maximum2 + 0.5);
514     if ( TSYNC && OBT ){
515     existsts = true;
516     stringstream os;
517     os.str() = "";
518     os << " NEW (EM) FOUND TIMESYNC IN INCLINATION MCMD";
519     string msg = os.str();
520     mainLogUtil->logAll(msg);
521     };
522     };
523 mocchiut 1.19 if ( labs(labs(last_time_sync_info_prevvalue-obt_time_sync_prevvalue)-labs(TSYNC-int(OBT/1000))) > 10 ) return;
524 mocchiut 1.18 };
525     if ( !existsts ) return;
526     // printf(" TIMESYNC FROM MCMD FOUND: TSYNC = %i OBT = %i \n",TSYNC,OBT);
527     obt_time_sync = int(OBT/1000);
528     last_time_sync_info = TSYNC;
529 pam-fi 1.8
530 mocchiut 1.18 };
531 pam-fi 1.8
532     stringstream oss;
533     oss.str() = "";
534     oss << "In download: " << download << " timeOffset: " << timeOffset << " obt_time_sync: " << obt_time_sync
535     << " last_time_sync_info: " << last_time_sync_info << " using Packet Type: " << type->GetName();
536     // 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();
537     string msg = oss.str();
538     mainLogUtil->logAll(msg);
539 mocchiut 1.1 }
540    
541     //Boot Number
542 pam-fi 1.8 void PacketUser::setBootNumber(char* packet, long int pktLength, const PacketType* type) {
543     //se gia calcolato esco: lo calcolo una volta per download e per continuita'
544     if (boot_number)
545     return;
546    
547     if (type == PacketType::VarDump) {
548     int b_offset = 34;//4+5*6
549     boot_number = (((UINT32) packet[1 + b_offset] << 24) & 0xFF000000) + (((UINT32) packet[2 + b_offset] << 16)
550     & 0x00FF0000) + (((UINT32) packet[3 + b_offset] << 8) & 0x0000FF00) + (((UINT32) packet[4 + b_offset])
551     & 0x000000FF);
552    
553     /*
554     long int dataLength = pktLength - 2; //the block of data
555     int b_offset = 4;
556     while (b_offset < dataLength){
557     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);
558     b_offset = b_offset + 5;
559     }
560     */
561     stringstream oss;
562     oss.str() = "";
563     // oss<<"In download: "<<download<<" boot_number: "<<boot_number<<" using Packet Type: "<<type->GetName().c_str();
564     oss << "In download: " << download << " boot_number: " << boot_number << " using Packet Type: " << type->GetName();
565     string msg = oss.str();
566     mainLogUtil->logAll(msg);
567     return;
568     }
569     else {
570     return;
571     }
572 mocchiut 1.1
573     }
574     //set the real time of the first packet and the last packet oif a group of packet if possible
575 pam-fi 1.8 void PacketUser::setReal_Time() {
576 mocchiut 1.3
577 mocchiut 1.10 if (!obt_time_sync && !last_time_sync_info && numPKTSaved > recoverlimit) {
578 pam-fi 1.8 time_is_estimated = true;
579     obt_time_sync = obt_time_sync_prevvalue;
580     last_time_sync_info = last_time_sync_info_prevvalue;
581     }
582     if (obt_time_sync || last_time_sync_info) {
583     real_time_init = (obt_init / 1000 - obt_time_sync) + last_time_sync_info;
584     //se obt si e' resettato
585     if (obt_last < obt_init) {
586     real_time_last = (max_pkt_obt / 1000 + obt_last / 1000 - obt_time_sync) + last_time_sync_info;
587     stringstream oss;
588     oss.str() = "";
589     oss << "obt_last(" << obt_last << ") < obt_init(" << obt_init
590     << "). It is due to Pamela Reset. Adding max_pkt_obt(" << max_pkt_obt
591     << ") to obt_last in order to compute real_time_last";
592     string msg = oss.str();
593     mainLogUtil->logWarning(msg);
594     }
595     else
596     real_time_last = (obt_last / 1000 - obt_time_sync) + last_time_sync_info;
597     real_time_init += timeOffset;
598     real_time_last += timeOffset;
599     }
600 mocchiut 1.1 }
601    
602 mocchiut 1.10 void PacketUser::setReal_TimeRECOVERY(
603     unsigned long int & _real_time_init,
604     unsigned long int & _real_time_last,
605     unsigned long int _obt_init,
606     unsigned long int _obt_last
607     ) {
608    
609     if (obt_time_sync || last_time_sync_info) {
610     _real_time_init = (_obt_init / 1000 - obt_time_sync) + last_time_sync_info;
611     //se obt si e' resettato
612     if (_obt_last < _obt_init) {
613     _real_time_last = (max_pkt_obt / 1000 + _obt_last / 1000 - obt_time_sync) + last_time_sync_info;
614     stringstream oss;
615     oss.str() = "";
616     oss << "obt_last(" << obt_last << ") < obt_init(" << obt_init
617     << "). It is due to Pamela Reset. Adding max_pkt_obt(" << max_pkt_obt
618     << ") to obt_last in order to compute real_time_last";
619     string msg = oss.str();
620     mainLogUtil->logWarning(msg);
621     }
622     else
623     _real_time_last = (_obt_last / 1000 - obt_time_sync) + last_time_sync_info;
624     _real_time_init += timeOffset;
625     _real_time_last += timeOffset;
626     }
627     }
628    
629    
630 mocchiut 1.1 //timeOffset
631     //retrieve from table Table_GL_RESURS_OFFSET timeOffset
632 pam-fi 1.8 unsigned long int PacketUser::retrieveTimeOffset(const char * table) {
633     if (!do_cont_check)
634     return 0;
635    
636     //if(!table){table=Table_GL_RESURS_OFFSET}
637    
638     if (!single_connection) {
639 mocchiut 1.17 OpenDBConnection(NULL);// no, locak tutto Nota qui ho deciso di lockare solo questa tabella e non tutte
640 pam-fi 1.8 }
641    
642     UInt_t t0 = 0;//toffset
643     stringstream oss;
644     oss.str("");
645     oss
646     << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM "
647     << table << " WHERE SPECIAL_FILE='" << nnnn_mmm_ppp << "';";
648    
649     string msg = oss.str();
650     mainLogUtil->logAll(msg);
651    
652     TSQLResult* res = NULL;
653     TSQLRow* row = NULL;
654     res = sqlServer->Query(oss.str().c_str());
655     if (!res) {
656     mainLogUtil->logError("DBError retrieveTimeOffset 1");
657     return 0;
658     }
659    
660     row = res->Next();
661     if (!row) {
662     if (res) {
663     delete res;
664     res = NULL;
665     }
666    
667     oss.str("");
668     oss
669     << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM "
670     << table << " WHERE FROM_ORBIT < " << orbit_number << " AND SPECIAL_FILE='' order by FROM_ORBIT desc limit 1;";
671    
672     string msg2 = oss.str();
673     mainLogUtil->logAll(msg2);
674    
675     res = sqlServer->Query(oss.str().c_str());
676     if (!res) {
677     mainLogUtil->logError("DBError retrieveTimeOffset 2");
678     return 0;
679     }
680     row = res->Next();
681     if (!row) {
682     mainLogUtil->logError("DBError retrieveTimeOffset 3");
683     return 0;
684     }
685    
686     }
687    
688     TTimeStamp tu = TTimeStamp((UInt_t) atoi(row->GetField(0)), (UInt_t) atoi(row->GetField(1)), (UInt_t) atoi(
689     row->GetField(2)), (UInt_t) atoi(row->GetField(3)), (UInt_t) atoi(row->GetField(4)), (UInt_t) atoi(row->GetField(
690     5)), 0, true, 0);
691     t0 = (UInt_t) tu.GetSec();
692    
693     if (res) {
694     delete res;
695     res = NULL;
696     }
697     if (row) {
698     delete row;
699     row = NULL;
700     }
701    
702     if (!single_connection) {
703     CloseDBConnection();
704     }
705     return t0;
706 mocchiut 1.1 }
707    
708     //this is public and can be called from the main at the end of the game
709 pam-fi 1.8 void PacketUser::FinishLastGroup() {
710     mainLogUtil->logAll("######################### Closing the last group ############################");
711     setReal_Time();
712     FinishGroup(rootfilename);
713     mainLogUtil->logAll("######################### Closed the last group ############################");
714 mocchiut 1.10 //
715 pam-fi 1.8 if (single_connection) {
716     CloseDBConnection();
717     }
718 mocchiut 1.1 }
719    
720     //Finish the old root file
721 pam-fi 1.8 void PacketUser::FinishGroup(char * filename) {
722     if (pRun) {
723 mocchiut 1.12 if ( !( !real_time_init && !real_time_last && numPKTSaved <= recoverlimit ) || !candelete ) pRun->WriteFiles();
724 pam-fi 1.8 delete pRun;
725     pRun = NULL;
726     stringstream close;
727     close.str() = "";
728     string msg;
729    
730 mocchiut 1.10 close << "TAG XX ######################### Close group in file: " << rootfilename << " ############################";
731 pam-fi 1.8 msg = close.str();
732     mainLogUtil->logInfo(msg);
733    
734     // se non faccio proprio controlli su continuita' neanche salvo su DB
735     if (!do_cont_check)
736     return;
737    
738     stringstream oss;
739     oss.str() = "";
740    
741     //TODO: check when I don't want to log in DB informations
742     // se non ho salvato nessun pacchetto
743     if (numPKTSaved == 0) {
744     stringstream err;
745     err.str() = "";
746     err << "NO PACKET SAVED in file: " << rootfilename << " The group is empty: you can remove this file.";
747     msg = err.str();
748     mainLogUtil->logError(msg);
749 mocchiut 1.10 // return;
750 pam-fi 1.8 }
751    
752     //se non ho salvato nessun pacchetto buono
753     if ((numPKTSaved - bad_pkt_EventReader - bad_pkt_CalibReader - bad_pkt) == 0) {
754     stringstream err;
755     err.str() = "";
756     err << "NO GOOD PACKET SAVED in file: " << rootfilename << " The group is BAD: you may want to remove this file.";
757     msg = err.str();
758     mainLogUtil->logInfo(msg);
759     // mainLogUtil->logError(msg);
760     // return; //TODO: decidi se nn vuoi affatto usarlo o addirittura salvarlo tra i BAD???
761     }
762    
763     if (!single_connection) {
764     OpenDBConnection(NULL);//Nota qui ho deciso di lockare tutte le tabelle
765     }
766    
767 mocchiut 1.10
768 pam-fi 1.8 //don't save in Table_ROOT_Good and don't search for ROOT files in the same temporal range
769     if ((!real_time_init) && (!real_time_last)) {
770     //saved in another table for future study
771     if (saveROOT_DB(
772     Table_ROOT_Bad,
773     outDir,// here outDir is good, no expand EMI
774     filename, pkt_number_init, pkt_number_last, obt_init, obt_last, obt_time_sync, last_time_sync_info,
775     real_time_init, real_time_last, boot_number, timeOffset, bad_pkt, bad_pkt_EventReader, bad_pkt_CalibReader,
776     numPKTSaved, fni, time_is_estimated) == true) {
777     oss.str() = "";
778     oss << "Saved information regarding file: " << filename << " in table " << Table_ROOT_Bad;
779     msg = oss.str();
780     mainLogUtil->logInfo(msg);
781     }
782     else {
783     oss.str() = "";
784     oss << "Problem storing information in DB regarding file: " << filename;
785     msg = oss.str();
786     mainLogUtil->logError(msg);
787     }
788    
789    
790 mocchiut 1.10
791     if ( numPKTSaved > recoverlimit){ // EM
792     //
793     if ( obt_time_sync && last_time_sync_info ){
794     stringstream err;
795     err.str() = "";
796     err << "(EM): -- RECOVERING WHEN NUMPACKET > "<< recoverlimit <<"!! -- file=<" << filename << ">. We have a previous time sync, immediate recovery!\n";
797     msg = err.str();
798     mainLogUtil->logInfo(msg);
799     //
800     setReal_TimeRECOVERY(
801     real_time_init,
802     real_time_last,
803     obt_init,
804     obt_last
805     );
806     //
807     } else {
808     stringstream err;
809     err.str() = "";
810     err << "TAG(tassa): -- RECOVERING WHEN NUMPACKET > "<< recoverlimit <<"!! -- file=<" << filename << ">. Saving in a queue to try alfer to recover it!\n";
811     msg = err.str();
812     mainLogUtil->logInfo(msg);
813    
814 mocchiut 1.17 // TString qu = Form("select ID_N from ROOT_TABLE_BAD order by INSERT_TIME desc limit 1;"); // <=========================
815     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); // <=========================
816 mocchiut 1.10 TSQLResult *result = sqlServer->Query(qu.Data());
817     TSQLRow *row = result->Next();
818     Int_t eid = -1;
819     if ( row ) eid = (Int_t)atoi(row->GetField(0));
820     idtorecover->AddAt(eid,arsize);
821     arsize++;
822     if ( arsize > 100 ) idtorecover->Set(arsize);
823     // dbinfo *app = new dbinfo( outDir,
824     // filename, pkt_number_init, pkt_number_last, obt_init, obt_last, boot_number, timeOffset, bad_pkt, bad_pkt_EventReader, bad_pkt_CalibReader,
825     // numPKTSaved, fni, time_is_estimated);
826     // m_dbinfos.push_back(app);
827     }
828    
829     CleanDisk();
830 mocchiut 1.15 // if (!single_connection) {
831     // CloseDBConnection();
832     // }
833 mocchiut 1.14 // return; // commented here...
834 mocchiut 1.10
835     };
836 pam-fi 1.8 }
837    
838 mocchiut 1.10 if ( real_time_init || real_time_last) {
839 mocchiut 1.14 //saves info in DB in table Table_ROOT
840     if (boot_number == 0)
841     boot_number = boot_number_prevvalue;
842 mocchiut 1.10
843 mocchiut 1.14 if (saveROOT_DB(
844     Table_ROOT_Good,
845     outDir, // here outDir is good, no expand EMI
846     filename, pkt_number_init, pkt_number_last, obt_init, obt_last, obt_time_sync, last_time_sync_info,
847     real_time_init, real_time_last, boot_number, timeOffset, bad_pkt, bad_pkt_EventReader, bad_pkt_CalibReader,
848     numPKTSaved, fni, time_is_estimated) == true) {
849     oss.str() = "";
850     oss << "Saved information regarding file: " << filename << " in table " << Table_ROOT_Good << " id= " << my_id;
851     msg = oss.str();
852     mainLogUtil->logInfo(msg);
853    
854     if (tryMerge) {
855     merge_ROOTfiles();
856     }
857     } else {
858 mocchiut 1.10 oss.str() = "";
859 pam-fi 1.8 oss << "Problem storing information in DB regarding file: " << filename;
860     msg = oss.str();
861     mainLogUtil->logError(msg);
862 mocchiut 1.14 }
863 mocchiut 1.10 };
864 pam-fi 1.8
865 mocchiut 1.10 // if dbinfo is not empty than
866 mocchiut 1.13 if ( arsize > 0 ){
867 mocchiut 1.10
868 mocchiut 1.13 if ( !obt_time_sync || !last_time_sync_info ){
869     TString *nomino=new TString(rootfilename);
870     nomino->Remove(15);
871     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);
872     //
873     oss.str() = "";
874     oss << "(EM) Trying to find obt_time_sync and last_time_sync_info from DB, query is: " << qu.Data();
875     msg = oss.str();
876     mainLogUtil->logInfo(msg);
877     //
878     TSQLResult *result = sqlServer->Query(qu.Data());
879     TSQLRow *row = result->Next();
880     if ( row && result->GetRowCount() == 1 ){
881     obt_time_sync = (unsigned long int)atoll(row->GetField(0));
882     last_time_sync_info = (unsigned long int)atoll(row->GetField(1));
883     oss.str() = "";
884     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;
885     msg = oss.str();
886     mainLogUtil->logInfo(msg);
887     };
888     delete nomino;
889     };
890    
891     if ( obt_time_sync && last_time_sync_info ){
892     // if(!m_dbinfos.empty()){
893     // while(!m_dbinfos.empty()){
894     // dbinfo *app = m_dbinfos.back();
895     // m_dbinfos.pop_back();
896     Int_t ez=0;
897     while ( ez < arsize ){
898     Int_t eid = idtorecover->At(ez);
899     if ( eid > -1 ){
900 mocchiut 1.10
901 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);
902     TSQLResult *result = sqlServer->Query(qu.Data());
903     TSQLRow *row = result->Next();
904 mocchiut 1.10
905 mocchiut 1.13 TString efolder_name="";
906     TString efile_name="";
907     unsigned long int epkt_number_in=0ULL;
908     unsigned long int epkt_number_fin=0ULL;
909     unsigned long int eobt_in=0ULL;
910     unsigned long int eobt_fin=0ULL;
911     unsigned long int emboot_num=0ULL;
912     unsigned long int etime_offset=0ULL;
913     int ebad_pkt=0;
914     int ebad_pkt_read=0;
915     int ebad_pkt_CalRead=0;
916     int enum_PKT_Saved=0;
917     TString enome_input="";
918     bool e_time_is_estimated=false;
919    
920     if ( row ){
921     efolder_name = (TString)row->GetField(0);
922     efile_name = (TString)row->GetField(1);
923     epkt_number_in = (unsigned long int)atoll(row->GetField(2));
924     epkt_number_fin = (unsigned long int)atoll(row->GetField(3));
925     eobt_in = (unsigned long int)atoll(row->GetField(4));
926     eobt_fin = (unsigned long int)atoll(row->GetField(5));
927     emboot_num = (unsigned long int)atoll(row->GetField(6));
928     etime_offset = (unsigned long int)atoll(row->GetField(7));
929     ebad_pkt = (int)atoi(row->GetField(8));
930     ebad_pkt_read = (int)atoi(row->GetField(9));
931     ebad_pkt_CalRead = (int)atoi(row->GetField(10));
932     enum_PKT_Saved = (int)atoi(row->GetField(11));
933     enome_input = (TString)row->GetField(12);
934     e_time_is_estimated = (bool)atoi(row->GetField(13));
935     };
936     delete result;
937    
938     setReal_TimeRECOVERY(
939     real_time_init,
940     real_time_last,
941     eobt_in,
942     eobt_fin
943     );
944     //
945 mocchiut 1.10
946 mocchiut 1.13 if (saveROOT_DB(
947     Table_ROOT_Good,
948     efolder_name.Data(),
949     efile_name.Data(),
950     epkt_number_in,
951     epkt_number_fin, eobt_in, eobt_fin, obt_time_sync, last_time_sync_info,
952     real_time_init, real_time_last, emboot_num, etime_offset, ebad_pkt, ebad_pkt_read, ebad_pkt_CalRead,
953     enum_PKT_Saved, enome_input.Data(), e_time_is_estimated) == true) {
954     oss.str() = "";
955     oss << "\nTAG(tassa): RECOVERED!!!! Saved information regarding file: " << efile_name << " in table " << Table_ROOT_Good << " id= " << my_id;
956     msg = oss.str();
957     mainLogUtil->logInfo(msg);
958     /*merging we use global variable. we haveto set with current value*/
959 mocchiut 1.10
960 mocchiut 1.13 strcpy(outDir,efolder_name.Data() );
961     // outDir=efolder_name.Data();
962     strcpy(filename,efile_name.Data() );
963     // filename=efile_name.Data();
964     pkt_number_init=epkt_number_in;
965     pkt_number_last=epkt_number_fin;
966     obt_init=eobt_in;
967     obt_last=eobt_fin;
968     boot_number=emboot_num;
969     timeOffset=etime_offset;
970     bad_pkt=ebad_pkt;
971     bad_pkt_EventReader=ebad_pkt_read;
972     bad_pkt_CalibReader=ebad_pkt_CalRead;
973     numPKTSaved=enum_PKT_Saved;
974     strcpy(fni,enome_input.Data() );
975     // fni=enome_input.Data();
976     time_is_estimated=e_time_is_estimated;
977 mocchiut 1.10
978 mocchiut 1.13 if (tryMerge) {
979     merge_ROOTfiles();
980     }
981 mocchiut 1.10
982 mocchiut 1.13 TString qu2 = Form("update ROOT_TABLE_BAD set ON_DISK='MVD' where ID_N=%i;",eid);
983     sqlServer->Query(qu2.Data());
984 mocchiut 1.10
985    
986 mocchiut 1.13 }
987     else {
988     oss.str() = "";
989     oss << "Problem storing information in DB regarding file: " << filename;
990     msg = oss.str();
991     mainLogUtil->logError(msg);
992     }
993 mocchiut 1.10
994    
995 mocchiut 1.13 };
996     ez++;
997     }
998     //
999     idtorecover->Reset();
1000     delete idtorecover;
1001     idtorecover = new TArrayI(100);
1002     arsize = 0;
1003     // delete app;
1004     };
1005     };
1006 mocchiut 1.10
1007     CleanDisk();
1008 pam-fi 1.8 if (!single_connection) {
1009     CloseDBConnection();
1010     }
1011 mocchiut 1.1
1012 pam-fi 1.8 }//pRun
1013 mocchiut 1.1 }
1014 mocchiut 1.17
1015 mocchiut 1.10
1016     void PacketUser::CleanDisk(){
1017     if ( !candelete ) return;
1018     //
1019     // delete small files present in root_table_bad from disk:
1020     //
1021     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);
1022     TSQLResult *result = sqlServer->Query(qu.Data());
1023     TSQLRow *row = result->Next();
1024     while ( row ){
1025     TString tbdel = (TString)gSystem->ExpandPathName(row->GetField(0))+"/"+ (TString)row->GetField(1);
1026     stringstream err;
1027     string msg;
1028     err.str() = "";
1029     err << " Deleting file " << tbdel.Data() << " from disk! ";
1030     msg = err.str();
1031     mainLogUtil->logInfo(msg);
1032     gSystem->Unlink(tbdel.Data());
1033     // printf("ciccio %s \n",tbdel.Data());
1034     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);
1035     // printf("pluto %s \n",q2u.Data());
1036     sqlServer->Query(q2u.Data());
1037     // printf("paperoga \n");
1038     row=result->Next();
1039     //
1040     };
1041    
1042     }
1043    
1044 mocchiut 1.1 //save in Table_ROOT_Good or in Table_ROOT_Bad
1045 mocchiut 1.10 bool PacketUser::saveROOT_DB(const char* table_name, const char* folder_name, const char* file_name,
1046 pam-fi 1.8 unsigned long int pkt_number_in, unsigned long int pkt_number_fin, unsigned long int obt_in,
1047     unsigned long int obt_fin, unsigned long int oT_sync, unsigned long int lT_sync_info, unsigned long int mtime_init,
1048     unsigned long int mtime_last, unsigned long int mboot_num, unsigned long int time_offset, int bad_pkt,
1049 mocchiut 1.10 int bad_pkt_read, int bad_pkt_CalRead, int num_PKT_Saved, const char* nome_input, bool _time_is_estimated) {
1050 pam-fi 1.8 //TODO: forse far ritornare ID della cosa appena inserita se e' andatato tutto ok invece che true false?
1051 mocchiut 1.18
1052     // EM: check is file has already been inserted, if so, update the informations (also in ROOT_TABLE_MERGING if processing ROOT_TABLE) instead of adding entries
1053     stringstream oss1;
1054     oss1.str() = "";
1055     string msg1;
1056     stringstream ass;
1057     ass.str("");
1058     ass << "SELECT 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 FROM " << table_name << " WHERE FILE_NAME='"<< file_name <<"';";
1059     TSQLResult* ares = NULL;
1060     ares = sqlServer->Query(ass.str().c_str());
1061     if (!ares) {
1062     oss1 << "DBError UNABLE to: " << ass.str().c_str() << endl;
1063     msg1 = oss1.str();
1064     mainLogUtil->logError(msg1);
1065     return false;
1066     }
1067     TSQLRow *arow = ares->Next();
1068     if ( arow ){
1069     TString bla=file_name;
1070     TString *blabla=new TString(file_name);
1071     blabla->Remove(15);
1072     stringstream oss;
1073     oss.str("");
1074     // oss << "UPDATE " << table_name
1075     // << " set FOLDER_NAME='" << folder_name << "', PKT_NUMBER_INIT='" << pkt_number_in << "',PKT_NUMBER_FINAL='" << pkt_number_fin << "',PKT_OBT_INIT='" << obt_in << "',PKT_OBT_FINAL='" << obt_fin
1076     // << "',OBT_TIME_SYNC='" << oT_sync << "',LAST_TIME_SYNC_INFO='" << lT_sync_info << "',REAL_TIME_INIT='"<< mtime_init << "',REAL_TIME_LAST='" << mtime_last << "',BOOT_NUMBER='" << mboot_num
1077     // << "',TIME_OFFSET='" << time_offset << "',BAD_PKT='" << bad_pkt << "',BAD_PKT_READ='"<< bad_pkt_read << "',BAD_PKT_CALREAD='" << bad_pkt_CalRead << "',NUM_PKT_SAVED='" << num_PKT_Saved
1078     // << "',INPUT_NAME='" << nome_input << "',INSERT_TIME=NULL,TIME_IS_ESTIMATED='"<< _time_is_estimated << "',INSERTED_BY='" << tag_value << "',ON_DISK='YES' where FILE_NAME='"<<file_name<<"';";
1079     oss << " DELETE FROM ROOT_TABLE_BAD WHERE FILE_NAME LIKE '"<<blabla->Data()<<"%';";
1080     string msg = oss.str();
1081     mainLogUtil->logAll(msg);
1082     string query;
1083    
1084     TSQLResult* res = NULL;
1085    
1086     query = oss.str();
1087     msg1 = "DeleteROOT_DB_BAD query: ";
1088     msg1 += query;
1089     mainLogUtil->logInfo(msg1);
1090    
1091     res = sqlServer->Query(query.c_str());
1092     if (!res) {
1093     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1094     msg1 = oss1.str();
1095     mainLogUtil->logError(msg1);
1096     return false;
1097     }
1098    
1099     stringstream iss;
1100     iss.str("");
1101     iss << "select ROOT_TABLE_MERGING.ID_N from ROOT_TABLE_MERGING left join ROOT_TABLE on ROOT_TABLE_MERGING.ROOT_ID_N=ROOT_TABLE.ID_N where ROOT_TABLE.FILE_NAME like '"<<blabla->Data()<<"%';";
1102     string msg2;
1103     string query2;
1104     TSQLResult* res2 = NULL;
1105     query2 = iss.str();
1106     msg2 = "SaveROOT_DB query: ";
1107     msg2 += query;
1108     mainLogUtil->logInfo(msg2);
1109     res2 = sqlServer->Query(query2.c_str());
1110     if (!res2) {
1111     oss1 << "DBError UNABLE to: " << iss.str().c_str() << endl;
1112     msg1 = oss1.str();
1113     mainLogUtil->logError(msg1);
1114     return false;
1115     }
1116     TSQLRow *row2 = res2->Next();
1117     while ( row2 ){
1118     TString qq=Form("DELETE FROM ROOT_TABLE_MERGING where ID_N=%s;",row2->GetField(0));
1119     TSQLResult* res2b = NULL;
1120     res2b = sqlServer->Query(qq.Data());
1121     delete res2b;
1122     row2=res2->Next();
1123     };
1124    
1125    
1126    
1127     oss.str("");
1128     oss << " DELETE FROM ROOT_TABLE WHERE FILE_NAME LIKE '"<<blabla->Data()<<"%';";
1129     string ms = oss.str();
1130     mainLogUtil->logAll(ms);
1131     string quer;
1132     TSQLResult* re = NULL;
1133     quer = oss.str();
1134     msg1 = "DeleteROOT_DB query: ";
1135     msg1 += quer;
1136     mainLogUtil->logInfo(msg1);
1137    
1138     re = sqlServer->Query(quer.c_str());
1139     if (!re) {
1140     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1141     msg1 = oss1.str();
1142     mainLogUtil->logError(msg1);
1143     return false;
1144     }
1145    
1146     delete blabla;
1147    
1148     }
1149    
1150     // } else {
1151     if ( true ){
1152 pam-fi 1.8 stringstream oss;
1153     oss.str("");
1154     oss << "INSERT INTO " << table_name
1155 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)"
1156 pam-fi 1.8 << " VALUES ('" << 0 << "','" << folder_name << "','" << file_name << "','" << pkt_number_in << "','"
1157     << pkt_number_fin << "','" << obt_in << "','" << obt_fin << "','" << oT_sync << "','" << lT_sync_info << "','"
1158     << mtime_init << "','" << mtime_last << "','" << mboot_num << "','" << time_offset << "','" << bad_pkt << "','"
1159     << bad_pkt_read << "','" << bad_pkt_CalRead << "','" << num_PKT_Saved << "','" << nome_input << "'," << "NULL,"
1160 mocchiut 1.10 << _time_is_estimated << ",'" << tag_value << "'" << ");";
1161 pam-fi 1.8 string msg = oss.str();
1162     mainLogUtil->logAll(msg);
1163    
1164     string query;
1165    
1166     TSQLResult* res = NULL;
1167    
1168     query = oss.str();
1169     msg1 = "SaveROOT_DB query: ";
1170     msg1 += query;
1171     mainLogUtil->logInfo(msg1);
1172    
1173     res = sqlServer->Query(query.c_str());
1174     if (!res) {
1175     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1176     msg1 = oss1.str();
1177     mainLogUtil->logError(msg1);
1178     return false;
1179 mocchiut 1.18 } else {
1180     delete res;
1181     res = NULL;
1182     }
1183 pam-fi 1.8 }
1184 mocchiut 1.1
1185 mocchiut 1.10 if(!strcmp(table_name,Table_ROOT_Good)) {
1186     //the ID of the current ROOT file in table Table_ROOT_Good
1187 mocchiut 1.18 my_id = select_maxIDN_DB(table_name,file_name);
1188 mocchiut 1.10 if (!boot_number) {
1189     if (id_to_recover_index < 1000)
1190     id_to_recover[id_to_recover_index++] = my_id;
1191     }
1192     else if (boot_number && id_to_recover_index && !is_new_route) {
1193     recover_boot_number();
1194     }
1195 mocchiut 1.18 // cout<<"DBG: my_id = "<<my_id<<endl;
1196 pam-fi 1.8 }
1197 mocchiut 1.18 if (ares) {
1198     delete ares;
1199     ares = NULL;
1200 pam-fi 1.8 }
1201     return true;
1202 mocchiut 1.1 }
1203    
1204 pam-fi 1.8 void PacketUser::recover_boot_number() {
1205 mocchiut 1.3 string msg1;
1206     stringstream oss1;
1207     stringstream oss;
1208 pam-fi 1.8 oss.str("");
1209     string query = "";
1210     TSQLResult* res = NULL;
1211     if (!boot_number || !id_to_recover_index)
1212 mocchiut 1.3 return;
1213 pam-fi 1.8
1214     for (int i = 0; i < id_to_recover_index; i++) {
1215 mocchiut 1.5 oss.str("");
1216 pam-fi 1.8 oss << "UPDATE " << Table_ROOT_Good << " SET BOOT_NUMBER=" << boot_number << " WHERE ID_N=" << id_to_recover[i]
1217     << ";";
1218     query = oss.str();
1219     res = sqlServer->Query(query.c_str());
1220     if (!res) {
1221     oss1 << "DBError UNABLE to: " << query.c_str() << endl;
1222     msg1 = oss1.str();
1223     mainLogUtil->logError(msg1);
1224     return;
1225     }
1226 mocchiut 1.3 }
1227    
1228 pam-fi 1.8 for (int i = 0; i < id_to_recover_index; i++) {
1229 mocchiut 1.5 oss.str("");
1230 pam-fi 1.8 oss << "UPDATE " << Table_ROOT_Merging << " SET BOOT_NUMBER=" << boot_number << " WHERE ROOT_ID_N="
1231     << id_to_recover[i] << ";";
1232     query = oss.str();
1233     res = sqlServer->Query(query.c_str());
1234     if (!res) {
1235     oss1 << "DBError UNABLE to: " << query.c_str() << endl;
1236     msg1 = oss1.str();
1237     mainLogUtil->logError(msg1);
1238     return;
1239     }
1240 mocchiut 1.3 }
1241    
1242 pam-fi 1.8 id_to_recover_index = 0;
1243 mocchiut 1.3 }
1244    
1245 mocchiut 1.1 /**********************************************************************************************/
1246     /*###########################################################################################################*/
1247     /********************************** MERGING *************************************************/
1248     /*###########################################################################################################*/
1249 mocchiut 1.3 // Merge ROT files: find other ROOT files in the same temporal ranges
1250 mocchiut 1.1 // it finds ROOT files that covers particular temporal range of interest and save this info in DB
1251     /**********************************************************************************************/
1252     //try to merge current ROOT file with files in DB
1253 pam-fi 1.8 bool PacketUser::merge_ROOTfiles() {
1254     stringstream log;
1255     log.str("");
1256     string slog;
1257 mocchiut 1.1
1258 mocchiut 1.2 mainLogUtil->logInfo("Trying merging ROOT files");
1259 pam-fi 1.8 double percentage = (double) (bad_pkt + bad_pkt_EventReader + bad_pkt_CalibReader) / numPKTSaved;
1260 mocchiut 1.1
1261 pam-fi 1.8 TSQLResult* res = NULL;
1262     TSQLRow* row = NULL;
1263     //numero di ROOT files trovati sul DB che hanno relaz di tipo dato
1264     unsigned int num_rows = 0;
1265    
1266     //Record su DB:
1267     unsigned int idN = 0;
1268     unsigned int root_id_db = 0;
1269     unsigned long int pkt_num_in_db = 0;
1270     unsigned long int pkt_num_fin_db = 0;
1271     unsigned long int pkt_obt_in_db = 0;
1272     unsigned long int pkt_obt_fin_db = 0;
1273     unsigned long int time_in_db = 0;
1274     unsigned long int time_fin_db = 0;
1275     unsigned int boot_num_db = 0;
1276     double perc = 0;
1277 mocchiut 1.2
1278     //marco_new: non considero mai caso di continuita'(mio finale=DB iniz o viceversa), non mi interessa
1279 mocchiut 1.1 //marco_new: after e before contengono anche smaller ma con un bordo comune
1280 pam-fi 1.8 for (int relaz = AFTER; relaz <= BIGGER; relaz++) {
1281     //marco_new: esci se sono arrivato a zero
1282     if (real_time_last == real_time_init) {
1283     log.str("");
1284     log << "Current File Lenght=0; real_time_last=real_time_init= " << real_time_last;
1285     slog = log.str();
1286     mainLogUtil->logAll(slog);
1287     mainLogUtil->logInfo("Finish merging ROOT files");
1288     if (res) {
1289     delete res;
1290     res = NULL;
1291     }
1292     if (row) {
1293     delete row;
1294     row = NULL;
1295     }
1296     return true;
1297     }
1298    
1299     num_rows = 0;
1300     res = Select_merging(Table_ROOT_Merging, real_time_init, real_time_last, (type_Rel_ROOT) relaz);
1301    
1302     if (!res) {
1303     mainLogUtil->logError("DB_ERROR: Unable to find ROOT files to be merged RES=null");
1304     return false;
1305     }
1306    
1307     num_rows = res->GetRowCount();
1308     log.str("");
1309     log << "Found " << num_rows << " ROOT file in DB with relation of kind = " << relaz;
1310     slog = log.str();
1311     mainLogUtil->logAll(slog);
1312    
1313     if (num_rows > 0) {
1314     for (unsigned int i = 0; i < num_rows; i++) {
1315     row = res->Next();
1316     if (!row) {
1317     mainLogUtil->logError("DB_ERROR: Unable to find ROOT files to be merged. ROW=null");
1318     if (res) {
1319     delete res;
1320     res = NULL;
1321     }
1322     return false;
1323     }
1324    
1325     //Leggi Record dal DB:
1326     idN = atoll(row->GetField(0));
1327     root_id_db = atoll(row->GetField(1));
1328     pkt_num_in_db = atoll(row->GetField(2));
1329     pkt_num_fin_db = atoll(row->GetField(3));
1330     pkt_obt_in_db = atoll(row->GetField(4));
1331     pkt_obt_fin_db = atoll(row->GetField(5));
1332     time_in_db = atoll(row->GetField(6));
1333     time_fin_db = atoll(row->GetField(7));
1334     boot_num_db = atoll(row->GetField(8));
1335     perc = atof(row->GetField(9));
1336    
1337     log.str("");
1338     log << "*** ROOT file found in DB has idN= " << idN << " root_id_db= " << root_id_db;
1339     log << " pkt_num_in_db= " << pkt_num_in_db << " pkt_num_fin_db= " << pkt_num_fin_db << " pkt_obt_in_db= "
1340     << pkt_obt_in_db << " pkt_obt_fin_db= " << pkt_obt_fin_db;
1341     log << " time_in_db= " << time_in_db << " time_fin_db= " << time_fin_db << " boot_num_db= " << boot_num_db
1342     << " perc= " << perc << " ***";
1343     log << "\n*** Current ROOT file has pkt_number_init= " << pkt_number_init << " obt_init= " << obt_init
1344     << " real_time_init= " << real_time_init;
1345     log << " pkt_number_last= " << pkt_number_last << " obt_last= " << obt_last << " real_time_last= "
1346     << real_time_last << " ***";
1347     slog = log.str();
1348     mainLogUtil->logAll(slog);
1349     if (perc > percentage) {
1350     mainLogUtil->logInfo("Current ROOT file is better than the one in DB");
1351     //modifica DB
1352     updateMergeROOT_DB(Table_ROOT_Merging, root_id_db, pkt_num_in_db, pkt_num_fin_db, pkt_obt_in_db,
1353     pkt_obt_fin_db, time_in_db, time_fin_db, boot_num_db, perc, idN, (type_Rel_ROOT) relaz);
1354     }
1355     else {
1356     mainLogUtil->logInfo("Found ROOT file in DB is better than current ROOT file");
1357     if (relaz == AFTER) {
1358     mainLogUtil->logInfo("Relaz:AFTER = Changing Init values of the Current ROOT file");
1359     pkt_number_init = (pkt_num_fin_db + 1);
1360     obt_init = pkt_obt_fin_db;
1361     real_time_init = time_fin_db;
1362     log.str("");
1363     log << "\n*** Current ROOT file becomes: pkt_number_init= " << pkt_number_init << " obt_init= "
1364     << obt_init << " real_time_init= " << real_time_init;
1365     log << " pkt_number_last= " << pkt_number_last << " obt_last= " << obt_last << " real_time_last= "
1366     << real_time_last << " ***";
1367     slog = log.str();
1368     mainLogUtil->logAll(slog);
1369     }
1370     else if (relaz == BEFORE) {
1371     mainLogUtil->logInfo("Relaz:BEFORE = Changing Last values of the Current ROOT file");
1372     pkt_number_last = (pkt_num_in_db - 1);
1373     obt_last = pkt_obt_in_db;
1374     real_time_last = time_in_db;
1375    
1376     log.str("");
1377     log << "\n*** Current ROOT file becomes: pkt_number_init= " << pkt_number_init << " obt_init= "
1378     << obt_init << " real_time_init= " << real_time_init;
1379     log << " pkt_number_last= " << pkt_number_last << " obt_last= " << obt_last << " real_time_last= "
1380     << real_time_last << " ***";
1381     slog = log.str();
1382     mainLogUtil->logAll(slog);
1383     }
1384     else if (relaz == SMALLER) {
1385     //non devo proprio salvarlo ed esco ...
1386     mainLogUtil->logInfo("Relaz:SMALLER = Nothing to save");
1387     mainLogUtil->logInfo("\nFinish merging ROOT files");
1388     if (res) {
1389     delete res;
1390     res = NULL;
1391     }
1392     if (row) {
1393     delete row;
1394     row = NULL;
1395     }
1396     return true;
1397     }
1398     else if (relaz == BIGGER)//spezzettamento
1399     {
1400     mainLogUtil->logInfo("Relaz:BIGGER = (1st part) Saving the first part of the Current ROOT file");
1401     saveMergeROOT_DB(Table_ROOT_Merging, my_id, pkt_number_init, (pkt_num_in_db - 1), obt_init, pkt_obt_in_db,
1402     real_time_init, time_in_db, boot_number, percentage);
1403    
1404     mainLogUtil->logInfo("Relaz:BIGGER = (2nd part)Changing Init values of the Current ROOT file");
1405     pkt_number_init = (pkt_num_fin_db + 1);
1406     obt_init = pkt_obt_fin_db;
1407     real_time_init = time_fin_db;
1408    
1409     log.str("");
1410     log << "\n*** Current ROOT file becomes: pkt_number_init= " << pkt_number_init << " obt_init= "
1411     << obt_init << " real_time_init= " << real_time_init;
1412     log << " pkt_number_last= " << pkt_number_last << " obt_last= " << obt_last << " real_time_last= "
1413     << real_time_last << " ***";
1414     slog = log.str();
1415     mainLogUtil->logAll(slog);
1416     }//if relaz
1417     }//if perc
1418     }//for num_rows
1419     }//if num_rows
1420    
1421     if (res) {
1422     delete res;
1423     res = NULL;
1424     }
1425     if (row) {
1426     delete row;
1427     row = NULL;
1428     }
1429    
1430     }//for relaz
1431    
1432     mainLogUtil->logInfo("Saving Current ROOT file");
1433     saveMergeROOT_DB(Table_ROOT_Merging, my_id, pkt_number_init, pkt_number_last, obt_init, obt_last, real_time_init,
1434     real_time_last, boot_number, percentage);
1435 mocchiut 1.1
1436 pam-fi 1.8 mainLogUtil->logInfo("Finish merging ROOT files");
1437 mocchiut 1.1 return true;
1438 mocchiut 1.2
1439 mocchiut 1.1 }
1440    
1441     //unsigned int root_id, percentage non le devo modificare
1442 pam-fi 1.8 bool PacketUser::updateMergeROOT_DB(const char* table_name, unsigned int root_id, unsigned long int pkt_number_in,
1443     unsigned long int pkt_number_fin, unsigned long int obt_in, unsigned long int obt_fin,
1444     unsigned long int mtime_init, unsigned long int mtime_last, unsigned long int mboot_num, double bad_perc,
1445     unsigned int ID_record, type_Rel_ROOT type_rel) {
1446    
1447     stringstream oss;
1448     oss.str("");
1449    
1450     if (type_rel == AFTER) {
1451     mainLogUtil->logInfo("Relaz:AFTER = Updating Last values of the DB ROOT file");
1452     //marco_new:tolti tutti gli apici che qui non devono essere
1453 mocchiut 1.11
1454     int good = 1;
1455     if ( pkt_number_in >= (pkt_number_init - 1) && abs((int)(pkt_number_in-(pkt_number_init-1)))<10 ) good = 0;
1456    
1457 pam-fi 1.8 oss << "UPDATE " << table_name << " SET PKT_NUMBER_FINAL =" << (pkt_number_init - 1) << ", PKT_OBT_FINAL ="
1458 mocchiut 1.11 << obt_init << ", REAL_TIME_LAST =" << real_time_init << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1459 pam-fi 1.8
1460     }
1461     else if (type_rel == BEFORE) {
1462     mainLogUtil->logInfo("Relaz:BEFORE = Updating Init values of the DB ROOT file");
1463 mocchiut 1.11
1464     int good = 1;
1465     if ( (pkt_number_last+1) >= pkt_number_fin && abs((int)((pkt_number_last+1)-pkt_number_fin))<10 ) good = 0;
1466    
1467 pam-fi 1.8 oss << "UPDATE " << table_name << " SET PKT_NUMBER_INIT =" << (pkt_number_last + 1) << ", PKT_OBT_INIT ="
1468 mocchiut 1.11 << obt_last << ", REAL_TIME_INIT =" << real_time_last << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1469 pam-fi 1.8 }
1470     else if (type_rel == SMALLER) {
1471     //spezzettamentento
1472     mainLogUtil->logInfo("Relaz:SMALLER = (1st part) Updating Last values of the DB ROOT file");
1473    
1474 mocchiut 1.11 int good = 1;
1475     if ( pkt_number_in >= (pkt_number_init - 1) && abs((int)(pkt_number_in-(pkt_number_init-1)))<10 ) good = 0;
1476    
1477 pam-fi 1.8 oss << "UPDATE " << table_name << " SET PKT_NUMBER_FINAL=" << (pkt_number_init - 1) << ", PKT_OBT_FINAL ="
1478 mocchiut 1.11 << obt_init << ", REAL_TIME_LAST =" << real_time_init << ", GOOD="<< good << " WHERE ID_N =" << ID_record << ";";
1479 pam-fi 1.8
1480     mainLogUtil->logInfo("Relaz:SMALLER = (2nd part) Saving the second part of the DB ROOT file");
1481    
1482     saveMergeROOT_DB(table_name, root_id, (pkt_number_last + 1), pkt_number_fin, obt_last, obt_fin, real_time_last,
1483     mtime_last, mboot_num, bad_perc);
1484     }
1485     else if (type_rel == BIGGER) {
1486     //marco_new: ok anche se coincidenti etc
1487     // oss << "DELETE FROM "<< table_name <<" WHERE ID_N ="<< ID_record<<";"; // EMILIANO
1488     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
1489     mainLogUtil->logInfo("Record deleted from merging table");
1490     }
1491     else
1492     return false;
1493    
1494     string msg = oss.str();
1495     mainLogUtil->logInfo(msg);
1496    
1497     stringstream oss1;
1498     oss1.str() = "";
1499     string msg1;
1500    
1501     TSQLResult* res = NULL;
1502     res = sqlServer->Query(oss.str().c_str());
1503     if (!res) {
1504     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1505     msg1 = oss1.str();
1506     mainLogUtil->logError(msg1);
1507     return false;
1508     }
1509     if (res) {
1510     delete res;
1511     res = NULL;
1512     }
1513     return true;
1514 mocchiut 1.1 }
1515    
1516 mocchiut 1.2 //cerca eventuali ROOT files in DB che possono venire mergiati
1517     //marco_new bordi: messo in after a before casi in cui smaller con un bordo in comune
1518     //marco_new bordi: messo in bigger casi con bordi in comune; tra questi anche caso particolare di coincidente
1519     //marco_new bordi: smaller resta solo caso in cui DB e' piu largo sia a dx che a sx
1520 pam-fi 1.8 TSQLResult* PacketUser::Select_merging(const char* table_name, unsigned long int mtime_init, unsigned long int mtime_last,
1521     type_Rel_ROOT type_rel) {
1522     TSQLResult* res = NULL;
1523     stringstream query;
1524     query.str("");
1525    
1526     if (type_rel == AFTER)
1527     query << "select * from " << table_name << " where GOOD=1 and REAL_TIME_LAST > " << mtime_init
1528     << " and REAL_TIME_LAST <= " << mtime_last << " and REAL_TIME_INIT < " << mtime_init; // EMI
1529     else if (type_rel == BEFORE)
1530     query << "select * from " << table_name << " where GOOD=1 and REAL_TIME_INIT >= " << mtime_init
1531     << " and REAL_TIME_INIT < " << mtime_last << " and REAL_TIME_LAST > " << mtime_last; // EMI
1532     else if (type_rel == SMALLER)
1533     query << "select * from " << table_name << " where GOOD=1 and REAL_TIME_INIT < " << mtime_init
1534     << " and REAL_TIME_LAST > " << mtime_last; // EMI
1535     else if (type_rel == BIGGER)
1536     query << "select * from " << table_name << " where GOOD=1 and REAL_TIME_INIT >= " << mtime_init
1537     << " and REAL_TIME_LAST <= " << mtime_last; // EMI
1538     else
1539     return 0;
1540    
1541 mocchiut 1.11 query << " order by REAL_TIME_INIT ASC;";//marco_new: inutile
1542 pam-fi 1.8 //se volessi mettere un filtro sulla qualita'
1543     // query<<" and NUM_PKT_SAVED - BAD_PKT_CALREAD - BAD_PKT_READ - BAD_PKT >= 2" ;
1544     string msg = query.str();
1545     mainLogUtil->logAll(msg);
1546     res = sqlServer->Query(query.str().c_str());
1547     stringstream oss1;
1548     oss1.str() = "";
1549     string msg1;
1550    
1551     if (!res) {
1552     oss1 << "DBError UNABLE to: " << query.str().c_str() << endl;
1553     msg1 = oss1.str();
1554     mainLogUtil->logError(msg1);
1555     }
1556    
1557     return res;
1558     }
1559    
1560     bool PacketUser::saveMergeROOT_DB(const char* table_name, unsigned int root_id, unsigned long int pkt_number_in,
1561     unsigned long int pkt_number_fin, unsigned long int obt_in, unsigned long int obt_fin,
1562     unsigned long int mtime_init, unsigned long int mtime_last, unsigned long int mboot_num, double percentage) {
1563    
1564 mocchiut 1.11 int good = 1;
1565     if ( pkt_number_in >= pkt_number_fin && abs((int)(pkt_number_fin-pkt_number_in))<10 ) good = 0;
1566    
1567 pam-fi 1.8 stringstream oss;
1568     oss.str("");
1569     oss << "INSERT INTO " << table_name
1570 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)"
1571 pam-fi 1.8 << " VALUES ('" << 0 << "','" << root_id << "','" << pkt_number_in << "','" << pkt_number_fin << "','" << obt_in
1572     << "','" << obt_fin << "','" << mtime_init << "','" << mtime_last << "','" << mboot_num << "','" << percentage
1573 mocchiut 1.11 << "'," << "NULL" << ",'" << tag_value << "','" << good <<"');";
1574 pam-fi 1.8
1575     string msg = oss.str();
1576     mainLogUtil->logAll(msg);
1577    
1578     //marco_new: controlla
1579     //marco_new: esci se sono arrivato a zero
1580     // if(real_time_last==real_time_init){
1581     if (mtime_init == mtime_last) {
1582     mainLogUtil->logAll("Nothing to be saved");
1583    
1584     // if(res){delete res; res = NULL;}
1585     // if(row){delete row; row = NULL;}
1586     return true;
1587     }
1588    
1589     stringstream oss1;
1590     oss1.str() = "";
1591     string msg1;
1592    
1593     TSQLResult* res = NULL;
1594     res = sqlServer->Query(oss.str().c_str());
1595     if (!res) {
1596     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1597     msg1 = oss1.str();
1598     mainLogUtil->logError(msg1);
1599     return false;
1600     }
1601     if (res) {
1602     delete res;
1603     res = NULL;
1604     }
1605     return true;
1606 mocchiut 1.1 }
1607    
1608     //Utility: return max(IDN)
1609 mocchiut 1.18 unsigned int PacketUser::select_maxIDN_DB(const char* table_name, const char* file_name) {
1610 mocchiut 1.1
1611 pam-fi 1.8 if (!strcmp(table_name, Table_ROOT_Bad)) {
1612     return 0;
1613     }
1614     unsigned int idN = 0;
1615     TSQLResult* res = NULL;
1616     stringstream oss;
1617     oss.str("");
1618 mocchiut 1.18 oss << "select ID_N from " << table_name << " where FILE_NAME='" << file_name <<"';";
1619 pam-fi 1.8 // string msg = oss.str();
1620     // mainLogUtil->logAll(msg);
1621     res = sqlServer->Query(oss.str().c_str());
1622    
1623     stringstream oss1;
1624     oss1.str() = "";
1625     string msg1;
1626    
1627     if (!res) {
1628     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1629     msg1 = oss1.str();
1630     mainLogUtil->logError(msg1);
1631     return 0;
1632     }
1633    
1634     TSQLRow* row = NULL;
1635     row = res->Next();
1636     if (!row) {
1637     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1638     msg1 = oss1.str();
1639     mainLogUtil->logError(msg1);
1640     return 0;
1641     }
1642    
1643     idN = atoi(row->GetField(0));
1644     if (row) {
1645     delete row;
1646     row = NULL;
1647     }
1648     if (res) {
1649     delete res;
1650     res = NULL;
1651     }
1652    
1653     oss << ". idN = " << idN;
1654     string msg = oss.str();
1655     mainLogUtil->logAll(msg);
1656 mocchiut 1.2
1657 pam-fi 1.8 return idN;
1658 mocchiut 1.1 }
1659    
1660     /**
1661     * Lock par=table, if par=null lock all tables
1662     */
1663 pam-fi 1.8 int PacketUser::LockTables(const char* tableTobeLocked) {
1664     //se non ho il DB :)
1665     if (!do_cont_check)
1666     return 999;
1667    
1668     TSQLResult* res = NULL;
1669     stringstream oss;
1670     oss.str("");
1671 mocchiut 1.17 // if (!tableTobeLocked)
1672     oss << "lock table " << Table_ROOT_Good << " write, " << Table_ROOT_Bad << " write, " << Table_GL_RESURS_OFFSET
1673     << " write, " << Table_ROOT_Merging << " write;";
1674     // else
1675     // oss << "lock table " << tableTobeLocked << " write; ";
1676 mocchiut 1.1
1677 pam-fi 1.8 string msg = oss.str();
1678     mainLogUtil->logAll(msg);
1679    
1680     res = sqlServer->Query(oss.str().c_str());
1681    
1682     stringstream oss1;
1683     oss1.str() = "";
1684     string msg1;
1685    
1686     if (!res) {
1687     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1688     msg1 = oss1.str();
1689     mainLogUtil->logError(msg1);
1690     return 1;
1691     }
1692    
1693     if (res) {
1694     delete res;
1695     res = NULL;
1696     }
1697     mainLogUtil->logAll("TABLES LOCKED");
1698     return 0;
1699 mocchiut 1.1 }
1700    
1701     /**
1702     * UNLock tables
1703     */
1704 pam-fi 1.8 int PacketUser::UnLockTables() {
1705     //se non ho il DB :)
1706     if (!do_cont_check)
1707     return 999;
1708    
1709     TSQLResult* res = NULL;
1710     stringstream oss;
1711     oss.str("");
1712     oss << "unlock tables;";
1713 mocchiut 1.1
1714 pam-fi 1.8 string msg = oss.str();
1715     mainLogUtil->logAll(msg);
1716    
1717     res = sqlServer->Query(oss.str().c_str());
1718    
1719     stringstream oss1;
1720     oss1.str() = "";
1721     string msg1;
1722    
1723     if (!res) {
1724     oss1 << "DBError UNABLE to: " << oss.str().c_str() << endl;
1725     msg1 = oss1.str();
1726     mainLogUtil->logError(msg1);
1727     return 1;
1728     }
1729 mocchiut 1.1
1730 pam-fi 1.8 if (res) {
1731     delete res;
1732     res = NULL;
1733     }
1734     mainLogUtil->logAll("TABLES UNLOCKED");
1735 mocchiut 1.1
1736 pam-fi 1.8 return 0;
1737 mocchiut 1.1 }
1738    
1739     /*********************************************************/
1740     //marco_new_31
1741 pam-fi 1.8 void PacketUser::OpenDBConnection(const char* tableTobeLocked) {
1742     if (do_cont_check) {
1743     //controllo che non sia gia' aperta
1744     if (!sqlServer) {
1745 mocchiut 1.16 sqlServer = TSQLServer::Connect(pelosconnection, db_user, db_pwd);
1746 pam-fi 1.8 if ((!sqlServer) || (!(sqlServer->IsConnected()))) {
1747     cout << "Can not connect with MYSQL sever" << endl;
1748     }
1749     mainLogUtil->logAll("Connected to DB");
1750 mocchiut 1.9 stringstream myquery;
1751     myquery.str("");
1752     myquery << "SET time_zone='+0:00'";
1753     sqlServer->Query(myquery.str().c_str());
1754 pam-fi 1.8 //blocca le tabelle
1755     LockTables(tableTobeLocked);
1756     }
1757     }
1758 mocchiut 1.1
1759     }
1760    
1761     //marco_new_31
1762 pam-fi 1.8 void PacketUser::CloseDBConnection() {
1763     if (do_cont_check) {
1764     //controllo che ce ne sia una aperta
1765     if (sqlServer && sqlServer->IsConnected()) {
1766     //marco_new: sblocca tutte le tabelle
1767     UnLockTables();
1768     sqlServer->Close();
1769     delete sqlServer;
1770     sqlServer = NULL;
1771     mainLogUtil->logAll("Closed Connection to DB");
1772     }
1773     }
1774 mocchiut 1.1 }
1775    
1776     /***********************************************************************************************************************/
1777     /*#################################################### HIC SUNT LEONES ################################################*/
1778     /***********************************************************************************************************************/
1779     //UNUSED: dbg functions...
1780    
1781     //Return the system time in ms
1782 pam-fi 1.8 unsigned long long PacketUser::Record_Time() {
1783     timeval tv;
1784     gettimeofday(&tv, NULL);
1785     unsigned long long timems = (unsigned long long) tv.tv_sec * (unsigned long long) 1000 + tv.tv_usec / 1000;
1786     return timems;
1787 mocchiut 1.1 }
1788    
1789     //dbg_functions:
1790    
1791     //UNUSED. save a packet in a file
1792 pam-fi 1.8 void PacketUser::savePKT_file(char* headerPkt, char* pamPkt, long int length, bool append, char* nomefile) {
1793     char fno[80] = "";
1794     ofstream fout;
1795     sprintf(fno, "%s/pkt%d_of_%s.pkt", gSystem->ExpandPathName(outDir), numPKTSaved, nomefile); // EMI
1796    
1797     if (append == true)
1798     fout.open(fno, ios::binary | ios::app);
1799     else
1800     fout.open(fno, ios::binary);
1801    
1802     if (!fout) {
1803     cout << "can not open output file " << fno << endl;
1804     return;
1805     }
1806     fout.write(headerPkt, LENGTH_HEADER_PKT);
1807     fout.write(pamPkt, length);
1808     fout.close();
1809 mocchiut 1.1 }
1810    
1811     //UNUSED
1812 pam-fi 1.8 void PacketUser::saveALL_PKT(char* headerPkt, char* pamPkt, long int length, bool append) {
1813     char fno[80] = "";
1814     ofstream fout;
1815     if (append == true) {
1816     sprintf(fno, "%s/packets.pkt", gSystem->ExpandPathName(outDir)); // EMI
1817     fout.open(fno, ios::binary | ios::app);
1818     }
1819     else {
1820     sprintf(fno, "%s/packet%d.pkt", gSystem->ExpandPathName(outDir), numPKT); // EMI
1821     fout.open(fno, ios::binary);
1822     }
1823    
1824     if (!fout) {
1825     cout << "can not open output file " << fno << endl;
1826     return;
1827     }
1828     fout.write(headerPkt, LENGTH_HEADER_PKT);
1829     fout.write(pamPkt, length);
1830     fout.close();
1831 mocchiut 1.1 }
1832    
1833     }

  ViewVC Help
Powered by ViewVC 1.1.23