InfiniSQL  v0.1.2-alpha
Massive Scale Transaction Processing
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
api.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Mark Travis <mtravis15432+src@gmail.com>
3  * All rights reserved. No warranty, explicit or implicit, provided.
4  *
5  * This file is part of InfiniSQL(tm).
6 
7  * InfiniSQL is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 3
9  * as published by the Free Software Foundation.
10  *
11  * InfiniSQL is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with InfiniSQL. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
30 #include "gch.h"
31 #include "Transaction.h"
32 #include "infinisql.h"
33 #include "Asts.h"
34 #line 35 "api.cc"
35 
37 {
38  msgpack::unpacked msg;
39  msgpack::unpack(&msg, taPtr->args, taPtr->argsize);
40  msgpack::object obj = msg.get();
41  obj.convert(&inputVector);
42 }
43 
45 {
46  transactionPtr = new class Transaction(taPtr, domainid);
47 }
48 
50 {
52  d(this);
53 }
54 
56 {
58 }
59 
60 // ok the real functions
61 void ApiInterface::insertRow(apifPtr re, int64_t recmd, void *reptr,
62  int64_t tableid)
63 {
64  setReEntry(re, recmd, reptr);
65 
67  {
69  return;
70  }
71 
72  uuRecord_s uur = { -1, -1, -1 };
73  transactionPtr->returnNewRow = uur; // why this here?
80 
81  indexInfo_s blankIdxInfo = {};
83  (transactionPtr->currentCmdState.tablePtr->fields.size(), blankIdxInfo);
84  indexEntry_s blankIdxEntry = {};
86  (transactionPtr->currentCmdState.tablePtr->fields.size(), blankIdxEntry);
87 
88  for (size_t n=0; n<transactionPtr->currentCmdState.tablePtr->fields.size();
89  n++)
90  {
92  {
94  return;
95  }
96 
97  if (transactionPtr->currentCmdState.tablePtr->fields[n].indextype != NONE)
98  {
106  }
107  else
108  {
109  transactionPtr->currentCmdState.indexEntries[n].engineid = -1;
110  }
111 
114  }
115 
118 
120  {
122  return;
123  }
124 
125  // now, prepare message for Engine, which expects:
126  // transaction_enginecmd NEWROW, transaction_messageStruct.payloadtype
127  // SUBTRANSACTIONCMDPAYLOAD
128  // reentrypoint 1
129  // tableid, row
130  // expects in return: rowid
131  class MessageSubtransactionCmd *msg = new class MessageSubtransactionCmd();
132  class MessageSubtransactionCmd &msgref = *msg;
133  msgref.subtransactionStruct.tableid=tableid;
134 
136  makerow(&transactionPtr->fieldValues, &msgref.row)==false)
137  {
139  delete msg;
140  return;
141  }
142 
143  vector<fieldValue_s> f;
148  (void *)msg);
149 }
150 
151 void ApiInterface::deleteRow(apifPtr re, int64_t recmd, void *reptr,
152  uuRecord_s &uur)
153 {
154  setReEntry(re, recmd, reptr);
155 
156  if (!transactionPtr->stagedRows.count(uur))
157  {
159  return;
160  }
161 
162  if (transactionPtr->stagedRows[uur].locktype != WRITELOCK ||
163  transactionPtr->stagedRows[uur].cmd != NOCOMMAND ||
165  {
167  return;
168  }
169 
173 
175 
176  // tableid,rowid,DELETEROW,SUBTRANSACTIONCMDPAYLOAD, returns status
177  class MessageSubtransactionCmd *msg = new class MessageSubtransactionCmd();
178  class MessageSubtransactionCmd &msgref = *msg;
179  msgref.subtransactionStruct.rowid =
185  (void *)msg);
186 }
187 
188 void ApiInterface::replaceRow(apifPtr re, int64_t recmd, void *reptr)
189 {
190  setReEntry(re, recmd, reptr);
191 
193  {
195  return;
196  }
197 
200 }
201 
202 void ApiInterface::fetchRows(apifPtr re, int64_t recmd, void *reptr)
203 {
204  setReEntry(re, recmd, reptr);
205 
207  {
209  return;
210  }
211 
214 }
215 
216 void ApiInterface::unlock(apifPtr re, int64_t recmd, void *reptr, int64_t rowid,
217  int64_t tableid, int64_t engineid)
218 {
219  setReEntry(re, recmd, reptr);
220 
222  {
224  return;
225  }
226 
229 }
230 
231 void ApiInterface::commit(apifPtr re, int64_t recmd, void *reptr)
232 {
233  setReEntry(re, recmd, reptr);
234 
236  {
238  return;
239  }
240 
242 }
243 
244 void ApiInterface::rollback(apifPtr re, int64_t recmd, void *reptr)
245 {
246  setReEntry(re, recmd, reptr);
247 
249  {
251  return;
252  }
253 
255 }
256 
257 void ApiInterface::rollback(apifPtr re, int64_t recmd, void *reptr,
258  uuRecord_s &uur)
259 {
260  setReEntry(re, recmd, reptr);
261 
263  {
265  return;
266  }
267 
268  transactionPtr->rollback(uur);
269 }
270 
271 void ApiInterface::revert(apifPtr re, int64_t recmd, void *reptr, uuRecord_s &uur)
272 {
273  setReEntry(re, recmd, reptr);
274 
276  {
278  return;
279  }
280 
281  transactionPtr->revert(uur);
282 }
283 
284 // for isnull and isnotnull and selectall only
285 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
286  int64_t tableid, int64_t fieldid,
287  locktype_e locktype, operatortypes_e op)
288 {
289  setReEntry(re, recmd, reptr);
290 
291  if ((op != OPERATOR_ISNULL) && (op != OPERATOR_ISNOTNULL) &&
292  (op != OPERATOR_SELECTALL))
293  {
295  return;
296  }
297 
299  searchParameters.op = op;
300  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
301 }
302 
303 // eq,neq,gt,lt,gte,lte,regex
304 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
305  int64_t tableid, int64_t fieldid,
306  locktype_e locktype, operatortypes_e op,
307  int64_t input)
308 {
309  setReEntry(re, recmd, reptr);
311  searchParameters.op = op;
312  fieldValue_s fieldVal = {};
313  fieldVal.value.integer = input;
314  searchParameters.values.push_back(fieldVal);
315  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
316 }
317 
318 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
319  int64_t tableid, int64_t fieldid,
320  locktype_e locktype, operatortypes_e op,
321  uint64_t input)
322 {
323  setReEntry(re, recmd, reptr);
325  searchParameters.op = op;
326  fieldValue_s fieldVal = {};
327  fieldVal.value.uinteger = input;
328  searchParameters.values.push_back(fieldVal);
329  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
330 }
331 
332 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
333  int64_t tableid, int64_t fieldid,
334  locktype_e locktype, operatortypes_e op,
335  bool input)
336 {
337  setReEntry(re, recmd, reptr);
339  searchParameters.op = op;
340  fieldValue_s fieldVal = {};
341  fieldVal.value.boolean = input;
342  searchParameters.values.push_back(fieldVal);
343  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
344 }
345 
346 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
347  int64_t tableid, int64_t fieldid,
348  locktype_e locktype, operatortypes_e op,
349  long double input)
350 {
351  setReEntry(re, recmd, reptr);
353  searchParameters.op = op;
354  fieldValue_s fieldVal = {};
355  fieldVal.value.floating = input;
356  searchParameters.values.push_back(fieldVal);
357  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
358 }
359 
360 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
361  int64_t tableid, int64_t fieldid,
362  locktype_e locktype, operatortypes_e op,
363  char input)
364 {
365  setReEntry(re, recmd, reptr);
367  searchParameters.op = op;
368  fieldValue_s fieldVal = {};
369  fieldVal.value.character = input;
370  searchParameters.values.push_back(fieldVal);
371  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
372 }
373 
374 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
375  int64_t tableid, int64_t fieldid,
376  locktype_e locktype, operatortypes_e op,
377  string *input)
378 {
379  setReEntry(re, recmd, reptr);
381  searchParameters.op = op;
382 
383  if (op == OPERATOR_REGEX)
384  {
385  searchParameters.regexString = *input;
386  }
387  else
388  {
389  fieldValue_s fieldVal = {};
390  fieldVal.str = *input;
391  searchParameters.values.push_back(fieldVal);
392  }
393 
394  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
395 }
396 
397 // in
398 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
399  int64_t tableid, int64_t fieldid,
400  locktype_e locktype, operatortypes_e op,
401  vector<int64_t> *input)
402 {
403  setReEntry(re, recmd, reptr);
405  searchParameters.op = op;
406 
407  fieldValue_s blankFieldVal = {};
409  searchParameters.values.reserve(input->size());
410 
411  for (size_t n=0; n<input->size(); n++)
412  {
413  fieldVal = blankFieldVal;
414  fieldVal.value.integer = input->at(n);
415  searchParameters.values[n] = fieldVal;
416  }
417 
418  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
419 }
420 
421 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
422  int64_t tableid, int64_t fieldid,
423  locktype_e locktype, operatortypes_e op,
424  vector<uint64_t> *input)
425 {
426  setReEntry(re, recmd, reptr);
428  searchParameters.op = op;
429 
430  fieldValue_s blankFieldVal = {};
432  searchParameters.values.reserve(input->size());
433 
434  for (size_t n=0; n<input->size(); n++)
435  {
436  fieldVal = blankFieldVal;
437  fieldVal.value.uinteger = input->at(n);
438  searchParameters.values[n] = fieldVal;
439  }
440 
441  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
442 }
443 
444 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
445  int64_t tableid, int64_t fieldid,
446  locktype_e locktype, operatortypes_e op,
447  vector<bool> *input)
448 {
449  setReEntry(re, recmd, reptr);
451  searchParameters.op = op;
452 
453  fieldValue_s blankFieldVal = {};
455  searchParameters.values.reserve(input->size());
456 
457  for (size_t n=0; n<input->size(); n++)
458  {
459  fieldVal = blankFieldVal;
460  fieldVal.value.boolean = input->at(n);
461  searchParameters.values[n] = fieldVal;
462  }
463 
464  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
465 }
466 
467 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
468  int64_t tableid, int64_t fieldid,
469  locktype_e locktype, operatortypes_e op,
470  vector<long double> *input)
471 {
472  setReEntry(re, recmd, reptr);
474  searchParameters.op = op;
475 
476  fieldValue_s blankFieldVal = {};
478  searchParameters.values.reserve(input->size());
479 
480  for (size_t n=0; n<input->size(); n++)
481  {
482  fieldVal = blankFieldVal;
483  fieldVal.value.floating = input->at(n);
484  searchParameters.values[n] = fieldVal;
485  }
486 
487  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
488 }
489 
490 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
491  int64_t tableid, int64_t fieldid,
492  locktype_e locktype, operatortypes_e op,
493  vector<char> *input)
494 {
495  setReEntry(re, recmd, reptr);
497  searchParameters.op = op;
498 
499  fieldValue_s blankFieldVal = {};
501  searchParameters.values.reserve(input->size());
502 
503  for (size_t n=0; n<input->size(); n++)
504  {
505  fieldVal = blankFieldVal;
506  fieldVal.value.character = input->at(n);
507  searchParameters.values[n] = fieldVal;
508  }
509 
510  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
511 }
512 
513 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
514  int64_t tableid, int64_t fieldid,
515  locktype_e locktype, operatortypes_e op,
516  vector<string> *input)
517 {
518  setReEntry(re, recmd, reptr);
520  searchParameters.op = op;
521 
522  fieldValue_s blankFieldVal = {};
524  searchParameters.values.reserve(input->size());
525 
526  for (size_t n=0; n<input->size(); n++)
527  {
528  fieldVal = blankFieldVal;
529  fieldVal.str = input->at(n);
530  searchParameters.values[n] = fieldVal;
531  }
532 
533  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
534 }
535 
536 // between
537 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
538  int64_t tableid, int64_t fieldid,
539  locktype_e locktype, operatortypes_e op,
540  int64_t lower, int64_t upper)
541 {
542  setReEntry(re, recmd, reptr);
544  searchParameters.op = op;
545  searchParameters.values.reserve(2);
546  fieldValue_s fieldVal = {};
547  fieldVal.value.integer = lower;
548  searchParameters.values[0] = fieldVal;
549  fieldVal.value.integer = upper;
550  searchParameters.values[1] = fieldVal;
551  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
552 }
553 
554 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
555  int64_t tableid, int64_t fieldid,
556  locktype_e locktype, operatortypes_e op,
557  uint64_t lower, uint64_t upper)
558 {
559  setReEntry(re, recmd, reptr);
561  searchParameters.op = op;
562  searchParameters.values.reserve(2);
563  fieldValue_s fieldVal = {};
564  fieldVal.value.uinteger = lower;
565  searchParameters.values[0] = fieldVal;
566  fieldVal.value.uinteger = upper;
567  searchParameters.values[1] = fieldVal;
568  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
569 }
570 
571 // between bools makes no sense, but whatever
572 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
573  int64_t tableid, int64_t fieldid,
574  locktype_e locktype, operatortypes_e op,
575  bool lower, bool upper)
576 {
577  setReEntry(re, recmd, reptr);
579  searchParameters.op = op;
580  searchParameters.values.reserve(2);
581  fieldValue_s fieldVal = {};
582  fieldVal.value.boolean = lower;
583  searchParameters.values[0] = fieldVal;
584  fieldVal.value.boolean = upper;
585  searchParameters.values[1] = fieldVal;
586  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
587 }
588 
589 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
590  int64_t tableid, int64_t fieldid,
591  locktype_e locktype, operatortypes_e op,
592  long double lower, long double upper)
593 {
594  setReEntry(re, recmd, reptr);
596  searchParameters.op = op;
597  searchParameters.values.reserve(2);
598  fieldValue_s fieldVal = {};
599  fieldVal.value.floating = lower;
600  searchParameters.values[0] = fieldVal;
601  fieldVal.value.floating = upper;
602  searchParameters.values[1] = fieldVal;
603  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
604 }
605 
606 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
607  int64_t tableid, int64_t fieldid,
608  locktype_e locktype, operatortypes_e op,
609  char lower, char upper)
610 {
611  setReEntry(re, recmd, reptr);
613  searchParameters.op = op;
614  searchParameters.values.reserve(2);
615  fieldValue_s fieldVal = {};
616  fieldVal.value.character = lower;
617  searchParameters.values[0] = fieldVal;
618  fieldVal.value.character = upper;
619  searchParameters.values[1] = fieldVal;
620  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
621 }
622 
623 void ApiInterface::selectRows(apifPtr re, int64_t recmd, void *reptr,
624  int64_t tableid, int64_t fieldid,
625  locktype_e locktype, operatortypes_e op,
626  string *lower, string *upper)
627 {
628  setReEntry(re, recmd, reptr);
630  searchParameters.op = op;
631  searchParameters.values.reserve(2);
632  fieldValue_s fieldVal = {};
633  fieldVal.str = *lower;
634  searchParameters.values[0] = fieldVal;
635  fieldVal.str = *upper;
636  searchParameters.values[1] = fieldVal;
637  transactionPtr->select(tableid, fieldid, locktype, &searchParameters);
638 }
639 
640 void ApiInterface::sendResponse(int64_t resultCode, vector<string> *v)
641 {
642  taPtr->sockfd = sockfd;
643  taPtr->sendResponse(false, resultCode, v);
644 }
645 
646 bool ApiInterface::unmakerow(int64_t tableid, string *rowstring,
647  vector<fieldValue_s> *resultFields)
648 {
649  return transactionPtr->schemaPtr->tables[tableid]->unmakerow(rowstring,
650  resultFields);
651 }
652 
653 void ApiInterface::updateRow(apifPtr re, int64_t recmd, void *reptr,
654  uuRecord_s &uur)
655 {
656  setReEntry(re, recmd, reptr);
659  // uses Transaction::fieldsToUpdate map
661 }
662 void ApiInterface::updateRowNullField(apifPtr re, int64_t recmd, void *reptr,
663  uuRecord_s &uur, int64_t fieldid)
664 {
665  setReEntry(re, recmd, reptr);
670 
672 }
673 void ApiInterface::updateRow(apifPtr re, int64_t recmd, void *reptr,
674  uuRecord_s &uur, int64_t fieldid, int64_t input)
675 {
676  setReEntry(re, recmd, reptr);
682 
684 }
685 void ApiInterface::updateRow(apifPtr re, int64_t recmd, void *reptr,
686  uuRecord_s &uur, int64_t fieldid, uint64_t input)
687 {
688  setReEntry(re, recmd, reptr);
694 
696 }
697 void ApiInterface::updateRow(apifPtr re, int64_t recmd, void *reptr,
698  uuRecord_s &uur, int64_t fieldid, bool input)
699 {
700  setReEntry(re, recmd, reptr);
706 
708 }
709 void ApiInterface::updateRow(apifPtr re, int64_t recmd, void *reptr,
710  uuRecord_s &uur, int64_t fieldid, long double input)
711 {
712  setReEntry(re, recmd, reptr);
718 
720 }
721 void ApiInterface::updateRow(apifPtr re, int64_t recmd, void *reptr,
722  uuRecord_s &uur, int64_t fieldid, char input)
723 {
724  setReEntry(re, recmd, reptr);
730 
732 }
733 void ApiInterface::updateRow(apifPtr re, int64_t recmd, void *reptr,
734  uuRecord_s &uur, int64_t fieldid, string input)
735 {
736  setReEntry(re, recmd, reptr);
742 
744 }
745 
746 void ApiInterface::prepareResponseVector(int64_t resultCode)
747 {
748  response.resultCode = resultCode;
749  msgpack::sbuffer *sbuf = new msgpack::sbuffer;
750  msgpack::pack(*sbuf, responseVector);
751  response.sbuf = sbuf;
752 }
753 
754 void ApiInterface::setReEntry(apifPtr re, int64_t recmd, void *reptr)
755 {
758  transactionPtr->reentryCmd = recmd;
759  transactionPtr->reentryState = reptr;
760 }
761 
763 {
765 }
766 
768 {
770 }
771 
772 void ApiInterface::addFieldToRow(uint64_t val)
773 {
775 }
776 
778 {
780 }
781 
782 void ApiInterface::addFieldToRow(long double val)
783 {
785 }
786 
788 {
790 }
791 
793 {
795 }
796 
797 bool ApiInterface::execStatement(const char *stmtname, Statement *stmtPtr,
798  apifPtr reentryfunction, int64_t reentrypoint,
799  void *reentrydata)
800 {
801  return execStatement(stmtname, stmtPtr->queries[0].storedProcedureArgs,
802  reentryfunction, reentrypoint, reentrydata);
803 }
804 
805 bool ApiInterface::execStatement(const char *stmtname, vector<string> &args,
806  apifPtr reentryfunction, int64_t reentrypoint,
807  void *reentrydata)
808 {
809  if (!taPtr->statements[domainid].count(string(stmtname)))
810  {
811  return false;
812  }
813  class Statement *stmt = new class Statement;
814  *stmt=taPtr->statements[domainid][string(stmtname)];
815  stmt->execute(this, reentryfunction, reentrypoint, reentrydata,
816  transactionPtr, args);
817  return true;
818 }
819 
821 {
822  return transactionPtr->resultCode;
823 }
824 
826 {
827  delete transactionPtr;
828 }
829 
831 {
832  delete pgPtr->statementPtr;
833 }
834 
836  vector<string> &argsRef)
837 {
838  argsRef=stmtPtr->queries[0].storedProcedureArgs;
839 }
840 
841 size_t hash_value(uuRecord_s const &uur)
842 {
843  std::size_t seed = 0;
844  boost::hash_combine(seed, uur.rowid);
845  boost::hash_combine(seed, uur.tableid);
846  boost::hash_combine(seed, uur.engineid);
847 
848  return seed;
849 }
850 
851 bool operator==(uuRecord_s const &uur1, uuRecord_s const &uur2)
852 {
853  return (uur1.rowid==uur2.rowid) && (uur1.tableid==uur2.tableid) &&
854  (uur1.engineid==uur2.engineid);
855 }