20#include "BDSException.hh"
21#include "BDSMySQLWrapper.hh"
22#include "BDSMySQLTable.hh"
23#include "BDSMySQLVariable.hh"
24#include "BDSUtilities.hh"
28#include "G4Version.hh"
30#include "CLHEP/Units/SystemOfUnits.h"
39BDSMySQLWrapper::BDSMySQLWrapper(
const G4String& SQLFileName):
40 ifs(SQLFileName.c_str()),
50 G4cout << __METHOD_NAME__ <<
"loading SQL Filename: " << SQLFileName << G4endl;
54 {
throw BDSException(__METHOD_NAME__,
"Unable to load SQL file: " + SQLFileName);}
57BDSMySQLWrapper::~BDSMySQLWrapper()
60std::vector<BDSMySQLTable*> BDSMySQLWrapper::ConstructTable()
69void BDSMySQLWrapper::TokenizeLine()
77 std::regex drop_delimiters(
"[ \t,]+");
79 std::string &s = _currentLine;
83 std::sregex_token_iterator tok_iter(s.begin(), s.end(), drop_delimiters, -1);
86 std::sregex_token_iterator rend;
87 for (; tok_iter!=rend; ++tok_iter) {
88 std::string subtoken = *tok_iter;
92 std::regex keep_delimiters(
"[;\\(\\)]");
94 std::sregex_token_iterator tok_iter2(subtoken.begin(), subtoken.end(), keep_delimiters, {-1, 0});
96 for (; tok_iter2!=rend; ++tok_iter2) {
98 std::string token = *tok_iter2;
103 RemoveQuotesFromLine(token);
104 RemoveWhitespace(token);
105 _tokens.push_back(token);
107 G4cout << __METHOD_NAME__ <<
"- token: = <" << token <<
">" << G4endl;
114bool BDSMySQLWrapper::NextToken()
119 if(_startOfFile || EndTokens()){
124 G4cout << __METHOD_NAME__ <<
"- Token() = " << Token() << G4endl;
131 G4cout << __METHOD_NAME__ <<
"- Token() = " << Token() << G4endl;
137G4int BDSMySQLWrapper::ParseComponent()
140 if(Token()==CMD_DROP) {
return 0;}
141 else if(Token()==CMD_DATABASE) {
return 0;}
142 else if(Token()==CMD_IF) {
return 0;}
143 else if(Token()==CMD_EXISTS) {
return 0;}
144 else if(Token()==CMD_USE) {
return 0;}
146 else if(Token()==CMD_CREATE) {Create();
return 0;}
147 else if(Token()==CMD_INSERT) {Insert(); ComponentN++;
return 0;}
151void BDSMySQLWrapper::CreateDatabase()
154void BDSMySQLWrapper::CreateTable()
160 CurrentTableName=Token();
162 G4cout << __METHOD_NAME__ <<
" reading CurrentTableName: " << CurrentTableName << G4endl;
164 ProceedToEndOfLine();
167#if G4VERSION_NUMBER > 1099
168 while(!G4StrUtil::contains(varname,
";") && (!G4StrUtil::contains(vartype,
";")))
170 while((!varname.contains(
";")) && (!vartype.contains(
";")))
176 }
while((EmptyToken()) || (EndOfLine()));
179 G4cout << __METHOD_NAME__ <<
" reading varname: " << varname << G4endl;
185 G4cout << __METHOD_NAME__ <<
" reading vartype: " << vartype << G4endl;
191 table[tableN]->AddVariable(varname,vartype);
192 ProceedToEndOfLine();
196void BDSMySQLWrapper::Create()
200 G4cout << __METHOD_NAME__ <<
" reading input: " << Token() << G4endl;
202 if(Token()==CMD_DATABASE) {CreateDatabase();}
203 else if(Token()==CMD_TABLE) {CreateTable();}
206void BDSMySQLWrapper::Insert(){
209 G4cout << __METHOD_NAME__ <<
" reading input: " << Token() << G4endl;
211 if(Token()==CMD_INTO){InsertInto();}
214void BDSMySQLWrapper::InsertInto() {
216 InsertTableName=Token();
218 if(Token()==CMD_VALUES){Values();}
221void BDSMySQLWrapper::Values() {
222 for(G4int j=0; j<(G4int)table.size(); j++){
223 if(table[j]->
GetName()==InsertTableName){
224 for(G4int k=0; k<table[j]->GetNVariables(); k++){
227 while (Token()==
"(") {
237 G4cout << __METHOD_NAME__ <<
" inserting value " << Token() << G4endl;
239 if(table[j]->GetVariable(k)->GetVarType()==
"DOUBLE")
240 table[j]->GetVariable(k)->AddValue(std::atoi(Token().c_str())*CLHEP::mm);
241 else if(table[j]->GetVariable(k)->GetVarType()==
"STRING")
242 table[j]->GetVariable(k)->AddValue(Token());
243 else if(table[j]->GetVariable(k)->GetVarType()==
"INTEGER")
244 table[j]->GetVariable(k)->AddValue(std::atoi(Token().c_str()));
250void BDSMySQLWrapper::BeginTokens(){
251 _tokens_iter=_tokens.begin();
254bool BDSMySQLWrapper::NextInputToken(){
259 }
while (EndOfLine());
266bool BDSMySQLWrapper::EndTokens()
268 return(_tokens_iter==_tokens.end());
271bool BDSMySQLWrapper::EndOfLine()
273 return((*_tokens_iter)==
"\n");
276bool BDSMySQLWrapper::EmptyToken()
278 return((*_tokens_iter)==
"");
281std::string BDSMySQLWrapper::Token()
283 return *_tokens_iter;
286void BDSMySQLWrapper::ProceedToEndOfLine()
291 G4cout << __METHOD_NAME__ <<
" " << Token() << G4endl;
295 G4cout << __METHOD_NAME__ <<
" finished." << G4endl;
299void BDSMySQLWrapper::ReadLine(){
300 _currentLine.clear();
304 ifs.getline(buffer,512);
306 RemoveCommentsFromLine(_currentLine);
309 _currentLine +=
'\n';
311 G4cout << __METHOD_NAME__ <<
" - _currentLine = " << _currentLine << G4endl;
315void BDSMySQLWrapper::RemoveCommentsFromLine(std::string& value){
317 unsigned pos = value.find(
'#');
318 std::string uncommented = value.substr(0,pos);
322void BDSMySQLWrapper::RemoveQuotesFromLine(std::string& value){
324 value.erase (std::remove(value.begin(), value.end(),
'\"'), value.end());
328void BDSMySQLWrapper::RemoveWhitespace(G4String& val){
334void BDSMySQLWrapper::RemoveWhitespace(std::string& val){
335 val.erase( std::remove_if( val.begin(), val.end(), ::isblank ), val.end() );
General exception with possible name of object and message.
Representation of a mysql table.
G4bool StrContains(const G4String &str, const G4String &test)
Utility function to simplify lots of syntax changes for pedantic g4 changes.
const char * GetName(int)
Name of element.