All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
QueryRunner.cpp
Go to the documentation of this file.
1 /*
2  * QueryRunner.cpp
3  *
4  * This file is part of the HausmiSEP project
5  *
6  * Copyright (C) 2012, 2013 Marco Alvarado (malvcr@gmail.com)
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #include <HSEPData/QueryRunner.h>
24 #include <HSEP/TimeTool.h>
25 #include <iostream>
26 #include <fstream>
27 
28 using namespace std;
29 
30 namespace HSEPData {
31 
32  ErrorCode QueryRunner::prepareStatement(
33  DBStatement*& pStatement,
34  string& pStatementName
35  ) {
37 
38  if (nullptr == pStatement) {
39 
40  try {
41  pStatement = aEnvironment->createStatementPtr(
42  DBStatementCatalog::aInstance->getStatementRef(pStatementName)
43  );
44  if (!pStatement) {
45  vResult = EC::NoStatementCreated;
46  setLastError(aEnvironment->lastErrorRef());
47  }
48  else {
49  vResult = EC::OK;
50  }
51  }
52  catch (DBException &e) {
53  setLastError(e.what());
54  }
55  }
56 
57  return vResult;
58 
59  } // QueryRunner::prepareStatement
60 
61 
62  void QueryRunner::storeData(string& pDestination, string& pStatementName) {
63 
64  if (pStatementName.substr(0,5) == "SYNC-") {
65 
66  string& vSyncPath = aEnvironment->syncPathRef();
67  string vEpochStr;
68 
69  TimeTool::epoch(vEpochStr);
70 
71  vEpochStr += "-" + to_string(aEnvironment->id()) + "-" + pStatementName;
72  string vSeparator = "";
73  if (vSyncPath.back()!='/') {
74  vSeparator = "/";
75  }
76 
77  string vFileName = vSyncPath + vSeparator + vEpochStr;
78 
79  fstream vFile(vFileName.c_str(),ios::out);
80  vFile.close();
81 
82  vFileName += "-flag";
83  fstream vFlag(vFileName.c_str(),ios::out);
84  vFlag.close();
85 
86  }
87 
88  } // QueryRunner::storeData
89 
90  void QueryRunner::storeData(string& pDestination, string& pStatementName, DBParameters& pParametersRef) {
91 
92  if (pStatementName.substr(0,5) == "SYNC-") {
93 
94  string& vSyncPath = aEnvironment->syncPathRef();
95  string vEpochStr;
96 
97  TimeTool::epoch(vEpochStr);
98 
99  vEpochStr += "-" + to_string(aEnvironment->id()) + "-" + pStatementName;
100  string vSeparator = "";
101  if (vSyncPath.back()!='/') {
102  vSeparator = "/";
103  }
104 
105  string vFileName = vSyncPath + vSeparator + vEpochStr;
106 
107  fstream vFile(vFileName.c_str(),ios::out);
108 
109  for (DBParameter vParameter : pParametersRef) {
110  vFile << vParameter.first << "=" << vParameter.second << endl;
111  }
112  vFile.close();
113 
114  vFileName += "-flag";
115  fstream vFlag(vFileName.c_str(),ios::out);
116  vFlag.close();
117 
118  }
119 
120  } // QueryRunner::storeData
121 
122  QueryRunner::QueryRunner(
123  string pDBType
124  ) : HSEPObject("QueryRunner") {
125  setInvalid();
126 
127  try {
128  aDBType = pDBType;
129  aEnvironment = DB::aInstance->getEnvironmentPtr(pDBType);
130 
131  if (aEnvironment) {
132  setValid();
133  }
134 
135  } catch (DBException &e) {
136  setLastError(e.what());
137  cout << "Error " << lastErrorRef() << endl;
138 
139  }
140 
141  //cout << "QR constructor leave" << endl;
142 
143  } // QueryRunner constructor
144 
146  if (valid()) {
147  DB::aInstance->releaseEnvironment(aDBType,aEnvironment);
148  }
149  } // QueryRunner destructor
150 
152  string pStatementName,
153  DBParameters& pParametersRef,
154  CycleBase& pCycleRunnerRef
155  ) {
157 
158  if (valid()) {
159 
160  try {
161  DBStatement* vStatement = nullptr;
162 
163  vResult = prepareStatement(vStatement,pStatementName);
164 
165  if (nullptr != vStatement) {
166 
167  if (EC::OK == vResult) {
168  int vQty = vStatement->cycleQuery(pParametersRef,pCycleRunnerRef);
169 
170  if (-1 == vQty) {
171  setLastError(vStatement->lastErrorRef());
172  }
173  else {
174  if (0 == vQty) {
175  setLastError("No data found");
176  vResult = EC::NoDataFound;
177  }
178  else {
179  vResult = EC::OK;
180  }
181  if (aEnvironment->synchronizes()) {
182  storeData(aEnvironment->syncToRef(),pStatementName,pParametersRef);
183  }
184  }
185  delete vStatement;
186  }
187  }
188  }
189  catch (DBException &e) {
190  setLastError(e.what());
191  }
192  }
193  else {
194  setLastError("Invalid Query Runner");
195  }
196  return vResult;
197 
198  } // QueryRunner::execute
199 
200 
202  string pStatementName,
203  DBParameters& pParametersRef
204  ) {
206  NullCycle vCycle;
207 
208  if (valid()) {
209 
210  try {
211  DBStatement* vStatement = nullptr;
212 
213  vResult = prepareStatement(vStatement,pStatementName);
214 
215  if (nullptr != vStatement) {
216  if (EC::OK == vResult) {
217  int vQty = vStatement->cycleQuery(pParametersRef,vCycle);
218 
219  if (-1 == vQty) {
220  setLastError(vStatement->lastErrorRef());
221  }
222  else {
223  if (0 == vQty) {
224  vResult = EC::NoDataFound;
225  setLastError("No data found");
226  }
227  else {
228  vResult = EC::OK;
229  }
230  if (aEnvironment->synchronizes()) {
231  storeData(aEnvironment->syncToRef(),pStatementName,pParametersRef);
232  }
233  }
234  delete vStatement;
235  }
236  }
237  }
238  catch (DBException &e) {
239  setLastError(e.what());
240  }
241  }
242  else {
243  setLastError("Invalid Query Runner");
244  }
245  return vResult;
246 
247  } // QueryRunner::execute
248 
249 
250 
252  string pStatementName,
253  CycleBase& pCycleRunnerRef
254  ) {
256 
257  if (valid()) {
258 
259  try {
260  DBStatement* vStatement = nullptr;
261  vResult = prepareStatement(vStatement,pStatementName);
262 
263  if (nullptr != vStatement) {
264  if (EC::OK == vResult) {
265  if (-1 == vStatement->cycleQuery(pCycleRunnerRef)) {
266  setLastError(vStatement->lastErrorRef());
267  }
268  else {
269  vResult = EC::OK;
270  if (aEnvironment->synchronizes()) {
271  storeData(aEnvironment->syncToRef(),pStatementName);
272  }
273  }
274  delete vStatement;
275  }
276  }
277  }
278  catch (DBException &e) {
279  setLastError(e.what());
280  }
281  }
282  else {
283  setLastError("Invalid Query Runner");
284  }
285  return vResult;
286 
287  } // QueryRunner::execute
288 
289 
291  string pStatementName,
292  DBParameters& pParametersRef,
293  ExecuteFunctionType pFunction
294  ) {
296 
297  if (valid()) {
298 
299  try {
300  DBStatement* vStatement = nullptr;
301 
302  vResult = prepareStatement(vStatement,pStatementName);
303 
304  if (nullptr != vStatement) {
305  if (EC::OK == vResult) {
306  int vQty = vStatement->cycleQuery(pParametersRef,pFunction);
307 
308  if (-1 == vQty) {
309  setLastError(vStatement->lastErrorRef());
310  }
311  else {
312  if (0 == vQty) {
313  vResult = EC::NoDataFound;
314  }
315  else {
316  vResult = EC::OK;
317  }
318  if (aEnvironment->synchronizes()) {
319  storeData(aEnvironment->syncToRef(),pStatementName,pParametersRef);
320  }
321  }
322  delete vStatement;
323  }
324  }
325  }
326  catch (DBException &e) {
327  setLastError(e.what());
328  }
329  }
330  else {
331  setLastError("Invalid Query Runner");
332  }
333  return vResult;
334 
335  } // QueryRunner::execute
336 
338  string pStatementName,
339  ExecuteFunctionType pFunction
340  ) {
342 
343  if (valid()) {
344 
345  try {
346  DBStatement* vStatement = nullptr;
347  vResult = prepareStatement(vStatement,pStatementName);
348 
349  if (nullptr != vStatement) {
350  if (EC::OK == vResult) {
351 
352  if (-1 == vStatement->cycleQuery(pFunction)) {
353  setLastError(vStatement->lastErrorRef());
354  }
355  else {
356  vResult = EC::OK;
357  if (aEnvironment->synchronizes()) {
358  storeData(aEnvironment->syncToRef(),pStatementName);
359  }
360  }
361  delete vStatement;
362  }
363  }
364  }
365  catch (DBException &e) {
366  setLastError(e.what());
367  }
368  }
369  else {
370  setLastError("Invalid Query Runner");
371  }
372  return vResult;
373 
374  } // QueryRunner::execute
375 
376 } // HSEPData namespace