ffead.server.doc
Cibernate.cpp
1 /*
2  Copyright 2009-2012, Sumeet Chhetri
3 
4  Licensed under the Apache License, Version 2.0 (the "License");
5  you may not use this file except in compliance with the License.
6  You may obtain a copy of the License at
7 
8  http://www.apache.org/licenses/LICENSE-2.0
9 
10  Unless required by applicable law or agreed to in writing, software
11  distributed under the License is distributed on an "AS IS" BASIS,
12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  See the License for the specific language governing permissions and
14  limitations under the License.
15 */
16 /*
17  * Cibernate.cpp
18  *
19  * Created on: Jan 5, 2010
20  * Author: sumeet
21  */
22 
23 #include "Cibernate.h"
24 
25 Cibernate::~Cibernate() {
26  close();
27  logger << "\nDestructed Cibernate" << flush;
28 }
29 Cibernate::Cibernate(string appName) {
30  logger = Logger::getLogger("Cibernate");
31  this->init = false;
32  this->appName = appName;
33  if (this->appName != "" && CibernateConnPools::isInitialized()
34  && CibernateConnPools::getPool(this->appName) != NULL) {
35  this->init = true;
36  this->conn = NULL;
37  this->pool = CibernateConnPools::getPool(this->appName);
38  this->mapping = CibernateConnPools::getMapping(this->appName);
39  if(this->mapping==NULL)
40  throw ("No mapping found for appname " + appName);
41  if(this->pool!=NULL && this->mapping!=NULL)
42  {
43  logger << ("Got pool for application " + appName) << endl;
44  }
45  }
46  else
47  throw "Error connecting to Database server";
48 }
49 
50 Cibernate::Cibernate() {
51  this->init = false;
52  this->appName = "default";
53  if (this->appName != "" && CibernateConnPools::isInitialized()
54  && CibernateConnPools::getPool(this->appName) != NULL) {
55  this->init = true;
56  this->conn = NULL;
57  this->pool = CibernateConnPools::getPool(this->appName);
58  this->mapping = CibernateConnPools::getMapping(this->appName);
59  if(this->mapping==NULL)
60  throw ("No mapping found for appname " + appName);
61  if(this->pool!=NULL && this->mapping!=NULL)
62  {
63  logger << ("Got pool for application " + appName) << endl;
64  }
65  }
66  else
67  throw "Error connecting to Database server";
68 }
69 
70 string Cibernate::demangle(const char *mangled)
71 {
72  int status; char *demangled;
73  using namespace abi;
74  demangled = __cxa_demangle(mangled, NULL, 0, &status);
75  string s(demangled);
76  delete demangled;
77  return s;
78 }
79 
80 Cibernate::Cibernate(string dbName, string uname, string pass, int psize) {
81  CibernateConnPools::addPool(psize,uname,pass,dbName,"default");
82  if(!CibernateConnPools::isInitialized())
83  throw "Error connecting to Database server";
84  this->pool = CibernateConnPools::getPool("default");
85  this->mapping = CibernateConnPools::getMapping("default");
86  if(this->mapping==NULL)
87  throw ("No mapping found for appname " + appName);
88  this->init = true;
89  this->conn = NULL;
90  if(this->pool!=NULL && this->mapping!=NULL)
91  {
92  logger << ("Got pool for application default") << endl;
93  }
94 }
95 
96 
97 bool Cibernate::allocateStmt(bool read) {
98  if(!this->init)
99  {
100  return false;
101  }
102  if (this->pool != NULL && this->conn != NULL && this->conn->type == read
103  && V_OD_hstmt != NULL) {
104  SQLCloseCursor(V_OD_hstmt);
105  //return false;
106  }
107  int V_OD_erg;// result of functions
108  if (read) {
109  if (this->pool != NULL)
110  conn = this->pool->getReadConnection();
111  V_OD_hdbc = conn->conn;
112  } else {
113  if (this->pool != NULL)
114  conn = this->pool->getWriteConnection();
115  V_OD_hdbc = conn->conn;
116  }
117  V_OD_erg = SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
118  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
119  return false;
120  }
121  return true;
122 }
123 
124 
125 void Cibernate::procedureCall(string procName) {
126  bool flagc = allocateStmt(true);
127  if(!flagc)throw "Error getting Database connection";
128  int V_OD_erg;// result of functions
129  char V_OD_stat[10];
130  SQLSMALLINT V_OD_mlen;
131  SQLINTEGER V_OD_err;
132  SQLCHAR V_OD_msg[200], *query;
133  string quer = "{call " + procName + "(";
134  map<string, string>::iterator it;
135  map<string, string> revType;
136  bool outq = false, inoutq = false;
137  vector<string> outargs, inoutargs;
138  string outQuery = "select ", inoutQuery;
139  int outC = 1;
140  int size = ntmap.size();
141  for (it = ntmap.begin(); it != ntmap.end(); ++it) {
142  if (it->second == "IN" || it->second == "in") {
143  quer += "?";
144  } else if (it->second == "OUT" || it->second == "out" || it->second
145  == "INOUT" || it->second == "inout") {
146  quer += ("@" + it->first);
147  outq = true;
148 
149  outargs.push_back("@" + it->first);
150  if (it->second == "INOUT" || it->second == "inout") {
151  inoutq = true;
152  inoutargs.push_back("@" + it->first);
153  }
154  }
155  if (outC++ != size) {
156  quer += ",";
157  }
158  }
159  quer += ")}";
160  if (outq) {
161  for (unsigned int var = 0; var < outargs.size(); ++var) {
162  outQuery += (outargs.at(var));
163  if (var != outargs.size() - 1)
164  outQuery += ",";
165  }
166  }
167  if (inoutq) {
168  string temp = "select ";
169  for (unsigned int var = 0; var < inoutargs.size(); ++var) {
170  inoutQuery += (inoutargs.at(var));
171  temp += "?";
172  if (var != inoutargs.size() - 1) {
173  inoutQuery += ",";
174  temp += ",";
175  }
176  }
177  inoutQuery = (temp + " into " + inoutQuery);
178  }
179 
180  int par = 1;
181  for (it = ntmap.begin(); it != ntmap.end(); ++it) {
182  if (it->second == "INOUT" || it->second == "inout") {
183  if (params[it->first]->getTypeName() == "int") {
184  V_OD_erg = SQLBindParameter(V_OD_hstmt, par++,
185  SQL_PARAM_INPUT_OUTPUT, SQL_C_LONG, SQL_INTEGER, 0, 0,
186  params[it->first]->getVoidPointer(), 20, NULL);
187  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg
188  != SQL_SUCCESS_WITH_INFO)) {
189  logger << "Error in binding parameter " << V_OD_erg << endl;
190  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1,
191  (SQLCHAR*) V_OD_stat, &V_OD_err, V_OD_msg, 100,
192  &V_OD_mlen);
193  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
194  close();
195  throw "Error in call to stored procedure";
196  }
197  }
198  }
199  }
200  if (inoutq)
201  {
202  logger << inoutQuery << flush;
203  V_OD_erg
204  = SQLExecDirect(V_OD_hstmt, (SQLCHAR*) inoutQuery.c_str(), SQL_NTS);
205  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
206  logger << "Error in call to stored procedure " << V_OD_erg << endl;
207  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR*) V_OD_stat,
208  &V_OD_err, V_OD_msg, 100, &V_OD_mlen);
209  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
210  close();
211  throw "Error in call to stored procedure";
212  }
213  SQLCloseCursor(V_OD_hstmt);
214  }
215 
216  logger << quer << flush;
217  query = (SQLCHAR*) quer.c_str();
218  /*V_OD_erg = SQLPrepare(V_OD_hstmt, query, SQL_NTS);
219  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
220  printf("Error in prepare statement stored procedure %d\n", V_OD_erg);
221  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR*) V_OD_stat,
222  &V_OD_err, V_OD_msg, 100, &V_OD_mlen);
223  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
224  close();
225  }*/
226  par = 1;
227  for (it = ntmap.begin(); it != ntmap.end(); ++it) {
228  SQLLEN hotelInd;hotelInd = SQL_NTS;
229  if (it->second == "OUT" || it->second == "out" || it->second == "INOUT"
230  || it->second == "inout")
231  {
232  revType["@" + it->first] = params[it->first]->getTypeName();
233  }
234  if (it->second == "IN" || it->second == "in") {
235  logger << "binding in parameter " << params[it->first]->getVoidPointer() << endl;
236  if (params[it->first]->getTypeName() == "int") {
237  V_OD_erg = SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT,
238  SQL_C_LONG, SQL_INTEGER, 0, 0,
239  params[it->first]->getVoidPointer(), 20, NULL);
240  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg
241  != SQL_SUCCESS_WITH_INFO)) {
242  logger << "Error in binding parameter " << V_OD_erg << endl;
243  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1,
244  (SQLCHAR*) V_OD_stat, &V_OD_err, V_OD_msg, 100,
245  &V_OD_mlen);
246  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
247  close();
248  throw "Error Binding parameter";
249  }
250  }
251  else if (params[it->first]->getTypeName() == "short") {
252  short* parmv = (short*)params[it->first]->getVoidPointer();
253  V_OD_erg = SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT,
254  SQL_C_SHORT, SQL_SMALLINT, 0, 0,
255  parmv, 20, NULL);
256  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg
257  != SQL_SUCCESS_WITH_INFO)) {
258  logger << "Error in binding parameter " << V_OD_erg << endl;
259  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1,
260  (SQLCHAR*) V_OD_stat, &V_OD_err, V_OD_msg, 100,
261  &V_OD_mlen);
262  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
263  close();
264  throw "Error Binding parameter";
265  }
266  }
267  else if (params[it->first]->getTypeName() == "std::string") {
268  string *parm = (string*)params[it->first]->getVoidPointer();
269  //char *parmv = (char*)parm->c_str();
270  V_OD_erg= SQLBindParameter(V_OD_hstmt, par , SQL_PARAM_INPUT,
271  SQL_C_CHAR,SQL_VARCHAR, 0, 0, (SQLPOINTER)parm->c_str() ,parm->length(), &hotelInd);
272  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg
273  != SQL_SUCCESS_WITH_INFO)) {
274  logger << "Error in binding parameter " << V_OD_erg << endl;
275  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1,
276  (SQLCHAR*) V_OD_stat, &V_OD_err, V_OD_msg, 100,
277  &V_OD_mlen);
278  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
279  close();
280  throw "Error Binding parameter";
281  }
282  }
283  }
284  par++;
285  }
286  V_OD_erg = SQLExecDirect(V_OD_hstmt, query, SQL_NTS);
287  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
288  logger << "Error in call to stored procedure " << V_OD_erg << endl;
289  SQLGetDiagRec(SQL_HANDLE_STMT, V_OD_hdbc, 1, (SQLCHAR*) V_OD_stat,
290  &V_OD_err, V_OD_msg, 100, &V_OD_mlen);
291  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
292  close();
293  throw "Error in call to stored procedure";
294  }
295 
296  /*V_OD_erg = SQLNumResultCols(V_OD_hstmt, &V_OD_colanz);
297  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
298  close();
299  }
300  logger << "Number of Columns " << V_OD_colanz << endl;
301  V_OD_erg = SQLRowCount(V_OD_hstmt, &V_OD_rowanz);
302  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
303  logger << "Number of RowCount " << V_OD_erg << endl;
304  close();
305  }
306  logger << "Number of Rows " << (int)V_OD_rowanz << endl;*/
307  //SQLCloseCursor(V_OD_hstmt);
308 
309  logger << outQuery << flush;
310  SQLLEN siz;
311  V_OD_erg = SQLExecDirect(V_OD_hstmt, (SQLCHAR*) outQuery.c_str(), SQL_NTS);
312  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
313  logger << "Error in Select " << V_OD_erg << endl;
314  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR*) V_OD_stat,
315  &V_OD_err, V_OD_msg, 100, &V_OD_mlen);
316  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
317  close();
318  throw "Error in call to stored procedure";
319  }
320  /*V_OD_erg = SQLNumResultCols(V_OD_hstmt, &V_OD_colanz);
321  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
322  close();
323  }
324  logger << "Number of Columns " << V_OD_colanz << endl;
325  V_OD_erg = SQLRowCount(V_OD_hstmt, &V_OD_rowanz);
326  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
327  logger << "Number of RowCount " << V_OD_erg << endl;
328  close();
329  }
330  logger << "Number of Rows " << (int)V_OD_rowanz << endl;*/
331  V_OD_erg = SQLFetch(V_OD_hstmt);
332  while (V_OD_erg != SQL_NO_DATA) {
333  for (unsigned int var = 0; var < outargs.size(); ++var) {
334  if (revType[outargs.at(var)] == "int") {
335 
336  StringUtil::replaceFirst(outargs.at(var), "@", "");
337  SQLGetData(V_OD_hstmt, var + 1, SQL_C_LONG, params[outargs.at(
338  var)]->getVoidPointer(),
339  sizeof(params[outargs.at(var)]->getVoidPointer()), &siz);
340  logger << *(int*) params[outargs.at(var)]->getVoidPointer() << endl;
341  }
342  else if (revType[outargs.at(var)] == "short") {
343  StringUtil::replaceFirst(outargs.at(var), "@", "");
344  SQLGetData(V_OD_hstmt, var + 1, SQL_C_SHORT, params[outargs.at(
345  var)]->getVoidPointer(),
346  sizeof(params[outargs.at(var)]->getVoidPointer()), &siz);
347  logger << *(short*) params[outargs.at(var)]->getVoidPointer() << endl;
348  }
349  }
350  V_OD_erg = SQLFetch(V_OD_hstmt);
351  }
352  SQLCloseCursor(V_OD_hstmt);
353  clearMaps();
354  close();
355 }
356 
357 
358 void Cibernate::close() {
359  this->pool->closeConnection(conn);
360  this->pool = NULL;
361  this->mapping = NULL;
362  V_OD_hdbc = NULL;
363  SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
364  V_OD_hstmt = NULL;
365 }
366 
367 
368 void Cibernate::empty(string clasName) {
369  bool flagc = allocateStmt(true);
370  if(!flagc)return;
371  int V_OD_erg;// result of functions
372  //SQLINTEGER V_OD_id;
373  char V_OD_stat[10];
374  string tableName = this->mapping->getAppTableClassMapping(clasName);
375  SQLSMALLINT V_OD_mlen;
376  SQLINTEGER V_OD_err;
377  SQLCHAR V_OD_msg[200];
378  string query = "tuncate table "+tableName;
379  logger << query << flush;
380  V_OD_erg = SQLExecDirect(V_OD_hstmt, (SQLCHAR*) query.c_str(), SQL_NTS);
381  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
382  {
383  logger << "Error in Truncate " << V_OD_erg << endl;
384  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
385  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
386  close();
387  }
388  SQLCloseCursor(V_OD_hstmt);
389  clearMaps();
390  return;
391 }
392 
393 
394 void* Cibernate::getElements(string clasName)
395 {
396  vector<string> cols;
397  return getElements(cols,clasName);
398 }
399 
400 void* Cibernate::getElements(vector<string> cols,string clasName)
401 {
402  int V_OD_erg;// result of functions
403  Reflector reflector;
404  ClassInfo clas = reflector.getClassInfo(clasName);
405  string tableName = this->mapping->getAppTableClassMapping(clasName);
406  vector<DBRel> relv = this->mapping->getAppTablerelMapping(clasName);
407  fldMap fields = clas.getFields();
408  fldMap::iterator it;
409  void *vecT = reflector.getNewVector(clasName);
410  SQLCHAR colName[256];
411  SQLSMALLINT V_OD_colanz, colNameLen, dataType, numDecimalDigits, allowsNullValues;
412  SQLUINTEGER columnSize;
413 
414  void *col = NULL;
415  V_OD_erg=SQLFetch(V_OD_hstmt);
416  while(V_OD_erg != SQL_NO_DATA)
417  {
418  unsigned int var = 0;
419  args argus1;
420  map<string, void*> instances;
421  Constructor ctor = clas.getConstructor(argus1);
422  void *t = reflector.newInstanceGVP(ctor);
423  //if(cols.size()<=0)
424  //{
425  V_OD_erg = SQLNumResultCols(V_OD_hstmt,&V_OD_colanz);
426  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
427  {
428  close();
429  }
430  //logger << "Number of Columns " << V_OD_colanz << endl;
431  for(int i=1;i<=V_OD_colanz;i++)
432  {
433  V_OD_erg = SQLDescribeCol(V_OD_hstmt, i, colName, 255, &colNameLen, &dataType, &columnSize, &numDecimalDigits, &allowsNullValues);
434  string columnName((char*)colName);
435 
436  string thisTableName = tableName;
437 
438  if(columnName.find(".")!=string::npos)
439  {
440  thisTableName = columnName.substr(0, columnName.find("."));
441  columnName = columnName.substr(columnName.find(".")+1);
442  }
443 
444  StringUtil::toLower(columnName);
445 
446  void* instance = NULL;
447  ClassInfo instanceClas;
448  DBRel instanceRelation;
449 
450  string fieldName = this->mapping->getTableAppColMapping(thisTableName, columnName);
451 
452  if(thisTableName==tableName && fieldName!="")
453  {
454  instanceClas = clas;
455  instance = t;
456  }
457  else
458  {
459  for (int var1 = 0; var1 < (int)relv.size(); ++var1)
460  {
461  DBRel relation = relv.at(var1);
462  if(relation.type==1)
463  {
464  string tableName1 = this->mapping->getAppTableClassMapping(relation.clsName);
465  fieldName = this->mapping->getTableAppColMapping(tableName1, columnName);
466  if(fieldName!="" || tableName1==thisTableName)
467  {
468  thisTableName = tableName1;
469  args argus1;
470  ClassInfo clas1 = reflector.getClassInfo(relation.clsName);
471  if(instances.find(thisTableName)==instances.end())
472  {
473  Constructor ctor = clas1.getConstructor(argus1);
474  void *tt = reflector.newInstanceGVP(ctor);
475  instances[tableName1] = tt;
476  }
477  instanceClas = clas1;
478  instance = instances[thisTableName];
479  instanceRelation = relation;
480  break;
481  }
482  }
483  }
484  }
485 
486  var = storeProperty(instanceClas, instance, var, fieldName);
487  if(thisTableName!=tableName)
488  {
489  args argus;
490  vals valus;
491  valus.push_back(instance);
492  argus.push_back(instanceRelation.clsName);
493  string methname = "set"+AfcUtil::camelCased(instanceRelation.field);
494  Method meth = clas.getMethod(methname,argus);
495  reflector.invokeMethodGVP(t,meth,valus);
496  }
497  }
498  reflector.vectorPushBack(vecT,t,clasName);
499  delete t;
500  V_OD_erg=SQLFetch(V_OD_hstmt);
501  }
502  SQLCloseCursor(V_OD_hstmt);
503  int vecsiz = reflector.getVectorSize(vecT,clasName);
504  for (int var = 0; var < vecsiz; ++var)
505  {
506  for (int var1 = 0; var1 < (int)relv.size(); ++var1)
507  {
508  DBRel relation = relv.at(var1);
509  if(relation.type==2)
510  {
511  clearMaps();
512  args argus;
513  string methname = "get"+AfcUtil::camelCased(relation.pk);
514  Method meth = clas.getMethod(methname,argus);
515  vals valus;
516  void *tt = reflector.getVectorElement(vecT,var,clasName);
517  void *ns = reflector.invokeMethodGVP(tt,meth,valus);
518  Object on;
519  on << ns;
520  on.setTypeName(meth.getReturnType());
521  addParam(relation.fk,on);
522  igPaWC = false;
523  //col = getARACW(relation.clsName);
524  valus.push_back(col);
525  argus.push_back("vector<"+relation.clsName+">");
526  methname = "set"+AfcUtil::camelCased(relation.field);
527  meth = clas.getMethod(methname,argus);
528  reflector.invokeMethodGVP(tt,meth,valus);
529  }
530  }
531  }
532  clearMaps();
533  return vecT;
534 }
535 
536 
537 void* Cibernate::getElements()
538 {
539  int V_OD_erg;// result of functions
540  SQLCHAR colName[256];
541  SQLSMALLINT V_OD_colanz, colNameLen, dataType, numDecimalDigits, allowsNullValues;
542  SQLUINTEGER columnSize;
543 
544  vector<map<string, void*> >* vecT = new vector<map<string, void*> >;
545 
546  V_OD_erg=SQLFetch(V_OD_hstmt);
547  while(V_OD_erg != SQL_NO_DATA)
548  {
549  unsigned int var = 0;
550 
551  V_OD_erg = SQLNumResultCols(V_OD_hstmt,&V_OD_colanz);
552  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
553  {
554  close();
555  }
556 
557  //logger << "Number of Columns " << V_OD_colanz << endl;
558 
559  map<string, void*> colValMap;
560 
561  for(int i=1;i<=V_OD_colanz;i++)
562  {
563  V_OD_erg = SQLDescribeCol(V_OD_hstmt, i, colName, 255, &colNameLen, &dataType, &columnSize, &numDecimalDigits, &allowsNullValues);
564  string columnName((char*)colName, colNameLen);
565 
566  //string thisTableName = tableName;
567 
568  /*if(columnName.find(".")!=string::npos)
569  {
570  thisTableName = columnName.substr(0, columnName.find("."));
571  columnName = columnName.substr(columnName.find(".")+1);
572  }*/
573 
574  StringUtil::toLower(columnName);
575 
576  var = getProperty(dataType, columnSize, colValMap, columnName, var);
577  }
578  V_OD_erg=SQLFetch(V_OD_hstmt);
579  vecT->push_back(colValMap);
580  }
581  SQLCloseCursor(V_OD_hstmt);
582  return vecT;
583 }
584 
585 
586 int Cibernate::storeProperty(ClassInfo clas, void* t, int var, string fieldName)
587 {
588  void* col = NULL;
589  SQLRETURN ret;
590  SQLLEN indicator;
591  Field fe = clas.getField(fieldName);
592  string te = fe.getType();
593  if(te=="int")
594  {
595  col = new int;
596  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_LONG, col, sizeof(col), &indicator);
597  }
598  else if(te=="unsigned int")
599  {
600  col = new unsigned int;
601  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_ULONG,col, sizeof(col), &indicator);
602  }
603  else if(te=="long")
604  {
605  col = new long;
606  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_LONG,col, sizeof(col), &indicator);
607  }
608  else if(te=="unsigned long")
609  {
610  col = new unsigned long;
611  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_ULONG,col, sizeof(col), &indicator);
612  }
613  else if(te=="long long")
614  {
615  col = new long long;
616  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_SBIGINT, col, sizeof(col), &indicator);
617  }
618  else if(te=="unsigned long long")
619  {
620  col = new unsigned long long;
621  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_UBIGINT, col, sizeof(col), &indicator);
622  }
623  else if(te=="short")
624  {
625  col = new short;
626  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_SHORT,col, sizeof(col), &indicator);
627  }
628  else if(te=="unsigned short")
629  {
630  col = new unsigned short;
631  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_USHORT,col, sizeof(col), &indicator);
632  }
633  else if(te=="double")
634  {
635  col = new double;
636  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_DOUBLE, col, sizeof(col), &indicator);
637  }
638  else if(te=="float")
639  {
640  col = new float;
641  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_FLOAT, col, sizeof(col), &indicator);
642  }
643  else if(te=="bool")
644  {
645  col = new bool;
646  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_BIT, col, sizeof(col), &indicator);
647  }
648  else if(te=="string")
649  {
650  /*col = new string;
651  SQLBindCol(V_OD_hstmt,var,SQL_C_CHAR, col,10,sizes);*/
652  char buf[24];
653  string *temp = new string;
654  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf, sizeof(buf), &indicator);
655  temp->append(buf);
656  //logger << indicator << flush;
657  if(indicator > (long)24)
658  {
659  int len = indicator-24;
660  char buf1[len];
661  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf1, sizeof(buf1), &indicator);
662  temp->append(buf1);
663  //logger << buf1 << flush;
664  }
665  col = temp;
666  //logger << *temp << "\n" << flush;
667  }
668  else if(te=="Date")
669  {
670  //col = new Date;
671  //ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_DATE,col, sizeof(col), &indicator);
672  /*col = new string;
673  SQLBindCol(V_OD_hstmt,var,SQL_C_CHAR, col,10,sizes);*/
674  char buf[24];
675 
676  string temp;
677  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf, sizeof(buf), &indicator);
678  temp.append(buf);
679  //logger << indicator << flush;
680  if(indicator > (long)24)
681  {
682  int len = indicator-24;
683  char buf1[len];
684  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf1, sizeof(buf1), &indicator);
685  temp.append(buf1);
686  //logger << buf1 << flush;
687  }
688  DateFormat datf("yyyy-mm-dd");
689  if(temp.length()>10)
690  datf.setFormatspec("yyyy-mm-dd hh:mi:ss");
691  Date *date = datf.parse(temp);
692  col = date;
693  //logger << temp << "\n" << flush;
694  }
695  else if(te=="BinaryData")
696  {
697  /*col = new string;
698  SQLBindCol(V_OD_hstmt,var,SQL_C_CHAR, col,10,sizes);*/
699  unsigned char buf[24];
700  BinaryData *temp = new BinaryData;
701  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_BINARY, buf, sizeof(buf), &indicator);
702  //temp->append(buf,indicator);
703  //logger << indicator << flush;
704 
705  if(indicator > (long)24)
706  {
707  int len = indicator-24;
708  unsigned char buf1[len];
709  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_BINARY, buf1, sizeof(buf1), &indicator);
710  temp->append(buf,24);
711  temp->append(buf1,len);
712  }
713  else
714  temp->append(buf,indicator);
715  col = temp;
716  //logger << buf << "\n" << flush;
717  }
718  else//if its not a vector means its a one-to-one relationship
719  {
720 
721  }
722  if(col!=NULL)
723  {
724  Reflector reflector;
725  args argus;
726  argus.push_back(te);
727  vals valus;
728  //valus.push_back(columns.at(var));
729  valus.push_back(col);
730  string methname = "set"+AfcUtil::camelCased(fe.getFieldName());
731  Method meth = clas.getMethod(methname,argus);
732  reflector.invokeMethod<void*>(t,meth,valus);
733  var++;
734  }
735  return var;
736 }
737 
738 
739 int Cibernate::getProperty(int dataType, int columnSize, map<string, void*>& colValMap, string colName, int var)
740 {
741  void* col = NULL;
742  SQLRETURN ret;
743  SQLLEN indicator;
744  switch (dataType) {
745  case SQL_BIT:
746  {
747  col = new bool;
748  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_BIT, col, sizeof(col), &indicator);
749  colValMap[colName] = col;
750  }
751  case SQL_REAL:
752  {
753  col = new float;
754  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_FLOAT, col, sizeof(col), &indicator);
755  colValMap[colName] = col;
756  }
757  case SQL_DECIMAL:
758  case SQL_DOUBLE:
759  {
760  col = new double;
761  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_DOUBLE, col, sizeof(col), &indicator);
762  colValMap[colName] = col;
763  }
764  case SQL_VARCHAR:
765  case SQL_CHAR:
766  default:
767  {
768  char buf[24];
769  string *temp = new string;
770  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf, sizeof(buf), &indicator);
771  temp->append(buf);
772  if(indicator > (long)24)
773  {
774  int len = indicator-24;
775  char buf1[len];
776  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf1, sizeof(buf1), &indicator);
777  temp->append(buf1);
778  }
779  col = temp;
780  colValMap[colName] = col;
781  break;
782  }
783  case SQL_BINARY:
784  {
785  unsigned char buf[24];
786  BinaryData *temp = new BinaryData;
787  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_BINARY, buf, sizeof(buf), &indicator);
788  if(indicator > (long)24)
789  {
790  int len = indicator-24;
791  unsigned char buf1[len];
792  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_BINARY, buf1, sizeof(buf1), &indicator);
793  temp->append(buf,24);
794  temp->append(buf1,len);
795  }
796  else
797  temp->append(buf,indicator);
798  col = temp;
799  colValMap[colName] = col;
800  break;
801  }
802  case SQL_INTEGER:
803  {
804  if(columnSize>10)
805  {
806  col = new long;
807  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_LONG, col, sizeof(col), &indicator);
808  colValMap[colName] = col;
809  }
810  else
811  {
812  col = new int;
813  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_LONG, col, sizeof(col), &indicator);
814  colValMap[colName] = col;
815  }
816  break;
817  }
818  case SQL_BIGINT:
819  {
820  char buf[24];
821  string temp;
822  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf, sizeof(buf), &indicator);
823  temp.append(buf);
824  if(indicator > (long)24)
825  {
826  int len = indicator-24;
827  char buf1[len];
828  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf1, sizeof(buf1), &indicator);
829  temp.append(buf1);
830  }
831  long long *number = new long long(CastUtil::lexical_cast<long long>(temp));
832  colValMap[colName] = number;
833  break;
834  }
835  case SQL_DATE:
836  case SQL_TIME:
837  case SQL_TIMESTAMP:
838  {
839  char buf[24];
840  string temp;
841  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf, sizeof(buf), &indicator);
842  temp.append(buf);
843  if(indicator > (long)24)
844  {
845  int len = indicator-24;
846  char buf1[len];
847  ret = SQLGetData(V_OD_hstmt, var+1, SQL_C_CHAR, buf1, sizeof(buf1), &indicator);
848  temp.append(buf1);
849  }
850  string fmstr;
851  if(dataType==SQL_DATE)
852  fmstr = "yyyy-mm-dd";
853  else if(dataType==SQL_TIME)
854  fmstr = "hh:mm:ss.nnnnnn";
855  else if(dataType==SQL_TIMESTAMP)
856  fmstr = "yyyy-mm-dd hh:mm:ss.nnnnnn";
857  DateFormat datf(fmstr);
858  Date *date = datf.parse(temp);
859  col = date;
860  colValMap[colName] = col;
861  break;
862  }
863  }
864  return var+1;
865 }
866 
867 
868 void* Cibernate::sqlfuncs(string type,string clasName)
869 {
870  string tableName = this->mapping->getAppTableClassMapping(clasName);
871  string query = "select "+type+" from "+tableName;
872  CibernateQuery cquery(query);
873  vector<map<string, void*> > vec = execute(cquery);
874  if(vec.size()>0 && vec.at(0).size()>0)
875  {
876  return vec.at(0).begin()->second;
877  }
878  return NULL;
879 }
880 
881 bool Cibernate::startTransaction()
882 {
883  bool flagc = allocateStmt(true);
884  if(!flagc)return false;
885  int V_OD_erg;// result of functions
886  //SQLINTEGER V_OD_id;
887  char V_OD_stat[10];
888  SQLSMALLINT V_OD_mlen;
889  SQLINTEGER V_OD_err;
890  SQLCHAR V_OD_msg[200];
891  string vals;
892  string query = "start transaction";
893  logger << query << flush;
894  V_OD_erg = SQLExecDirect(V_OD_hstmt, (SQLCHAR*) query.c_str(), SQL_NTS);
895  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
896  {
897  logger << "Error in Start transaction " << V_OD_erg << endl;
898  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
899  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
900  close();
901  SQLCloseCursor(V_OD_hstmt);
902  return false;
903  }
904  SQLCloseCursor(V_OD_hstmt);
905  clearMaps();
906  return true;
907 }
908 
909 bool Cibernate::commit()
910 {
911  bool flagc = allocateStmt(true);
912  if(!flagc)return false;
913  int V_OD_erg;// result of functions
914  //SQLINTEGER V_OD_id;
915  char V_OD_stat[10];
916  SQLSMALLINT V_OD_mlen;
917  SQLINTEGER V_OD_err;
918  SQLCHAR V_OD_msg[200];
919  string vals;
920  string query = "commit";
921  logger << query << flush;
922  V_OD_erg = SQLExecDirect(V_OD_hstmt, (SQLCHAR*) query.c_str(), SQL_NTS);
923  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
924  {
925  logger << "Error in commit " << V_OD_erg << endl;
926  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
927  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
928  close();
929  SQLCloseCursor(V_OD_hstmt);
930  return false;
931  }
932  SQLCloseCursor(V_OD_hstmt);
933  clearMaps();
934  return true;
935 }
936 
937 bool Cibernate::rollback()
938 {
939  bool flagc = allocateStmt(true);
940  if(!flagc)return false;
941  int V_OD_erg;// result of functions
942  //SQLINTEGER V_OD_id;
943  char V_OD_stat[10];
944  SQLSMALLINT V_OD_mlen;
945  SQLINTEGER V_OD_err;
946  SQLCHAR V_OD_msg[200];
947  string vals;
948  string query = "rollback";
949  logger << query << flush;
950  V_OD_erg = SQLExecDirect(V_OD_hstmt, (SQLCHAR*) query.c_str(), SQL_NTS);
951  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
952  {
953  logger << "Error in rollback " << V_OD_erg << endl;
954  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
955  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
956  close();
957  SQLCloseCursor(V_OD_hstmt);
958  return false;
959  }
960  SQLCloseCursor(V_OD_hstmt);
961  clearMaps();
962  return true;
963 }
964 
965 
966 void* Cibernate::executeQuery(CibernateQuery cquery, vector<string> cols)
967 {
968  Reflector reflector;
969  string clasName = cquery.className;
970  string tableName = this->mapping->getAppTableClassMapping(clasName);
971  ClassInfo clas = reflector.getClassInfo(clasName);
972  vector<DBRel> relv = this->mapping->getAppTablerelMapping(clasName);
973  string query = "select ";
974  if(cols.size()>0)
975  {
976  for (unsigned int var = 0; var < cols.size(); var++)
977  {
978  string propertyName = cols.at(var);
979  string columnName = propertyName;
980  if(this->mapping->getAppTableColMapping(clasName,propertyName)!="")
981  columnName = this->mapping->getAppTableColMapping(clasName,propertyName);
982  query += (clasName + "_Alias." + columnName);
983  if(var!=cols.size()-1)
984  query += ",";
985  }
986  }
987  else
988  {
989  strMap tabcolmap = this->mapping->getAppTableColMapping(clasName);
990  strMap::iterator it;
991  int fldsiz = (int)tabcolmap.size();
992  int var = 1;
993  for(it=tabcolmap.begin();it!=tabcolmap.end();it++)
994  {
995  string columnName = it->first;
996  query += (clasName + "_Alias." + columnName);
997  if(var++!=fldsiz)
998  query += ",";
999  }
1000  }
1001  string reltabs = " from ";
1002  for (int var1 = 0; var1 < (int)relv.size(); var1++)
1003  {
1004  DBRel relation = relv.at(var1);
1005  if(relation.type==1)
1006  {
1007  string tableName1 = this->mapping->getAppTableClassMapping(relation.clsName);
1008  if(tableName1!="")
1009  {
1010  query += ",";
1011  strMap tabcolmap = this->mapping->getAppTableColMapping(relation.clsName);
1012  strMap::iterator it;
1013  int fldsiz = (int)tabcolmap.size();
1014  int var = 1;
1015  for(it=tabcolmap.begin();it!=tabcolmap.end();it++)
1016  {
1017  string columnName = it->first;
1018  query += (relation.clsName + "_Alias." + columnName);
1019  if(var++!=fldsiz)
1020  query += ",";
1021  }
1022  reltabs += tableName1 + " " + relation.clsName +"_Alias,";
1023  }
1024  }
1025  }
1026  query += (reltabs + tableName + " " + clasName + "_Alias");
1027  //logger << query << flush;
1028  cquery.query = query;
1029  return executeQuery(cquery);
1030 }
1031 
1032 
1033 bool Cibernate::executeInsert(CibernateQuery cquery, vector<string> cols, void* t)
1034 {
1035  string clasName = cquery.className;
1036  string tableName = this->mapping->getAppTableClassMapping(clasName);
1037  vector<DBRel> relv = this->mapping->getAppTablerelMapping(clasName);
1038  string query = "insert into "+tableName+"(";
1039  unsigned var=0;
1040  Reflector reflector;
1041  string vals;
1042  ClassInfo clas = reflector.getClassInfo(clasName);
1043  fldMap fields = clas.getFields();
1044  unsigned par = 1;
1045  if(cols.size()>0)
1046  {
1047  for (unsigned int var = 0; var < cols.size(); var++)
1048  {
1049  string propertyName = cols.at(var);
1050  string columnName = propertyName;
1051  if(this->mapping->getAppTableColMapping(clasName,propertyName)!="")
1052  columnName = this->mapping->getAppTableColMapping(clasName,propertyName);
1053  args argus;
1054  vector<void *> valus;
1055  Field fld = fields[cols.at(var)];
1056  string methname = "get"+AfcUtil::camelCased(cols.at(var));
1057  Method meth = clas.getMethod(methname,argus);
1058  if(fld.getType()=="short")
1059  {
1060  short temp = reflector.invokeMethod<short>(t,meth,valus);
1061  Object o;
1062  o << temp;
1063  cquery.propPosVaues[var+1] = o;
1064  }
1065  else if(fld.getType()=="unsigned short")
1066  {
1067  unsigned short temp = reflector.invokeMethod<unsigned short>(t,meth,valus);
1068  Object o;
1069  o << temp;
1070  cquery.propPosVaues[var+1] = o;
1071  }
1072  else if(fld.getType()=="int")
1073  {
1074  int temp = reflector.invokeMethod<int>(t,meth,valus);
1075  Object o;
1076  o << temp;
1077  cquery.propPosVaues[var+1] = o;
1078  }
1079  else if(fld.getType()=="unsigned int")
1080  {
1081  unsigned int temp = reflector.invokeMethod<unsigned int>(t,meth,valus);
1082  Object o;
1083  o << temp;
1084  cquery.propPosVaues[var+1] = o;
1085  }
1086  else if(fld.getType()=="long")
1087  {
1088  long temp = reflector.invokeMethod<long>(t,meth,valus);
1089  Object o;
1090  o << temp;
1091  cquery.propPosVaues[var+1] = o;
1092  }
1093  else if(fld.getType()=="unsigned long")
1094  {
1095  unsigned long temp = reflector.invokeMethod<unsigned long>(t,meth,valus);
1096  Object o;
1097  o << temp;
1098  cquery.propPosVaues[var+1] = o;
1099  }
1100  else if(fld.getType()=="double")
1101  {
1102  double temp = reflector.invokeMethod<double>(t,meth,valus);
1103  Object o;
1104  o << temp;
1105  cquery.propPosVaues[var+1] = o;
1106  }
1107  else if(fld.getType()=="float")
1108  {
1109  float temp = reflector.invokeMethod<float>(t,meth,valus);
1110  Object o;
1111  o << temp;
1112  cquery.propPosVaues[var+1] = o;
1113  }
1114  else if(fld.getType()=="string")
1115  {
1116  string temp = reflector.invokeMethod<string>(t,meth,valus);
1117  Object o;
1118  o << temp;
1119  cquery.propPosVaues[var+1] = o;
1120  }
1121 
1122  query += (columnName);
1123  vals += "?";
1124  if(var!=cols.size()-1)
1125  {
1126  query += ",";
1127  vals += ",";
1128  }
1129  }
1130  }
1131  else
1132  {
1133  fldMap::iterator it;
1134  for(it=fields.begin();it!=fields.end();++it)
1135  {
1136  args argus;
1137  vector<void *> valus;
1138  Field fld = it->second;
1139  string methname = "get"+AfcUtil::camelCased(it->first);
1140  Method meth = clas.getMethod(methname,argus);
1141  if(fld.getType()=="short")
1142  {
1143  short temp = reflector.invokeMethod<short>(t,meth,valus);
1144  Object o;
1145  o << temp;
1146  cquery.propPosVaues[var+1] = o;
1147  }
1148  else if(fld.getType()=="unsigned short")
1149  {
1150  unsigned short temp = reflector.invokeMethod<unsigned short>(t,meth,valus);
1151  Object o;
1152  o << temp;
1153  cquery.propPosVaues[var+1] = o;
1154  }
1155  else if(fld.getType()=="int")
1156  {
1157  int temp = reflector.invokeMethod<int>(t,meth,valus);
1158  Object o;
1159  o << temp;
1160  cquery.propPosVaues[var+1] = o;
1161  }
1162  else if(fld.getType()=="unsigned int")
1163  {
1164  unsigned int temp = reflector.invokeMethod<unsigned int>(t,meth,valus);
1165  Object o;
1166  o << temp;
1167  cquery.propPosVaues[var+1] = o;
1168  }
1169  else if(fld.getType()=="long")
1170  {
1171  long temp = reflector.invokeMethod<long>(t,meth,valus);
1172  Object o;
1173  o << temp;
1174  cquery.propPosVaues[var+1] = o;
1175  }
1176  else if(fld.getType()=="unsigned long")
1177  {
1178  unsigned long temp = reflector.invokeMethod<unsigned long>(t,meth,valus);
1179  Object o;
1180  o << temp;
1181  cquery.propPosVaues[var+1] = o;
1182  }
1183  else if(fld.getType()=="double")
1184  {
1185  double temp = reflector.invokeMethod<double>(t,meth,valus);
1186  Object o;
1187  o << temp;
1188  cquery.propPosVaues[var+1] = o;
1189  }
1190  else if(fld.getType()=="float")
1191  {
1192  float temp = reflector.invokeMethod<float>(t,meth,valus);
1193  Object o;
1194  o << temp;
1195  cquery.propPosVaues[var+1] = o;
1196  }
1197  else if(fld.getType()=="string")
1198  {
1199  string temp = reflector.invokeMethod<string>(t,meth,valus);
1200  Object o;
1201  o << temp;
1202  cquery.propPosVaues[var+1] = o;
1203  }
1204  query += (it->first);
1205  vals += "?";
1206  if(var++!=fields.size()-1)
1207  {
1208  query += ",";
1209  vals += ",";
1210  }
1211  }
1212  }
1213  query += (") values("+vals+")");
1214  cquery.query = query;
1215  //logger << query << flush;
1216 
1217  bool* flag = (bool*)executeQuery(cquery);
1218  bool ffl = *flag;
1219  delete flag;
1220  return ffl;
1221 }
1222 
1223 
1224 bool Cibernate::executeUpdate(CibernateQuery cquery, vector<string> cols, void* t)
1225 {
1226  string clasName = cquery.className;
1227  string tableName = this->mapping->getAppTableClassMapping(clasName);
1228  vector<DBRel> relv = this->mapping->getAppTablerelMapping(clasName);
1229  string query = "update "+tableName+" set ";
1230  Reflector reflector;
1231  string vals;
1232  ClassInfo clas = reflector.getClassInfo(clasName);
1233  fldMap fields = clas.getFields();
1234  unsigned par = 1,var=0;
1235  if(cols.size()>0)
1236  {
1237  for (unsigned int var = 0; var < cols.size(); var++)
1238  {
1239  string propertyName = cols.at(var);
1240  string columnName = propertyName;
1241  if(this->mapping->getAppTableColMapping(clasName,propertyName)!="")
1242  columnName = this->mapping->getAppTableColMapping(clasName,propertyName);
1243  args argus;
1244  vector<void *> valus;
1245  Field fld = fields[cols.at(var)];
1246  string methname = "get"+AfcUtil::camelCased(cols.at(var));
1247  Method meth = clas.getMethod(methname,argus);
1248  if(fld.getType()=="short")
1249  {
1250  short temp = reflector.invokeMethod<short>(t,meth,valus);
1251  Object o;
1252  o << temp;
1253  cquery.propPosVaues[var+1] = o;
1254  }
1255  else if(fld.getType()=="unsigned short")
1256  {
1257  unsigned short temp = reflector.invokeMethod<unsigned short>(t,meth,valus);
1258  Object o;
1259  o << temp;
1260  cquery.propPosVaues[var+1] = o;
1261  }
1262  else if(fld.getType()=="int")
1263  {
1264  int temp = reflector.invokeMethod<int>(t,meth,valus);
1265  Object o;
1266  o << temp;
1267  cquery.propPosVaues[var+1] = o;
1268  }
1269  else if(fld.getType()=="unsigned int")
1270  {
1271  unsigned int temp = reflector.invokeMethod<unsigned int>(t,meth,valus);
1272  Object o;
1273  o << temp;
1274  cquery.propPosVaues[var+1] = o;
1275  }
1276  else if(fld.getType()=="long")
1277  {
1278  long temp = reflector.invokeMethod<long>(t,meth,valus);
1279  Object o;
1280  o << temp;
1281  cquery.propPosVaues[var+1] = o;
1282  }
1283  else if(fld.getType()=="unsigned long")
1284  {
1285  unsigned long temp = reflector.invokeMethod<unsigned long>(t,meth,valus);
1286  Object o;
1287  o << temp;
1288  cquery.propPosVaues[var+1] = o;
1289  }
1290  else if(fld.getType()=="double")
1291  {
1292  double temp = reflector.invokeMethod<double>(t,meth,valus);
1293  Object o;
1294  o << temp;
1295  cquery.propPosVaues[var+1] = o;
1296  }
1297  else if(fld.getType()=="float")
1298  {
1299  float temp = reflector.invokeMethod<float>(t,meth,valus);
1300  Object o;
1301  o << temp;
1302  cquery.propPosVaues[var+1] = o;
1303  }
1304  else if(fld.getType()=="string")
1305  {
1306  string temp = reflector.invokeMethod<string>(t,meth,valus);
1307  Object o;
1308  o << temp;
1309  cquery.propPosVaues[var+1] = o;
1310  }
1311 
1312  query += (columnName+" = ?");
1313  if(var!=cols.size()-1)
1314  {
1315  query += ",";
1316  }
1317  }
1318  }
1319  else
1320  {
1321  fldMap::iterator it;
1322  for(it=fields.begin();it!=fields.end();++it)
1323  {
1324  args argus;
1325  vector<void *> valus;
1326  Field fld = it->second;
1327  string methname = "get"+AfcUtil::camelCased(it->first);
1328  Method meth = clas.getMethod(methname,argus);
1329  if(fld.getType()=="short")
1330  {
1331  short temp = reflector.invokeMethod<short>(t,meth,valus);
1332  Object o;
1333  o << temp;
1334  cquery.propPosVaues[var+1] = o;
1335  }
1336  else if(fld.getType()=="unsigned short")
1337  {
1338  unsigned short temp = reflector.invokeMethod<unsigned short>(t,meth,valus);
1339  Object o;
1340  o << temp;
1341  cquery.propPosVaues[var+1] = o;
1342  }
1343  else if(fld.getType()=="int")
1344  {
1345  int temp = reflector.invokeMethod<int>(t,meth,valus);
1346  Object o;
1347  o << temp;
1348  cquery.propPosVaues[var+1] = o;
1349  }
1350  else if(fld.getType()=="unsigned int")
1351  {
1352  unsigned int temp = reflector.invokeMethod<unsigned int>(t,meth,valus);
1353  Object o;
1354  o << temp;
1355  cquery.propPosVaues[var+1] = o;
1356  }
1357  else if(fld.getType()=="long")
1358  {
1359  long temp = reflector.invokeMethod<long>(t,meth,valus);
1360  Object o;
1361  o << temp;
1362  cquery.propPosVaues[var+1] = o;
1363  }
1364  else if(fld.getType()=="unsigned long")
1365  {
1366  unsigned long temp = reflector.invokeMethod<unsigned long>(t,meth,valus);
1367  Object o;
1368  o << temp;
1369  cquery.propPosVaues[var+1] = o;
1370  }
1371  else if(fld.getType()=="double")
1372  {
1373  double temp = reflector.invokeMethod<double>(t,meth,valus);
1374  Object o;
1375  o << temp;
1376  cquery.propPosVaues[var+1] = o;
1377  }
1378  else if(fld.getType()=="float")
1379  {
1380  float temp = reflector.invokeMethod<float>(t,meth,valus);
1381  Object o;
1382  o << temp;
1383  cquery.propPosVaues[var+1] = o;
1384  }
1385  else if(fld.getType()=="string")
1386  {
1387  string temp = reflector.invokeMethod<string>(t,meth,valus);
1388  Object o;
1389  o << temp;
1390  cquery.propPosVaues[var+1] = o;
1391  }
1392 
1393  query += (it->first+" = ?");
1394  if(var++!=fields.size()-1)
1395  {
1396  query += ",";
1397  }
1398  }
1399  }
1400  cquery.query = query;
1401  //logger << query << flush;
1402 
1403  bool* flag = (bool*)executeQuery(cquery);
1404  bool ffl = *flag;
1405  delete flag;
1406  return ffl;
1407 }
1408 
1409 void* Cibernate::executeQuery(CibernateQuery query)
1410 {
1411  void *vecT = NULL;
1412  bool flagc = allocateStmt(true);
1413  if(!flagc)
1414  {
1415  if(query.isUpdate())
1416  {
1417  bool* flag = new bool(false);
1418  return flag;
1419  }
1420  else
1421  return vecT;
1422  }
1423 
1424  int V_OD_erg;
1425  char V_OD_stat[10];
1426  SQLSMALLINT V_OD_mlen,V_OD_colanz;
1427  SQLINTEGER V_OD_err;
1428  SQLLEN V_OD_rowanz;
1429  SQLCHAR V_OD_msg[200];
1430 
1431  if(query.propPosVaues.size()>0 && query.propNameVaues.size()>0)
1432  {
1433  throw "Cannot mix positional and named parameters";
1434  }
1435 
1436  SQLFreeStmt(V_OD_hstmt, SQL_RESET_PARAMS);
1437  bindQueryParams(query);
1438  if(query.isUpdate())
1439  {
1440  bool* flag = new bool(true);
1441  V_OD_erg = SQLPrepare(V_OD_hstmt,(SQLCHAR*)query.query.c_str(),SQL_NTS);
1442  if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1443  {
1444  *flag = false;
1445  logger << "Error in prepare statement " << V_OD_erg << endl;
1446  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1447  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1448  close();
1449  return flag;
1450  }
1451  V_OD_erg=SQLExecute(V_OD_hstmt);
1452  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1453  {
1454  *flag = false;
1455  logger << "Error in Insert " << V_OD_erg << endl;
1456  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1457  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1458  close();
1459  }
1460  SQLCloseCursor(V_OD_hstmt);
1461  return flag;
1462  }
1463  else
1464  {
1465  V_OD_erg = SQLPrepare(V_OD_hstmt,(SQLCHAR*)query.query.c_str(),SQL_NTS);
1466  if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1467  {
1468  logger << "Error in prepare statement " << V_OD_erg << endl;
1469  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1470  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1471  close();
1472  return vecT;
1473  }
1474  V_OD_erg=SQLExecute(V_OD_hstmt);
1475  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1476  {
1477  logger << "Error in Select " << V_OD_erg << endl;
1478  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1479  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1480  close();
1481  return vecT;
1482  }
1483  V_OD_erg=SQLRowCount(V_OD_hstmt,&V_OD_rowanz);
1484  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1485  {
1486  logger << "Number of RowCount " << V_OD_erg << endl;
1487  close();
1488  return vecT;
1489  }
1490  logger << "Number of Rows " << (int)V_OD_rowanz << endl;
1491  if(query.className!="")
1492  return getElements(query.className);
1493  else
1494  return getElements();
1495  }
1496 }
1497 
1498 
1499 void Cibernate::bindQueryParams(CibernateQuery& query)
1500 {
1501  char V_OD_stat[10];
1502  SQLSMALLINT V_OD_mlen;
1503  SQLINTEGER V_OD_err;
1504  SQLCHAR V_OD_msg[200];
1505  int V_OD_erg;// result of functions
1506  unsigned par = 1;
1507  Parameters qparams = query.propNameVaues;
1508  Parameters columnBindings = query.columnBindings;
1509  PosParameters propPosVaues;
1510  Parameters::iterator ite;
1511  string queryString = query.query;
1512  int posst = 1;
1513  if(qparams.size()>0)
1514  {
1515  PosParameters propPosVaues;
1516  vector<string> tst = RegexUtil::search(queryString, ":");
1517  int counter = tst.size();
1518  while(counter-->0 && queryString.find(":")!=string::npos)
1519  {
1520  for(ite=qparams.begin();ite!=qparams.end();++ite)
1521  {
1522  if(queryString.find(":")!=string::npos && queryString.find(":"+ite->first)!=queryString.find(":"))
1523  {
1524  propPosVaues[posst++] = ite->second;
1525  queryString = queryString.substr(0, queryString.find(":")) + "?" +
1526  queryString.substr(queryString.find(":"+ite->first)+ite->first.length()+1);
1527  }
1528  }
1529  }
1530  query.query = queryString;
1531  }
1532  else
1533  {
1534  propPosVaues = query.propPosVaues;
1535  }
1536 
1537  if(StringUtil::toLowerCopy(query.query).find(" where ")==string::npos && columnBindings.size()>0)
1538  {
1539  query.query += " where ";
1540  int position = 1;
1541  for(ite=columnBindings.begin();ite!=columnBindings.end();++ite)
1542  {
1543  propPosVaues[position] = ite->second;
1544  query.query += (ite->first + " = ? ");
1545  if(position++!=columnBindings.size())
1546  {
1547  query.query += " AND ";
1548  }
1549  }
1550  }
1551 
1552  if(query.orderByDescCols.size()>0 || query.orderByAscCols.size()>0)
1553  {
1554  map<string, bool>::iterator iter;
1555  int position = 1;
1556  for(iter=query.orderByDescCols.begin();iter!=query.orderByDescCols.end();++iter)
1557  {
1558  query.query += (iter->first + " DESC ");
1559  if(position++!=query.orderByDescCols.size())
1560  {
1561  query.query += ",";
1562  }
1563  }
1564  if(query.orderByDescCols.size()>0 && query.orderByAscCols.size()>0)
1565  query.query += ",";
1566 
1567  position = 1;
1568  for(iter=query.orderByAscCols.begin();iter!=query.orderByAscCols.end();++iter)
1569  {
1570  query.query += (iter->first + " ASC ");
1571  if(position++!=query.orderByAscCols.size())
1572  {
1573  query.query += ",";
1574  }
1575  }
1576  }
1577 
1578  logger << query.query << endl;
1579 
1580  int totalParams = propPosVaues.size();
1581  while(totalParams-->0)
1582  {
1583  if(propPosVaues.find(par)==propPosVaues.end())
1584  throw ("No parameter value found for position " + CastUtil::lexical_cast<string>(par));
1585  Object paramValue = propPosVaues[par];
1586  if(paramValue.getTypeName()=="short")
1587  {
1588  V_OD_erg= SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT, SQL_C_SHORT, SQL_SMALLINT, 0, 0, paramValue.getVoidPointer() , 20, NULL);
1589  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1590  {
1591  logger << "Error in binding parameter " << V_OD_erg << endl;
1592  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1593  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1594  close();
1595  }
1596  }
1597  else if(paramValue.getTypeName()=="unsigned short")
1598  {
1599  V_OD_erg= SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT, SQL_C_USHORT, SQL_SMALLINT, 0, 0, paramValue.getVoidPointer() , 20, NULL);
1600  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1601  {
1602  logger << "Error in binding parameter " << V_OD_erg << endl;
1603  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1604  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1605  close();
1606  }
1607  }
1608  else if(paramValue.getTypeName()=="int" || paramValue.getTypeName()=="long")
1609  {
1610  V_OD_erg= SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, paramValue.getVoidPointer() , 20, NULL);
1611  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1612  {
1613  logger << "Error in binding parameter " << V_OD_erg << endl;
1614  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1615  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1616  close();
1617  }
1618  }
1619  else if(paramValue.getTypeName()=="unsigned int" || paramValue.getTypeName()=="unsigned long")
1620  {
1621  V_OD_erg= SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, paramValue.getVoidPointer() , 20, NULL);
1622  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1623  {
1624  logger << "Error in binding parameter " << V_OD_erg << endl;
1625  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1626  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1627  close();
1628  }
1629  }
1630  else if(paramValue.getTypeName()=="double")
1631  {
1632  V_OD_erg= SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, paramValue.getVoidPointer() , 20, NULL);
1633  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1634  {
1635  logger << "Error in binding parameter " << V_OD_erg << endl;
1636  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1637  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1638  close();
1639  }
1640  }
1641  else if(paramValue.getTypeName()=="float")
1642  {
1643  V_OD_erg= SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 0, 0, paramValue.getVoidPointer() , 20, NULL);
1644  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1645  {
1646  logger << "Error in binding parameter " << V_OD_erg << endl;
1647  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1648  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1649  close();
1650  }
1651  }
1652  else if(paramValue.getTypeName()=="std::string")
1653  {
1654  string parm = *(string*)(paramValue.getVoidPointer());
1655  V_OD_erg= SQLBindParameter(V_OD_hstmt, par, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 0, 0, &parm[0] ,parm.length(), NULL);
1656  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
1657  {
1658  logger << "Error in binding parameter " << V_OD_erg << endl;
1659  SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, (SQLCHAR*)V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
1660  logger << V_OD_msg << " (" << (int) V_OD_err << ")" << endl;
1661  close();
1662  }
1663  }
1664  else
1665  throw "Cannot bind value";
1666  par++;
1667  }
1668 }
1669 
1670 vector<map<string, void*> > Cibernate::execute(CibernateQuery query)
1671 {
1672  vector<map<string, void*> > tv;
1673  void* temp = executeQuery(query);
1674  if(temp!=NULL)
1675  {
1676  tv = *(vector<map<string, void*> >*)temp;
1677  delete temp;
1678  }
1679  return tv;
1680 }