19#include "BDSException.hh"
20#include "BDSMySQLWrapper.hh"
21#include "BDSMySQLTable.hh"
22#include "BDSMySQLVariable.hh"
23#include "BDSUtilities.hh"
27#include "G4Version.hh"
29#include "CLHEP/Units/SystemOfUnits.h"
38BDSMySQLWrapper::BDSMySQLWrapper(
const G4String& SQLFileName):
39 ifs(SQLFileName.c_str()),
49 G4cout << __METHOD_NAME__ <<
"loading SQL Filename: " << SQLFileName << G4endl;
53 {
throw BDSException(__METHOD_NAME__,
"Unable to load SQL file: " + SQLFileName);}
56BDSMySQLWrapper::~BDSMySQLWrapper()
59std::vector<BDSMySQLTable*> BDSMySQLWrapper::ConstructTable()
68void BDSMySQLWrapper::TokenizeLine()
76 std::regex drop_delimiters(
"[ \t,]+");
78 std::string &s = _currentLine;
82 std::sregex_token_iterator tok_iter(s.begin(), s.end(), drop_delimiters, -1);
85 std::sregex_token_iterator rend;
86 for (; tok_iter!=rend; ++tok_iter) {
87 std::string subtoken = *tok_iter;
91 std::regex keep_delimiters(
"[;\\(\\)]");
93 std::sregex_token_iterator tok_iter2(subtoken.begin(), subtoken.end(), keep_delimiters, {-1, 0});
95 for (; tok_iter2!=rend; ++tok_iter2) {
97 std::string token = *tok_iter2;
102 RemoveQuotesFromLine(token);
103 RemoveWhitespace(token);
104 _tokens.push_back(token);
106 G4cout << __METHOD_NAME__ <<
"- token: = <" << token <<
">" << G4endl;
113bool BDSMySQLWrapper::NextToken()
118 if(_startOfFile || EndTokens()){
123 G4cout << __METHOD_NAME__ <<
"- Token() = " << Token() << G4endl;
130 G4cout << __METHOD_NAME__ <<
"- Token() = " << Token() << G4endl;
136G4int BDSMySQLWrapper::ParseComponent()
139 if(Token()==CMD_DROP) {
return 0;}
140 else if(Token()==CMD_DATABASE) {
return 0;}
141 else if(Token()==CMD_IF) {
return 0;}
142 else if(Token()==CMD_EXISTS) {
return 0;}
143 else if(Token()==CMD_USE) {
return 0;}
145 else if(Token()==CMD_CREATE) {Create();
return 0;}
146 else if(Token()==CMD_INSERT) {Insert(); ComponentN++;
return 0;}
150void BDSMySQLWrapper::CreateDatabase()
153void BDSMySQLWrapper::CreateTable()
159 CurrentTableName=Token();
161 G4cout << __METHOD_NAME__ <<
" reading CurrentTableName: " << CurrentTableName << G4endl;
163 ProceedToEndOfLine();
166#if G4VERSION_NUMBER > 1099
167 while(!G4StrUtil::contains(varname,
";") && (!G4StrUtil::contains(vartype,
";")))
169 while((!varname.contains(
";")) && (!vartype.contains(
";")))
175 }
while((EmptyToken()) || (EndOfLine()));
178 G4cout << __METHOD_NAME__ <<
" reading varname: " << varname << G4endl;
184 G4cout << __METHOD_NAME__ <<
" reading vartype: " << vartype << G4endl;
190 table[tableN]->AddVariable(varname,vartype);
191 ProceedToEndOfLine();
195void BDSMySQLWrapper::Create()
199 G4cout << __METHOD_NAME__ <<
" reading input: " << Token() << G4endl;
201 if(Token()==CMD_DATABASE) {CreateDatabase();}
202 else if(Token()==CMD_TABLE) {CreateTable();}
205void BDSMySQLWrapper::Insert(){
208 G4cout << __METHOD_NAME__ <<
" reading input: " << Token() << G4endl;
210 if(Token()==CMD_INTO){InsertInto();}
213void BDSMySQLWrapper::InsertInto() {
215 InsertTableName=Token();
217 if(Token()==CMD_VALUES){Values();}
220void BDSMySQLWrapper::Values() {
221 for(G4int j=0; j<(G4int)table.size(); j++){
222 if(table[j]->
GetName()==InsertTableName){
223 for(G4int k=0; k<table[j]->GetNVariables(); k++){
226 while (Token()==
"(") {
236 G4cout << __METHOD_NAME__ <<
" inserting value " << Token() << G4endl;
238 if(table[j]->GetVariable(k)->GetVarType()==
"DOUBLE")
239 table[j]->GetVariable(k)->AddValue(std::atoi(Token().c_str())*CLHEP::mm);
240 else if(table[j]->GetVariable(k)->GetVarType()==
"STRING")
241 table[j]->GetVariable(k)->AddValue(Token());
242 else if(table[j]->GetVariable(k)->GetVarType()==
"INTEGER")
243 table[j]->GetVariable(k)->AddValue(std::atoi(Token().c_str()));
249void BDSMySQLWrapper::BeginTokens(){
250 _tokens_iter=_tokens.begin();
253bool BDSMySQLWrapper::NextInputToken(){
258 }
while (EndOfLine());
265bool BDSMySQLWrapper::EndTokens()
267 return(_tokens_iter==_tokens.end());
270bool BDSMySQLWrapper::EndOfLine()
272 return((*_tokens_iter)==
"\n");
275bool BDSMySQLWrapper::EmptyToken()
277 return((*_tokens_iter)==
"");
280std::string BDSMySQLWrapper::Token()
282 return *_tokens_iter;
285void BDSMySQLWrapper::ProceedToEndOfLine()
290 G4cout << __METHOD_NAME__ <<
" " << Token() << G4endl;
294 G4cout << __METHOD_NAME__ <<
" finished." << G4endl;
298void BDSMySQLWrapper::ReadLine(){
299 _currentLine.clear();
303 ifs.getline(buffer,512);
305 RemoveCommentsFromLine(_currentLine);
308 _currentLine +=
'\n';
310 G4cout << __METHOD_NAME__ <<
" - _currentLine = " << _currentLine << G4endl;
314void BDSMySQLWrapper::RemoveCommentsFromLine(std::string& value){
316 unsigned pos = value.find(
'#');
317 std::string uncommented = value.substr(0,pos);
321void BDSMySQLWrapper::RemoveQuotesFromLine(std::string& value){
323 value.erase (std::remove(value.begin(), value.end(),
'\"'), value.end());
327void BDSMySQLWrapper::RemoveWhitespace(G4String& val){
333void BDSMySQLWrapper::RemoveWhitespace(std::string& val){
334 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.