UltraScan III
us_solution_vals.cpp
Go to the documentation of this file.
1 #include "us_solution_vals.h"
3 #include "us_settings.h"
4 
5 // Get Solution/Buffer values for a data set
7  QString& soluID, QString& cvbar20, QString& density, QString& viscosity,
8  QString& compress, QString& manual, QString& errmsg )
9 {
10  bool got_ok = false;
11  QString bufID;
12  QString bguid;
13  QString bdesc;
14 
15  errmsg =
16  QObject::tr( " Solution/Buffer value determination for data set\n " )
17  + edata->runID + "." + edata->editID + "." + edata->cell + "."
18  + edata->channel + "." + edata->wavelength + " --\n";
19 
20  if ( dbP != 0 )
21  {
22  got_ok = solinfo_db( dbP, edata, cvbar20, soluID, bufID, bguid, bdesc,
23  errmsg );
24  got_ok = got_ok ? got_ok :
25  solinfo_disk( edata, cvbar20, soluID, bufID, bguid, bdesc,
26  errmsg );
27  got_ok = bufvals_db( dbP, bufID, bguid, bdesc, density, viscosity,
28  compress, manual, errmsg );
29  got_ok = got_ok ? got_ok :
30  bufvals_disk( bufID, bguid, bdesc, density, viscosity,
31  compress, manual, errmsg );
32  }
33 
34  else
35  {
36  got_ok = solinfo_disk( edata, cvbar20, soluID, bufID, bguid, bdesc,
37  errmsg );
38  got_ok = bufvals_disk( bufID, bguid, bdesc, density, viscosity,
39  compress, manual, errmsg );
40  }
41 
42  return got_ok;
43 }
44 
45 // Get solution/buffer info from DB: ID, GUID, description
47  QString& cvbar20, QString& soluID, QString& bufId, QString& bufGuid,
48  QString& bufDesc, QString& errmsg )
49 {
50  bool bufinfo = false;
51 
52  QStringList query;
53  QString rawGUID = edata->dataGUID;
54 
55  query << "get_rawDataID_from_GUID" << rawGUID;
56  dbP->query( query );
57 
58  if ( dbP->lastErrno() != US_DB2::OK )
59  {
60  errmsg += QObject::tr( " Unable to get raw data ID from GUID " )
61  + rawGUID + "\n" + dbP->lastError() + "\n";
62 
63  return bufinfo;
64  }
65 
66  dbP->next();
67  QString rawID = dbP->value( 0 ).toString();
68  QString expID = dbP->value( 1 ).toString();
69  soluID = dbP->value( 2 ).toString();
70 
71  query.clear();
72  query << "get_solutionBuffer" << soluID;
73  dbP->query( query );
74 
75  if ( dbP->lastErrno() != US_DB2::OK )
76  {
77  query.clear();
78  query << "get_solutionIDs" << expID;
79  dbP->query( query );
80  dbP->next();
81  soluID = dbP->value( 0 ).toString();
82 
83  query.clear();
84  query << "get_solutionBuffer" << soluID;
85  dbP->query( query );
86 
87  if ( dbP->lastErrno() != US_DB2::OK )
88  {
89  errmsg +=
90  QObject::tr( "Unable to get solutionBuffer from solution ID" )
91  + soluID + "\n" + dbP->lastError() + "\n";
92  }
93  }
94 
95  dbP->next();
96  QString id = dbP->value( 0 ).toString();
97  QString guid = dbP->value( 1 ).toString();
98  QString desc = dbP->value( 2 ).toString();
99 
100  if ( ! id.isEmpty() )
101  {
102  bufId = id;
103  bufGuid = guid.isEmpty() ? bufGuid : guid;
104  bufDesc = desc.isEmpty() ? bufDesc : desc;
105  bufinfo = true;
106  }
107 
108  query.clear();
109  query << "get_solution" << soluID;
110  dbP->query( query );
111 
112  if ( dbP->lastErrno() != US_DB2::OK )
113  {
114  errmsg +=
115  QObject::tr( "Unable to get solution vbar from solution ID" )
116  + soluID + "\n" + dbP->lastError() + "\n";
117  }
118  else
119  {
120  dbP->next();
121  cvbar20 = dbP->value( 2 ).toString();
122  }
123 
124  return bufinfo;
125 }
126 
127 // Get solution/buffer info from local disk: ID, GUID, description
129  QString& cvbar20, QString& soluID, QString& bufId, QString& bufGuid,
130  QString& bufDesc, QString& errmsg )
131 {
132  bool bufinfo = false;
133  QString soluGUID = "";
134 
135  QString exppath = US_Settings::resultDir() + "/" + edata->runID + "/"
136  + edata->runID + "." + edata->dataType.left( 2 ) + ".xml";
137 
138  QFile filei( exppath );
139  if ( !filei.open( QIODevice::ReadOnly | QIODevice::Text ) )
140  {
141  errmsg += QObject::tr( " Unable to open file " ) + exppath + "\n";
142  return bufinfo;
143  }
144 
145  QXmlStreamReader xml( &filei );
146 
147  while ( ! xml.atEnd() )
148  {
149  xml.readNext();
150 
151  if ( xml.isStartElement() )
152  {
153  QXmlStreamAttributes ats = xml.attributes();
154 
155  if ( xml.name() == "buffer" )
156  {
157  QString id = ats.value( "id" ).toString();
158  QString guid = ats.value( "guid" ).toString();
159  QString desc = ats.value( "desc" ).toString();
160 
161  if ( ! id.isEmpty() || ! guid.isEmpty() )
162  {
163  bufId = id .isEmpty() ? bufId : id;
164  bufGuid = guid.isEmpty() ? bufGuid : guid;
165  bufDesc = desc.isEmpty() ? bufDesc : desc;
166  bufinfo = true;
167  bufId = bufId.isEmpty() ? "N/A" : bufId;
168  }
169  break;
170  }
171 
172  else if ( xml.name() == "solution" )
173  {
174  soluGUID = ats.value( "guid" ).toString();
175  soluID = soluGUID;
176  }
177  }
178  }
179 
180  filei.close();
181 
182  if ( ! bufinfo && ! soluGUID.isEmpty() )
183  { // No buffer info yet, but solution GUID found: get buffer from solution
184  QString spath = US_Settings::dataDir() + "/solutions/";
185  QDir f( spath );
186 
187  QStringList filter( "S*.xml" );
188  QStringList names = f.entryList( filter, QDir::Files, QDir::Name );
189  QString fname;
190  QString bdens;
191  QString bvisc;
192 
193  for ( int ii = 0; ii < names.size(); ii++ )
194  {
195  fname = spath + names[ ii ];
196  QFile filei( fname );
197 
198  if ( ! filei.open( QIODevice::ReadOnly | QIODevice::Text ) )
199  continue;
200 
201  QXmlStreamReader xml( &filei );
202 
203  while ( ! xml.atEnd() )
204  {
205  xml.readNext();
206 
207  if ( xml.isStartElement() )
208  {
209  QXmlStreamAttributes ats = xml.attributes();
210 
211  if ( xml.name() == "solution" )
212  {
213  QString sguid = ats.value( "guid" ).toString();
214 
215  if ( sguid != soluGUID ) break;
216 
217  cvbar20 = ats.value( "commonVbar20" ).toString();
218  }
219 
220  else if ( xml.name() == "buffer" )
221  {
222  QString bid = ats.value( "id" ).toString();
223  QString bguid = ats.value( "guid" ).toString();
224  QString bdesc = ats.value( "desc" ).toString();
225 
226  if ( ! bid.isEmpty() || ! bguid.isEmpty() )
227  {
228  bufId = bid .isEmpty() ? bufId : bid;
229  bufId = bufId.isEmpty() ? "N/A" : bufId;
230  bufGuid = bguid.isEmpty() ? bufGuid : bguid;
231  bufDesc = bdesc.isEmpty() ? bufDesc : bdesc;
232  bufinfo = true;
233  }
234  break;
235  }
236  }
237  if ( bufinfo )
238  break;
239  }
240  if ( bufinfo )
241  break;
242  }
243  }
244 
245  return bufinfo;
246 }
247 
248 // Get buffer values from DB: density, viscosity
249 bool US_SolutionVals::bufvals_db( US_DB2*dbP, QString& bufId,
250  QString& bufGuid, QString& bufDesc, QString& density, QString& viscosity,
251  QString& compress, QString& manual, QString& errmsg )
252 {
253  bool bufvals = false;
254 
255  QStringList query;
256 
257  if ( bufId.isEmpty() && ! bufGuid.isEmpty() )
258  {
259  query.clear();
260  query << "get_bufferID" << bufGuid;
261  dbP->query( query );
262 
263  if ( dbP->lastErrno() != US_DB2::OK )
264  {
265  errmsg += QObject::tr( "Unable to get buffer ID from buffer GUID " )
266  + bufGuid + "\n" + dbP->lastError() + "\n";
267  }
268  else
269  {
270  dbP->next();
271  bufId = dbP->value( 0 ).toString();
272  bufId = bufId.isEmpty() ? "N/A" : bufId;
273  }
274  }
275 
276  if ( ! bufId.isEmpty() )
277  {
278  query.clear();
279  query << "get_buffer_info" << bufId;
280  dbP->query( query );
281  if ( dbP->lastErrno() != US_DB2::OK )
282  {
283  errmsg +=
284  QObject::tr( "Unable to get buffer information from buffer ID " )
285  + bufId + "\n" + dbP->lastError() + "\n";
286  return bufvals;
287  }
288 
289  dbP->next();
290  QString ddesc = dbP->value( 1 ).toString();
291  QString dcomp = dbP->value( 2 ).toString();
292  QString dvisc = dbP->value( 4 ).toString();
293  QString ddens = dbP->value( 5 ).toString();
294  QString dmanu = dbP->value( 6 ).toString();
295  density = ddens.isEmpty() ? density : ddens;
296  viscosity = dvisc.isEmpty() ? viscosity : dvisc;
297  compress = dcomp.isEmpty() ? compress : dcomp;
298  manual = dmanu.isEmpty() ? manual :
299  ddesc.contains( " [M]" ) ? "1" : dmanu;
300  bufvals = true;
301  }
302  else
303  {
304  QString invID = QString::number( US_Settings::us_inv_ID() );
305  query.clear();
306  query << "get_buffer_desc" << invID;
307  dbP->query( query );
308 
309  if ( dbP->lastErrno() != US_DB2::OK )
310  {
311  errmsg +=
312  QObject::tr( "Unable to get buffer description for investigator " )
313  + invID + "\n" + dbP->lastError() + "\n";
314  return bufvals;
315  }
316 
317  while ( dbP->next() )
318  {
319  QString desc = dbP->value( 1 ).toString();
320 
321  if ( desc == bufDesc )
322  {
323  bufId = dbP->value( 0 ).toString();
324  break;
325  }
326  }
327 
328  if ( ! bufId.isEmpty() )
329  {
330  query.clear();
331  query << "get_buffer_info" << bufId;
332  dbP->query( query );
333 
334  if ( dbP->lastErrno() != US_DB2::OK )
335  {
336  errmsg +=
337  QObject::tr( "Unable to get buffer information for buffer ID " )
338  + bufId + "\n" + dbP->lastError() + "\n";
339  return bufvals;
340  }
341 
342  dbP->next();
343  QString ddesc = dbP->value( 1 ).toString();
344  QString dcomp = dbP->value( 2 ).toString();
345  QString dvisc = dbP->value( 4 ).toString();
346  QString ddens = dbP->value( 5 ).toString();
347  QString dmanu = dbP->value( 6 ).toString();
348  density = ddens.isEmpty() ? density : ddens;
349  viscosity = dvisc.isEmpty() ? viscosity : dvisc;
350  compress = dcomp.isEmpty() ? compress : dcomp;
351  manual = dmanu.isEmpty() ? manual :
352  ddesc.contains( " [M]" ) ? "1" : dmanu;
353  bufvals = true;
354  }
355  }
356 
357  return bufvals;
358 }
359 
360 // Get buffer values from local disk: density, viscosity
361 bool US_SolutionVals::bufvals_disk( QString& bufId, QString& bufGuid,
362  QString& bufDesc, QString& density, QString& viscosity,
363  QString& compress, QString& manual, QString& errmsg )
364 {
365  bool bufvals = false;
366  bool dfound = false;
367  QString bpath = US_Settings::dataDir() + "/buffers/";
368  QDir f( bpath );
369 
370  QStringList filter( "B*.xml" );
371  QStringList names = f.entryList( filter, QDir::Files, QDir::Name );
372  QString fname;
373  QString bdens;
374  QString bvisc;
375  QString bcomp;
376  QString bmanu;
377  QString bdesc;
378 
379  for ( int ii = 0; ii < names.size(); ii++ )
380  {
381  fname = bpath + names[ ii ];
382  QFile filei( fname );
383 
384  if ( ! filei.open( QIODevice::ReadOnly | QIODevice::Text ) )
385  continue;
386 
387  QXmlStreamReader xml( &filei );
388 
389  while ( ! xml.atEnd() )
390  {
391  xml.readNext();
392 
393  if ( xml.isStartElement() && xml.name() == "buffer" )
394  {
395  QXmlStreamAttributes ats = xml.attributes();
396  QString bid = ats.value( "id" ).toString();
397  QString bguid = ats.value( "guid" ).toString();
398  bdesc = ats.value( "description" ).toString();
399  bid = bid .isEmpty() ? "EMPTY" : bid;
400  bguid = bguid.isEmpty() ? "EMPTY" : bguid;
401  bdesc = bdesc.isEmpty() ? "EMPTY" : bdesc;
402 
403  if ( ( bufGuid != "EMPTY" && bguid == bufGuid ) ||
404  ( bufGuid == "EMPTY" && bid == bufId ) )
405  {
406  bdens = ats.value( "density" ).toString();
407  bvisc = ats.value( "viscosity" ).toString();
408  bcomp = ats.value( "compressibility" ).toString();
409  bmanu = ats.value( "manual" ).toString();
410  density = bdens.isEmpty() ? density : bdens;
411  viscosity = bvisc.isEmpty() ? viscosity : bvisc;
412  compress = bcomp.isEmpty() ? compress : bcomp;
413  manual = bmanu.isEmpty() ? manual :
414  bdesc.contains( " [M]" ) ? "1" : bmanu;
415  bufvals = true;
416  }
417 
418  else if ( bdesc == bufDesc )
419  {
420  bdens = ats.value( "density" ).toString();
421  bvisc = ats.value( "viscosity" ).toString();
422  bcomp = ats.value( "compressibility" ).toString();
423  bmanu = ats.value( "manual" ).toString();
424  dfound = true;
425  }
426 
427  break;
428  }
429  }
430 
431  if ( bufvals )
432  break;
433  }
434 
435  if ( ! bufvals && dfound )
436  {
437  density = bdens.isEmpty() ? density : bdens;
438  viscosity = bvisc.isEmpty() ? viscosity : bvisc;
439  compress = bcomp.isEmpty() ? compress : bcomp;
440  manual = bmanu.isEmpty() ? manual :
441  bdesc.contains( " [M]" ) ? "1" : bmanu;
442  bufvals = true;
443  }
444 
445  if ( ! bufvals )
446  {
447  errmsg +=
448  QObject::tr( " Unable to find buffer values locally\n"
449  " from buffer ID's (Id,Guid,Desc)\n " )
450  + ( bufId .isEmpty() ? QObject::tr( "(EMPTY)" ) : bufId ) + ","
451  + ( bufGuid.isEmpty() ? QObject::tr( "(EMPTY)" ) : bufGuid ) + ","
452  + ( bufDesc.isEmpty() ? QObject::tr( "(EMPTY)" ) : bufDesc ) + "\n";
453  }
454 
455  return bufvals;
456 }
457