basic.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:9k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /****** THIS LINE IS 80 CHARACTERS WIDE - DO *NOT* EXCEED 80 CHARACTERS! ****/
  14. extern "C" {
  15. #include <dba.h>
  16. }
  17. #include "common.hpp"
  18. #include <NdbOut.hpp>
  19. #include <NdbSleep.h>
  20. #include <NdbMain.h>
  21. static const
  22. DBA_ColumnDesc_t EmpColDesc[] = {
  23.   { "emp_no",     DBA_INT,  PCN_SIZE_OF( Employee, EmpNo ),     PCN_TRUE },
  24.   { "first_name", DBA_CHAR, PCN_SIZE_OF( Employee, FirstName ), PCN_FALSE },
  25.   { "last_name",  DBA_CHAR, PCN_SIZE_OF( Employee, LastName ),  PCN_FALSE }
  26. };
  27. static const
  28. DBA_ColumnDesc_t AddColDesc[] = {
  29.   { "emp_no",      DBA_INT,  PCN_SIZE_OF( Address, EmpNo ),      PCN_TRUE },
  30.   { "street_name", DBA_CHAR, PCN_SIZE_OF( Address, StreetName ), PCN_FALSE},
  31.   { "street_no",   DBA_INT,  PCN_SIZE_OF( Address, StreetNo ),   PCN_FALSE},
  32.   { "city",        DBA_CHAR, PCN_SIZE_OF( Address, City ),       PCN_FALSE}
  33. } ;
  34. static const
  35. DBA_ColumnBinding_t EmpBindings[] = {
  36.   DBA_BINDING( "emp_no",     DBA_INT,  Employee, EmpNo ),
  37.   DBA_BINDING( "last_name",  DBA_CHAR, Employee, LastName ),
  38.   DBA_BINDING( "first_name", DBA_CHAR, Employee, FirstName)
  39. };
  40. static const
  41. DBA_ColumnBinding_t AddBindings[] = {
  42.   DBA_BINDING( "emp_no",      DBA_INT,  Address, EmpNo ),
  43.   DBA_BINDING( "street_name", DBA_CHAR, Address, StreetName ),
  44.   DBA_BINDING( "street_no",   DBA_INT,  Address, StreetNo ),  
  45.   DBA_BINDING( "city",        DBA_CHAR, Address, City )
  46. };
  47. static DBA_Binding_t * EmpB;
  48. static DBA_Binding_t * AddB;
  49. static const int Rows = 6;
  50. static
  51. Employee_t EMP_TABLE_DATA[] = {
  52.   { 1242, "Joe",     "Dalton" },
  53.   { 123,  "Lucky",   "Luke" },
  54.   { 456,  "Averell", "Dalton" },
  55.   { 8976, "Gaston",  "Lagaffe" },
  56.   { 1122, "Jolly",   "Jumper" },
  57.   { 3211, "Leffe",   "Pagrotsky" }
  58. };
  59. static
  60. Employee_t EMP_TABLE_DATA_READ[] = {
  61.   { 1242, "", "" },
  62.   { 123,  "", "" },
  63.   { 456,  "", "" },
  64.   { 8976, "", "" },
  65.   { 1122, "", "" },
  66.   { 3211, "", "" }
  67. };
  68. static
  69. Address_t ADD_TABLE_DATA[] = {
  70.   { 1242, "Lonesome Street", 12, "Crime Town" },
  71.   { 123,  "Pistol Road",     13, "Fort Mount" },
  72.   { 456,  "Banking Blv.",    43, "Las Vegas"  },
  73.   { 8976, "ChancylleZee",    54, "Paris" },
  74.   { 1122, "Lucky",          111, "Wild West"  },
  75.   { 3211, "Parlament St.",   11, "Stockholm" }
  76. };
  77. static
  78. Address_t ADD_TABLE_DATA_READ[] = {
  79.   { 1242, "", 0, "" },
  80.   { 123,  "", 0, "" },
  81.   { 456,  "", 0, "" },
  82.   { 8976, "", 0, "" },
  83.   { 1122, "", 0, "" },
  84.   { 3211, "", 0, "" }
  85. };
  86. static const char EMP_TABLE[] = "employees";
  87. static const char ADD_TABLE[] = "addresses";
  88. static const int EmpNbCol = 3;
  89. static const int AddNbCol = 4;
  90. static
  91. void 
  92. DbCreate(void){
  93.   ndbout << "Opening database" << endl;
  94.   require( DBA_Open() == DBA_NO_ERROR );
  95.   
  96.   ndbout << "Creating tables" << endl;
  97.   require( DBA_CreateTable( EMP_TABLE, EmpNbCol, EmpColDesc ) == DBA_NO_ERROR );
  98.   require( DBA_CreateTable( ADD_TABLE, AddNbCol, AddColDesc ) == DBA_NO_ERROR );
  99.   
  100.   ndbout << "Checking for table existance" << endl;
  101.   require( DBA_TableExists( EMP_TABLE ) );
  102.   require( DBA_TableExists( ADD_TABLE ) );
  103. static
  104. void
  105. CreateBindings(void){
  106.   ndbout << "Creating bindings" << endl;
  107.   EmpB = DBA_CreateBinding(EMP_TABLE, 
  108.    EmpNbCol,
  109.    EmpBindings,
  110.    sizeof(Employee_t) );
  111.   require(EmpB != 0);
  112.   AddB = DBA_CreateBinding(ADD_TABLE, 
  113.    AddNbCol,
  114.    AddBindings,
  115.    sizeof(Address_t) );
  116.   require(AddB != 0);
  117. }
  118. extern "C" {
  119.   static void insertCallback( DBA_ReqId_t, DBA_Error_t, DBA_ErrorCode_t );
  120.   static void deleteCallback( DBA_ReqId_t, DBA_Error_t, DBA_ErrorCode_t );
  121.   static void updateCallback( DBA_ReqId_t, DBA_Error_t, DBA_ErrorCode_t );
  122.   static void readCallback  ( DBA_ReqId_t, DBA_Error_t, DBA_ErrorCode_t );
  123.   static void writeCallback ( DBA_ReqId_t, DBA_Error_t, DBA_ErrorCode_t );
  124. }
  125. static
  126. void BasicArray(){
  127.   ndbout << "Testing basic array operations" << endl;
  128.   
  129.   // Basic insert
  130.   DBA_ArrayInsertRows(EmpB, EMP_TABLE_DATA, Rows-2, insertCallback);
  131.   NdbSleep_SecSleep(1);
  132.   DBA_ArrayReadRows(EmpB, EMP_TABLE_DATA_READ, Rows-2, readCallback);
  133.   NdbSleep_SecSleep(1);
  134.   CompareRows(EMP_TABLE_DATA, Rows-2, EMP_TABLE_DATA_READ);
  135.   
  136.   // Basic update
  137.   AlterRows(EMP_TABLE_DATA, Rows-2);
  138.   DBA_ArrayUpdateRows(EmpB, EMP_TABLE_DATA, Rows-2, updateCallback);
  139.   NdbSleep_SecSleep(1);
  140.   DBA_ArrayReadRows(EmpB, EMP_TABLE_DATA_READ, Rows-2, readCallback);
  141.   NdbSleep_SecSleep(1);
  142.   CompareRows(EMP_TABLE_DATA, Rows-2, EMP_TABLE_DATA_READ);
  143.   
  144.   // Basic write
  145.   AlterRows(EMP_TABLE_DATA, Rows);
  146.   DBA_ArrayWriteRows(EmpB, EMP_TABLE_DATA, Rows, writeCallback);
  147.   NdbSleep_SecSleep(1);
  148.   DBA_ArrayReadRows(EmpB, EMP_TABLE_DATA_READ, Rows, readCallback);
  149.   NdbSleep_SecSleep(1);
  150.   CompareRows(EMP_TABLE_DATA, Rows, EMP_TABLE_DATA_READ);
  151.   
  152.   // Basic delete
  153.   DBA_ArrayDeleteRows(EmpB, EMP_TABLE_DATA, Rows, deleteCallback);
  154.   NdbSleep_SecSleep(1);
  155. }
  156. static
  157. void Multi(){
  158.   ndbout << "Testing multi operations" << endl;
  159.   
  160.   const int R2 = Rows + Rows;
  161.   DBA_Binding_t * Bindings[R2];
  162.   void * DATA[R2];
  163.   void * DATA_READ[R2];
  164.   for(int i = 0; i<Rows; i++){
  165.     Bindings[2*i]   = EmpB;
  166.     Bindings[2*i+1] = AddB;
  167.     
  168.     DATA[2*i]   = &EMP_TABLE_DATA[i];
  169.     DATA[2*i+1] = &ADD_TABLE_DATA[i];
  170.     DATA_READ[2*i]   = &EMP_TABLE_DATA_READ[i];
  171.     DATA_READ[2*i+1] = &ADD_TABLE_DATA_READ[i];
  172.   }
  173.   
  174.   // Basic insert
  175.   DBA_MultiInsertRow(Bindings, DATA, R2-4, insertCallback);
  176.   NdbSleep_SecSleep(1);
  177.   DBA_MultiReadRow  (Bindings, DATA_READ, R2-4, readCallback);
  178.   NdbSleep_SecSleep(1);
  179.   CompareRows(EMP_TABLE_DATA, Rows-2, EMP_TABLE_DATA_READ);
  180.   CompareRows(ADD_TABLE_DATA, Rows-2, ADD_TABLE_DATA_READ);
  181.   
  182.   // Basic update
  183.   AlterRows(EMP_TABLE_DATA, Rows-2);
  184.   AlterRows(ADD_TABLE_DATA, Rows-2);
  185.   DBA_MultiUpdateRow(Bindings, DATA, R2-4, updateCallback);
  186.   NdbSleep_SecSleep(1);
  187.   DBA_MultiReadRow  (Bindings, DATA_READ, R2-4, readCallback);
  188.   NdbSleep_SecSleep(1);
  189.   CompareRows(EMP_TABLE_DATA, Rows-2, EMP_TABLE_DATA_READ);
  190.   CompareRows(ADD_TABLE_DATA, Rows-2, ADD_TABLE_DATA_READ);
  191.   
  192.   // Basic write
  193.   AlterRows(EMP_TABLE_DATA, Rows);
  194.   AlterRows(ADD_TABLE_DATA, Rows);
  195.   DBA_MultiWriteRow(Bindings, DATA, R2, writeCallback);
  196.   NdbSleep_SecSleep(1);
  197.   DBA_MultiReadRow (Bindings, DATA_READ, R2, readCallback);
  198.   NdbSleep_SecSleep(1);
  199.   CompareRows(EMP_TABLE_DATA, Rows, EMP_TABLE_DATA_READ);
  200.   CompareRows(ADD_TABLE_DATA, Rows, ADD_TABLE_DATA_READ);
  201.   
  202.   // Basic delete
  203.   DBA_MultiDeleteRow(Bindings, DATA, R2, deleteCallback);
  204.   NdbSleep_SecSleep(1);
  205. }
  206. static
  207. void BasicPtr(){
  208.   ndbout << "Testing array of pointer operations" << endl;
  209.   Employee_t * EmpData[Rows];
  210.   Employee_t * EmpDataRead[Rows];
  211.   for(int i = 0; i<Rows; i++){
  212.     EmpData[i]     = &EMP_TABLE_DATA[i];
  213.     EmpDataRead[i] = &EMP_TABLE_DATA_READ[i];
  214.   }
  215.     
  216.   void * const * EMP_TABLE_DATA2      = (void * const *)EmpData;
  217.   void * const * EMP_TABLE_DATA_READ2 = (void * const *)EmpDataRead;
  218.     
  219.   // Basic insert
  220.   DBA_InsertRows(EmpB, EMP_TABLE_DATA2, Rows-2, insertCallback);
  221.   NdbSleep_SecSleep(1);
  222.   DBA_ReadRows  (EmpB, EMP_TABLE_DATA_READ2, Rows-2, readCallback);
  223.   NdbSleep_SecSleep(1);
  224.   CompareRows(EMP_TABLE_DATA, Rows-2, EMP_TABLE_DATA_READ);
  225.     
  226.   // Basic update
  227.   AlterRows(EMP_TABLE_DATA, Rows-2);
  228.   DBA_UpdateRows(EmpB, EMP_TABLE_DATA2, Rows-2, updateCallback);
  229.   NdbSleep_SecSleep(1);
  230.   DBA_ReadRows  (EmpB, EMP_TABLE_DATA_READ2, Rows-2, readCallback);
  231.   NdbSleep_SecSleep(1);
  232.   CompareRows(EMP_TABLE_DATA, Rows-2, EMP_TABLE_DATA_READ);
  233.     
  234.     // Basic write
  235.   AlterRows  (EMP_TABLE_DATA, Rows);
  236.   DBA_WriteRows(EmpB, EMP_TABLE_DATA2, Rows, writeCallback);
  237.   NdbSleep_SecSleep(1);
  238.   DBA_ReadRows (EmpB, EMP_TABLE_DATA_READ2, Rows, readCallback);
  239.   NdbSleep_SecSleep(1);
  240.   CompareRows(EMP_TABLE_DATA, Rows, EMP_TABLE_DATA_READ);
  241.     
  242.     // Basic delete
  243.   DBA_DeleteRows(EmpB, EMP_TABLE_DATA2, Rows, deleteCallback);
  244.   NdbSleep_SecSleep(1);
  245. }
  246. /*---------------------------------------------------------------------------*/
  247. NDB_COMMAND(newton_basic, "newton_basic", 
  248.     "newton_basic", "newton_basic", 65535){
  249.   DbCreate();
  250.   CreateBindings();
  251.   BasicArray();
  252.   BasicPtr();
  253.   Multi();
  254.   
  255.   DBA_Close();
  256.   return 0;
  257. }
  258. /**
  259.  *  callbackStatusCheck  checks whether or not the operation succeeded
  260.  */
  261. void
  262. callbackStatusCheck( DBA_Error_t status, const char* operation) {
  263.   ndbout_c("%s: %d", operation, status);
  264. }
  265. void insertCallback( DBA_ReqId_t, DBA_Error_t s, DBA_ErrorCode_t ){
  266.   callbackStatusCheck(s, "insert");
  267. }
  268. void deleteCallback( DBA_ReqId_t, DBA_Error_t s, DBA_ErrorCode_t ){
  269.   callbackStatusCheck(s, "delete");
  270. }
  271. void updateCallback( DBA_ReqId_t, DBA_Error_t s, DBA_ErrorCode_t ){
  272.   callbackStatusCheck(s, "update");
  273. }
  274. void readCallback  ( DBA_ReqId_t, DBA_Error_t s, DBA_ErrorCode_t ){
  275.   callbackStatusCheck(s, "read");
  276. }
  277. void writeCallback  ( DBA_ReqId_t, DBA_Error_t s, DBA_ErrorCode_t ){
  278.   callbackStatusCheck(s, "write");
  279. }