Sophie

Sophie

distrib > Mandriva > 2008.1 > x86_64 > media > main-testing > by-pkgid > 91128064e1b251eab84e1c0e3ea0dd7a > files > 192

lib64mysql-devel-5.0.51a-8mdv2008.1.x86_64.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>ndbapi_scan.cpp</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.5 -->
<div class="contents">
<h1><a class="anchor" name="ndbapi_scan.cpp">ndbapi_scan.cpp </a></h1><div class="fragment"><pre class="fragment">
<span class="comment">/* Copyright (C) 2003 MySQL AB</span>
<span class="comment"></span>
<span class="comment">   This program is free software; you can redistribute it and/or modify</span>
<span class="comment">   it under the terms of the GNU General Public License as published by</span>
<span class="comment">   the Free Software Foundation; version 2 of the License.</span>
<span class="comment"></span>
<span class="comment">   This program is distributed in the hope that it will be useful,</span>
<span class="comment">   but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="comment">   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<span class="comment">   GNU General Public License for more details.</span>
<span class="comment"></span>
<span class="comment">   You should have received a copy of the GNU General Public License</span>
<span class="comment">   along with this program; if not, write to the Free Software</span>
<span class="comment">   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */</span>


<span class="comment">/*</span>
<span class="comment"> * ndbapi_scan.cpp: </span>
<span class="comment"> * Illustrates how to use the scan api in the NDBAPI.</span>
<span class="comment"> * The example shows how to do scan, scan for update and scan for delete</span>
<span class="comment"> * using NdbScanFilter and NdbScanOperation</span>
<span class="comment"> *</span>
<span class="comment"> * Classes and methods used in this example:</span>
<span class="comment"> *</span>
<span class="comment"> *  Ndb_cluster_connection</span>
<span class="comment"> *       connect()</span>
<span class="comment"> *       wait_until_ready()</span>
<span class="comment"> *</span>
<span class="comment"> *  Ndb</span>
<span class="comment"> *       init()</span>
<span class="comment"> *       getDictionary()</span>
<span class="comment"> *       startTransaction()</span>
<span class="comment"> *       closeTransaction()</span>
<span class="comment"> *</span>
<span class="comment"> *  NdbTransaction</span>
<span class="comment"> *       getNdbScanOperation()</span>
<span class="comment"> *       execute()</span>
<span class="comment"> *</span>
<span class="comment"> *  NdbScanOperation</span>
<span class="comment"> *       getValue() </span>
<span class="comment"> *       readTuples()</span>
<span class="comment"> *       nextResult()</span>
<span class="comment"> *       deleteCurrentTuple()</span>
<span class="comment"> *       updateCurrentTuple()</span>
<span class="comment"> *</span>
<span class="comment"> *  const NdbDictionary::Dictionary</span>
<span class="comment"> *       getTable()</span>
<span class="comment"> *</span>
<span class="comment"> *  const NdbDictionary::Table</span>
<span class="comment"> *       getColumn()</span>
<span class="comment"> *</span>
<span class="comment"> *  const NdbDictionary::Column</span>
<span class="comment"> *       getLength()</span>
<span class="comment"> *</span>
<span class="comment"> *  NdbOperation</span>
<span class="comment"> *       insertTuple()</span>
<span class="comment"> *       equal()</span>
<span class="comment"> *       setValue()</span>
<span class="comment"> *</span>
<span class="comment"> *  NdbScanFilter</span>
<span class="comment"> *       begin()</span>
<span class="comment"> *   eq()</span>
<span class="comment"> *   end()</span>
<span class="comment"> *</span>
<span class="comment"> */</span>


<span class="preprocessor">#include &lt;mysql.h&gt;</span>
<span class="preprocessor">#include &lt;mysqld_error.h&gt;</span>
<span class="preprocessor">#include &lt;NdbApi.hpp&gt;</span>
<span class="comment">// Used for cout</span>
<span class="preprocessor">#include &lt;iostream&gt;</span>
<span class="preprocessor">#include &lt;stdio.h&gt;</span>

<span class="keyword">static</span> <span class="keywordtype">void</span>
milliSleep(<span class="keywordtype">int</span> milliseconds){
  <span class="keyword">struct </span>timeval sleeptime;
  sleeptime.tv_sec = milliseconds / 1000;
  sleeptime.tv_usec = (milliseconds - (sleeptime.tv_sec * 1000)) * 1000000;
  select(0, 0, 0, 0, &amp;sleeptime);
}


<span class="preprocessor">#define PRINT_ERROR(code,msg) \</span>
<span class="preprocessor">  std::cout &lt;&lt; "Error in " &lt;&lt; __FILE__ &lt;&lt; ", line: " &lt;&lt; __LINE__ \</span>
<span class="preprocessor">            &lt;&lt; ", code: " &lt;&lt; code \</span>
<span class="preprocessor">            &lt;&lt; ", msg: " &lt;&lt; msg &lt;&lt; "." &lt;&lt; std::endl</span>
<span class="preprocessor"></span><span class="preprocessor">#define MYSQLERROR(mysql) { \</span>
<span class="preprocessor">  PRINT_ERROR(mysql_errno(&amp;mysql),mysql_error(&amp;mysql)); \</span>
<span class="preprocessor">  exit(-1); }</span>
<span class="preprocessor"></span><span class="preprocessor">#define APIERROR(error) { \</span>
<span class="preprocessor">  PRINT_ERROR(error.code,error.message); \</span>
<span class="preprocessor">  exit(-1); }</span>
<span class="preprocessor"></span>
<span class="keyword">struct </span>Car 
{
  Car() { memset(<span class="keyword">this</span>, 0, <span class="keyword">sizeof</span>(* <span class="keyword">this</span>)); }
  
  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> reg_no;
  <span class="keywordtype">char</span> brand[20];
  <span class="keywordtype">char</span> color[20];
};

<span class="keywordtype">int</span> create_table(MYSQL &amp;mysql) 
{
  <span class="keywordflow">while</span> (mysql_query(&amp;mysql, 
      <span class="stringliteral">"CREATE TABLE"</span>
      <span class="stringliteral">"  GARAGE"</span>
      <span class="stringliteral">"    (REG_NO INT UNSIGNED NOT NULL,"</span>
      <span class="stringliteral">"     BRAND CHAR(20) NOT NULL,"</span>
      <span class="stringliteral">"     COLOR CHAR(20) NOT NULL,"</span>
      <span class="stringliteral">"     PRIMARY KEY USING HASH (REG_NO))"</span>
      <span class="stringliteral">"  ENGINE=NDB"</span>))
  {
    <span class="keywordflow">if</span> (mysql_errno(&amp;mysql) != ER_TABLE_EXISTS_ERROR)
      MYSQLERROR(mysql);
    std::cout &lt;&lt; <span class="stringliteral">"MySQL Cluster already has example table: GARAGE. "</span>
        &lt;&lt; <span class="stringliteral">"Dropping it..."</span> &lt;&lt; std::endl; 
    <span class="comment">/**************</span>
<span class="comment">     * Drop table *</span>
<span class="comment">     **************/</span>
    <span class="keywordflow">if</span> (mysql_query(&amp;mysql, <span class="stringliteral">"DROP TABLE GARAGE"</span>))
      MYSQLERROR(mysql);
  }
  <span class="keywordflow">return</span> 1;
}


<span class="keywordtype">int</span> populate(<a class="code" href="classNdb.html" title="Represents the NDB kernel and is the main class of the NDB API.">Ndb</a> * myNdb)
{
  <span class="keywordtype">int</span> i;
  Car cars[15];

  <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Dictionary.html" title="Dictionary for defining and retreiving meta data.">NdbDictionary::Dictionary</a>* myDict= myNdb-&gt;<a class="code" href="classNdb.html#f27ca0f4e5c074211252a7c83060a3a4">getDictionary</a>();
  <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Table.html" title="Represents a table in NDB Cluster.">NdbDictionary::Table</a> *myTable= myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#1a30b1bb5fa164113cb839eed64eb3b6">getTable</a>(<span class="stringliteral">"GARAGE"</span>);

  <span class="keywordflow">if</span> (myTable == NULL) 
    APIERROR(myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#0af68ea9b273172b46528ee1bd806f71">getNdbError</a>());

  <span class="keywordflow">for</span> (i = 0; i &lt; 5; i++)
  {
    cars[i].reg_no = i;
    sprintf(cars[i].brand, <span class="stringliteral">"Mercedes"</span>);
    sprintf(cars[i].color, <span class="stringliteral">"Blue"</span>);
  }

  <span class="keywordflow">for</span> (i = 5; i &lt; 10; i++)
  {
    cars[i].reg_no = i;
    sprintf(cars[i].brand, <span class="stringliteral">"BMW"</span>);
    sprintf(cars[i].color, <span class="stringliteral">"Black"</span>);
  }

  <span class="keywordflow">for</span> (i = 10; i &lt; 15; i++)
  {
    cars[i].reg_no = i;
    sprintf(cars[i].brand, <span class="stringliteral">"Toyota"</span>);
    sprintf(cars[i].color, <span class="stringliteral">"Pink"</span>);
  }
  
  <a class="code" href="classNdbTransaction.html" title="Represents a transaction.">NdbTransaction</a>* myTrans = myNdb-&gt;<a class="code" href="classNdb.html#7e34bb5d8e3d878a54ebb7c0e6d0c5f1">startTransaction</a>();
  <span class="keywordflow">if</span> (myTrans == NULL)
    APIERROR(myNdb-&gt;<a class="code" href="classNdb.html#80b53a037bb2e93b3cd6830eda58643a">getNdbError</a>());

  <span class="keywordflow">for</span> (i = 0; i &lt; 15; i++) 
  {
    <a class="code" href="classNdbOperation.html" title="Class of operations for use in transactions.">NdbOperation</a>* myNdbOperation = myTrans-&gt;<a class="code" href="classNdbTransaction.html#2aeb211e54f84bd2de6cfb8fccec8166">getNdbOperation</a>(myTable);
    <span class="keywordflow">if</span> (myNdbOperation == NULL) 
      APIERROR(myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>());
    myNdbOperation-&gt;<a class="code" href="classNdbOperation.html#1e06cf9bb1ce1c5357004c32b1e89b15">insertTuple</a>();
    myNdbOperation-&gt;<a class="code" href="classNdbOperation.html#2839b64df3a181f6023fb36a9fe8ab74">equal</a>(<span class="stringliteral">"REG_NO"</span>, cars[i].reg_no);
    myNdbOperation-&gt;<a class="code" href="classNdbOperation.html#e6fd36220eca78873d1d9b59539ab192">setValue</a>(<span class="stringliteral">"BRAND"</span>, cars[i].brand);
    myNdbOperation-&gt;<a class="code" href="classNdbOperation.html#e6fd36220eca78873d1d9b59539ab192">setValue</a>(<span class="stringliteral">"COLOR"</span>, cars[i].color);
  }

  <span class="keywordtype">int</span> check = myTrans-&gt;<a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ecaba2931e541dd138044b61f38918391" title="Execute and try to commit the transaction.">NdbTransaction::Commit</a>);

  myTrans-&gt;<a class="code" href="classNdbTransaction.html#967f0c6f7c920cfa1140f005144a3a91">close</a>();

  <span class="keywordflow">return</span> check != -1;
}

<span class="keywordtype">int</span> scan_delete(<a class="code" href="classNdb.html" title="Represents the NDB kernel and is the main class of the NDB API.">Ndb</a>* myNdb, 
    <span class="keywordtype">int</span> column,
    <span class="keyword">const</span> <span class="keywordtype">char</span> * color)
  
{
  
  <span class="comment">// Scan all records exclusive and delete </span>
  <span class="comment">// them one by one</span>
  <span class="keywordtype">int</span>                  retryAttempt = 0;
  <span class="keyword">const</span> <span class="keywordtype">int</span>            retryMax = 10;
  <span class="keywordtype">int</span> deletedRows = 0;
  <span class="keywordtype">int</span> check;
  <a class="code" href="structNdbError.html" title="Contains error information.">NdbError</a>              err;
  <a class="code" href="classNdbTransaction.html" title="Represents a transaction.">NdbTransaction</a>  *myTrans;
  <a class="code" href="classNdbScanOperation.html" title="Class of scan operations for use in transactions.">NdbScanOperation</a>  *myScanOp;

  <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Dictionary.html" title="Dictionary for defining and retreiving meta data.">NdbDictionary::Dictionary</a>* myDict= myNdb-&gt;<a class="code" href="classNdb.html#f27ca0f4e5c074211252a7c83060a3a4">getDictionary</a>();
  <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Table.html" title="Represents a table in NDB Cluster.">NdbDictionary::Table</a> *myTable= myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#1a30b1bb5fa164113cb839eed64eb3b6">getTable</a>(<span class="stringliteral">"GARAGE"</span>);

  <span class="keywordflow">if</span> (myTable == NULL) 
    APIERROR(myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#0af68ea9b273172b46528ee1bd806f71">getNdbError</a>());

  <span class="keywordflow">while</span> (<span class="keyword">true</span>)
  {
    <span class="keywordflow">if</span> (retryAttempt &gt;= retryMax)
    {
      std::cout &lt;&lt; <span class="stringliteral">"ERROR: has retried this operation "</span> &lt;&lt; retryAttempt 
    &lt;&lt; <span class="stringliteral">" times, failing!"</span> &lt;&lt; std::endl;
      <span class="keywordflow">return</span> -1;
    }

    myTrans = myNdb-&gt;<a class="code" href="classNdb.html#7e34bb5d8e3d878a54ebb7c0e6d0c5f1">startTransaction</a>();
    <span class="keywordflow">if</span> (myTrans == NULL) 
    {
      <span class="keyword">const</span> <a class="code" href="structNdbError.html" title="Contains error information.">NdbError</a> err = myNdb-&gt;<a class="code" href="classNdb.html#80b53a037bb2e93b3cd6830eda58643a">getNdbError</a>();

      <span class="keywordflow">if</span> (err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>)
      {
  milliSleep(50);
  retryAttempt++;
  <span class="keywordflow">continue</span>;
      }
      std::cout &lt;&lt;  err.<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      <span class="keywordflow">return</span> -1;
    }

    myScanOp = myTrans-&gt;<a class="code" href="classNdbTransaction.html#165fbac99710fd693485b16d073957dd">getNdbScanOperation</a>(myTable); 
    <span class="keywordflow">if</span> (myScanOp == NULL) 
    {
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    }

    <span class="keywordflow">if</span>(myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#c8b2adf1a1e07663dc99b93dbab93dfd">readTuples</a>(<a class="code" href="classNdbOperation.html#bb62acf3797243787ce5814417f455103e2072829a61fb6cf156e33fd7891e5c" title="Read with exclusive lock.">NdbOperation::LM_Exclusive</a>) != 0)
    {
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    } 
    
    <a class="code" href="classNdbScanFilter.html" title="A simple way to specify filters for scan operations.">NdbScanFilter</a> filter(myScanOp) ;   
    <span class="keywordflow">if</span>(filter.begin(<a class="code" href="classNdbScanFilter.html#2054e0e6f52df029185c920cd6ca212200d0f69b8a48cbcd4c13ab340f146216" title="(x1 AND x2 AND x3)">NdbScanFilter::AND</a>) &lt; 0  || 
       filter.cmp(<a class="code" href="classNdbScanFilter.html#c87b7e23acac95f929923702e91d294a59e58f7ce14ecf1e688ca8729919caf3" title="equality">NdbScanFilter::COND_EQ</a>, column, color) &lt; 0 ||
       filter.end() &lt; 0)
    {
      std::cout &lt;&lt;  myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    }    
    
    <span class="keywordflow">if</span>(myTrans-&gt;<a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ed2041cab47f522aa4365d70a49267d6d">NdbTransaction::NoCommit</a>) != 0){      
      err = myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>();    
      <span class="keywordflow">if</span>(err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>){
  std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
  myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
  milliSleep(50);
  <span class="keywordflow">continue</span>;
      }
      std::cout &lt;&lt; err.<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> &lt;&lt; std::endl;
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    }


    <span class="keywordflow">while</span>((check = myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">true</span>)) == 0){
      <span class="keywordflow">do</span> 
      {
  <span class="keywordflow">if</span> (myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#6d76ccfea4566d6cb4a7ecbd2858df58">deleteCurrentTuple</a>() != 0)
  {
    std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
    <span class="keywordflow">return</span> -1;
  }
  deletedRows++;
  
      } <span class="keywordflow">while</span>((check = myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">false</span>)) == 0);
      
      <span class="keywordflow">if</span>(check != -1)
      {
  check = myTrans-&gt;<a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ecaba2931e541dd138044b61f38918391" title="Execute and try to commit the transaction.">NdbTransaction::Commit</a>);   
      }

      <span class="keywordflow">if</span>(check == -1)
      {
  check = myTrans-&gt;restart();
      }

      err = myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>();    
      <span class="keywordflow">if</span>(check == -1)
      {
  <span class="keywordflow">if</span>(err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>)
  {
    std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
    milliSleep(50);
    <span class="keywordflow">continue</span>;
  } 
      }
    }
    std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
    <span class="keywordflow">return</span> 0;
  }
  
  <span class="keywordflow">if</span>(myTrans!=0) 
  {
    std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
  }
  <span class="keywordflow">return</span> -1;
}


<span class="keywordtype">int</span> scan_update(<a class="code" href="classNdb.html" title="Represents the NDB kernel and is the main class of the NDB API.">Ndb</a>* myNdb, 
    <span class="keywordtype">int</span> update_column,
    <span class="keyword">const</span> <span class="keywordtype">char</span> * before_color,
    <span class="keyword">const</span> <span class="keywordtype">char</span> * after_color)
    
{
  
  <span class="comment">// Scan all records exclusive and update</span>
  <span class="comment">// them one by one</span>
  <span class="keywordtype">int</span>                  retryAttempt = 0;
  <span class="keyword">const</span> <span class="keywordtype">int</span>            retryMax = 10;
  <span class="keywordtype">int</span> updatedRows = 0;
  <span class="keywordtype">int</span> check;
  <a class="code" href="structNdbError.html" title="Contains error information.">NdbError</a>              err;
  <a class="code" href="classNdbTransaction.html" title="Represents a transaction.">NdbTransaction</a>  *myTrans;
  <a class="code" href="classNdbScanOperation.html" title="Class of scan operations for use in transactions.">NdbScanOperation</a>  *myScanOp;

  <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Dictionary.html" title="Dictionary for defining and retreiving meta data.">NdbDictionary::Dictionary</a>* myDict= myNdb-&gt;<a class="code" href="classNdb.html#f27ca0f4e5c074211252a7c83060a3a4">getDictionary</a>();
  <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Table.html" title="Represents a table in NDB Cluster.">NdbDictionary::Table</a> *myTable= myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#1a30b1bb5fa164113cb839eed64eb3b6">getTable</a>(<span class="stringliteral">"GARAGE"</span>);

  <span class="keywordflow">if</span> (myTable == NULL) 
    APIERROR(myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#0af68ea9b273172b46528ee1bd806f71">getNdbError</a>());

  <span class="keywordflow">while</span> (<span class="keyword">true</span>)
  {

    <span class="keywordflow">if</span> (retryAttempt &gt;= retryMax)
    {
      std::cout &lt;&lt; <span class="stringliteral">"ERROR: has retried this operation "</span> &lt;&lt; retryAttempt 
    &lt;&lt; <span class="stringliteral">" times, failing!"</span> &lt;&lt; std::endl;
      <span class="keywordflow">return</span> -1;
    }

    myTrans = myNdb-&gt;<a class="code" href="classNdb.html#7e34bb5d8e3d878a54ebb7c0e6d0c5f1">startTransaction</a>();
    <span class="keywordflow">if</span> (myTrans == NULL) 
    {
      <span class="keyword">const</span> <a class="code" href="structNdbError.html" title="Contains error information.">NdbError</a> err = myNdb-&gt;<a class="code" href="classNdb.html#80b53a037bb2e93b3cd6830eda58643a">getNdbError</a>();

      <span class="keywordflow">if</span> (err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>)
      {
  milliSleep(50);
  retryAttempt++;
  <span class="keywordflow">continue</span>;
      }
      std::cout &lt;&lt;  err.<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      <span class="keywordflow">return</span> -1;
    }

    myScanOp = myTrans-&gt;<a class="code" href="classNdbTransaction.html#165fbac99710fd693485b16d073957dd">getNdbScanOperation</a>(myTable); 
    <span class="keywordflow">if</span> (myScanOp == NULL) 
    {
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    }

    <span class="keywordflow">if</span>( myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#c8b2adf1a1e07663dc99b93dbab93dfd">readTuples</a>(<a class="code" href="classNdbOperation.html#bb62acf3797243787ce5814417f455103e2072829a61fb6cf156e33fd7891e5c" title="Read with exclusive lock.">NdbOperation::LM_Exclusive</a>) ) 
    {
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    } 

    <a class="code" href="classNdbScanFilter.html" title="A simple way to specify filters for scan operations.">NdbScanFilter</a> filter(myScanOp) ;   
    <span class="keywordflow">if</span>(filter.begin(<a class="code" href="classNdbScanFilter.html#2054e0e6f52df029185c920cd6ca212200d0f69b8a48cbcd4c13ab340f146216" title="(x1 AND x2 AND x3)">NdbScanFilter::AND</a>) &lt; 0  || 
       filter.cmp(<a class="code" href="classNdbScanFilter.html#c87b7e23acac95f929923702e91d294a59e58f7ce14ecf1e688ca8729919caf3" title="equality">NdbScanFilter::COND_EQ</a>, update_column, before_color) &lt;0||
       filter.end() &lt;0)
    {
      std::cout &lt;&lt;  myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    }    
    
    <span class="keywordflow">if</span>(myTrans-&gt;<a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ed2041cab47f522aa4365d70a49267d6d">NdbTransaction::NoCommit</a>) != 0)
    {      
      err = myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>();    
      <span class="keywordflow">if</span>(err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>){
  std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
  myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
  milliSleep(50);
  <span class="keywordflow">continue</span>;
      }
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    }

    <span class="keywordflow">while</span>((check = myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">true</span>)) == 0){
      <span class="keywordflow">do</span> {
  <a class="code" href="classNdbOperation.html" title="Class of operations for use in transactions.">NdbOperation</a> * myUpdateOp = myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#c4fae6a089d87d69385ff859517ba190">updateCurrentTuple</a>();
  <span class="keywordflow">if</span> (myUpdateOp == 0)
  {
    std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
    <span class="keywordflow">return</span> -1;
  }
  updatedRows++;

  myUpdateOp-&gt;<a class="code" href="classNdbOperation.html#e6fd36220eca78873d1d9b59539ab192">setValue</a>(update_column, after_color);
      } <span class="keywordflow">while</span>((check = myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">false</span>)) == 0);
      
      <span class="keywordflow">if</span>(check != -1)
      {
  check = myTrans-&gt;<a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ed2041cab47f522aa4365d70a49267d6d">NdbTransaction::NoCommit</a>);   
      }

      err = myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>();    
      <span class="keywordflow">if</span>(check == -1)
      {
  <span class="keywordflow">if</span>(err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>){
    std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
    milliSleep(50);
    <span class="keywordflow">continue</span>;
  } 
      }
    }

    <span class="keywordflow">if</span>(myTrans-&gt;<a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ecaba2931e541dd138044b61f38918391" title="Execute and try to commit the transaction.">NdbTransaction::Commit</a>) == -1)
    {
      <span class="keywordflow">if</span>(err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>){
  std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
  myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
  milliSleep(50);
  <span class="keywordflow">continue</span>;
      } 
    }

    std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
    <span class="keywordflow">return</span> 0;    
  }


  <span class="keywordflow">if</span>(myTrans!=0) 
  {
    std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
  }
  <span class="keywordflow">return</span> -1;
}



<span class="keywordtype">int</span> scan_print(<a class="code" href="classNdb.html" title="Represents the NDB kernel and is the main class of the NDB API.">Ndb</a> * myNdb)
{
<span class="comment">// Scan all records exclusive and update</span>
  <span class="comment">// them one by one</span>
  <span class="keywordtype">int</span>                  retryAttempt = 0;
  <span class="keyword">const</span> <span class="keywordtype">int</span>            retryMax = 10;
  <span class="keywordtype">int</span> fetchedRows = 0;
  <span class="keywordtype">int</span> check;
  <a class="code" href="structNdbError.html" title="Contains error information.">NdbError</a>              err;
  <a class="code" href="classNdbTransaction.html" title="Represents a transaction.">NdbTransaction</a>  *myTrans;
  <a class="code" href="classNdbScanOperation.html" title="Class of scan operations for use in transactions.">NdbScanOperation</a>  *myScanOp;
  <span class="comment">/* Result of reading attribute value, three columns:</span>
<span class="comment">     REG_NO, BRAND, and COLOR</span>
<span class="comment">   */</span>
  <a class="code" href="classNdbRecAttr.html" title="Contains value of an attribute.">NdbRecAttr</a> *      myRecAttr[3];   

  <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Dictionary.html" title="Dictionary for defining and retreiving meta data.">NdbDictionary::Dictionary</a>* myDict= myNdb-&gt;<a class="code" href="classNdb.html#f27ca0f4e5c074211252a7c83060a3a4">getDictionary</a>();
  <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Table.html" title="Represents a table in NDB Cluster.">NdbDictionary::Table</a> *myTable= myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#1a30b1bb5fa164113cb839eed64eb3b6">getTable</a>(<span class="stringliteral">"GARAGE"</span>);

  <span class="keywordflow">if</span> (myTable == NULL) 
    APIERROR(myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#0af68ea9b273172b46528ee1bd806f71">getNdbError</a>());

  <span class="keywordflow">while</span> (<span class="keyword">true</span>)
  {

    <span class="keywordflow">if</span> (retryAttempt &gt;= retryMax)
    {
      std::cout &lt;&lt; <span class="stringliteral">"ERROR: has retried this operation "</span> &lt;&lt; retryAttempt 
    &lt;&lt; <span class="stringliteral">" times, failing!"</span> &lt;&lt; std::endl;
      <span class="keywordflow">return</span> -1;
    }

    myTrans = myNdb-&gt;<a class="code" href="classNdb.html#7e34bb5d8e3d878a54ebb7c0e6d0c5f1">startTransaction</a>();
    <span class="keywordflow">if</span> (myTrans == NULL) 
    {
      <span class="keyword">const</span> <a class="code" href="structNdbError.html" title="Contains error information.">NdbError</a> err = myNdb-&gt;<a class="code" href="classNdb.html#80b53a037bb2e93b3cd6830eda58643a">getNdbError</a>();

      <span class="keywordflow">if</span> (err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>)
      {
  milliSleep(50);
  retryAttempt++;
  <span class="keywordflow">continue</span>;
      }
     std::cout &lt;&lt; err.<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      <span class="keywordflow">return</span> -1;
    }
    <span class="comment">/*</span>
<span class="comment">     * Define a scan operation. </span>
<span class="comment">     * NDBAPI.</span>
<span class="comment">     */</span>
    myScanOp = myTrans-&gt;<a class="code" href="classNdbTransaction.html#165fbac99710fd693485b16d073957dd">getNdbScanOperation</a>(myTable); 
    <span class="keywordflow">if</span> (myScanOp == NULL) 
    {
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    }

    <span class="keywordflow">if</span>( myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#c8b2adf1a1e07663dc99b93dbab93dfd">readTuples</a>(<a class="code" href="classNdbOperation.html#bb62acf3797243787ce5814417f4551011c069d10beb6f430fddd23cacf09ce1" title="Ignore locks, read last committed value.">NdbOperation::LM_CommittedRead</a>) == -1)
    {
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    } 

    myRecAttr[0] = myScanOp-&gt;<a class="code" href="classNdbOperation.html#644b56e6e5dbe4d4cc414a7c1ec13cc4">getValue</a>(<span class="stringliteral">"REG_NO"</span>);
    myRecAttr[1] = myScanOp-&gt;<a class="code" href="classNdbOperation.html#644b56e6e5dbe4d4cc414a7c1ec13cc4">getValue</a>(<span class="stringliteral">"BRAND"</span>);
    myRecAttr[2] = myScanOp-&gt;<a class="code" href="classNdbOperation.html#644b56e6e5dbe4d4cc414a7c1ec13cc4">getValue</a>(<span class="stringliteral">"COLOR"</span>);
    <span class="keywordflow">if</span>(myRecAttr[0] ==NULL || myRecAttr[1] == NULL || myRecAttr[2]==NULL) 
    {
  std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
  myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
  <span class="keywordflow">return</span> -1;
    }
    <span class="keywordflow">if</span>(myTrans-&gt;<a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ed2041cab47f522aa4365d70a49267d6d">NdbTransaction::NoCommit</a>) != 0){      
      err = myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>();    
      <span class="keywordflow">if</span>(err.<a class="code" href="structNdbError.html#f4af76b35a92ccebbb814705578e74e9">status</a> == <a class="code" href="structNdbError.html#77140bdb323bd821bd517639ad4586189d6a4af4ffaf1aed83fdf29ef2c47227">NdbError::TemporaryError</a>){
  std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> &lt;&lt; std::endl;
  myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
  milliSleep(50);
  <span class="keywordflow">continue</span>;
      }
      std::cout &lt;&lt; err.<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> &lt;&lt; std::endl;
      std::cout &lt;&lt; myTrans-&gt;<a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> &lt;&lt; std::endl;
      myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
      <span class="keywordflow">return</span> -1;
    }
    
    <span class="keywordflow">while</span>((check = myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">true</span>)) == 0){
      <span class="keywordflow">do</span> {
  
  fetchedRows++;
  std::cout &lt;&lt; myRecAttr[0]-&gt;<a class="code" href="classNdbRecAttr.html#21767995531c0ff23f110d682bd7df67">u_32_value</a>() &lt;&lt; <span class="stringliteral">"\t"</span>;

  std::cout &lt;&lt; myRecAttr[1]-&gt;<a class="code" href="classNdbRecAttr.html#6e24d0a0ebd5c2f32a85b91411917428">aRef</a>() &lt;&lt; <span class="stringliteral">"\t"</span>;

  std::cout &lt;&lt; myRecAttr[2]-&gt;<a class="code" href="classNdbRecAttr.html#6e24d0a0ebd5c2f32a85b91411917428">aRef</a>() &lt;&lt; std::endl;

      } <span class="keywordflow">while</span>((check = myScanOp-&gt;<a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">false</span>)) == 0);

    }    
    myNdb-&gt;<a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans);
    <span class="keywordflow">return</span> 1;
  }
  <span class="keywordflow">return</span> -1;

}


<span class="keywordtype">int</span> main()
{
  ndb_init();
  MYSQL mysql;

  <span class="comment">/**************************************************************</span>
<span class="comment">   * Connect to mysql server and create table                   *</span>
<span class="comment">   **************************************************************/</span>
  {
    <span class="keywordflow">if</span> ( !mysql_init(&amp;mysql) ) {
      std::cout &lt;&lt; <span class="stringliteral">"mysql_init failed\n"</span>;
      exit(-1);
    }
    <span class="keywordflow">if</span> ( !mysql_real_connect(&amp;mysql, <span class="stringliteral">"localhost"</span>, <span class="stringliteral">"root"</span>, <span class="stringliteral">""</span>, <span class="stringliteral">""</span>,
           3306, <span class="stringliteral">"/tmp/mysql.sock"</span>, 0) )
      MYSQLERROR(mysql);

    mysql_query(&amp;mysql, <span class="stringliteral">"CREATE DATABASE TEST_DB"</span>);
    <span class="keywordflow">if</span> (mysql_query(&amp;mysql, <span class="stringliteral">"USE TEST_DB"</span>) != 0) MYSQLERROR(mysql);

    create_table(mysql);
  }

  <span class="comment">/**************************************************************</span>
<span class="comment">   * Connect to ndb cluster                                     *</span>
<span class="comment">   **************************************************************/</span>

  <a class="code" href="classNdb__cluster__connection.html" title="Represents a connection to a cluster of storage nodes.">Ndb_cluster_connection</a> cluster_connection;
  <span class="keywordflow">if</span> (cluster_connection.<a class="code" href="classNdb__cluster__connection.html#1c1523c47bc56f17beb5c7e9124f7f47">connect</a>(4, 5, 1))
  {
    std::cout &lt;&lt; <span class="stringliteral">"Unable to connect to cluster within 30 secs."</span> &lt;&lt; std::endl;
    exit(-1);
  }
  <span class="comment">// Optionally connect and wait for the storage nodes (ndbd's)</span>
  <span class="keywordflow">if</span> (cluster_connection.<a class="code" href="classNdb__cluster__connection.html#02f01d4e1dba63679a4796838e3c3c7a">wait_until_ready</a>(30,0) &lt; 0)
  {
    std::cout &lt;&lt; <span class="stringliteral">"Cluster was not ready within 30 secs.\n"</span>;
    exit(-1);
  }

  <a class="code" href="classNdb.html" title="Represents the NDB kernel and is the main class of the NDB API.">Ndb</a> myNdb(&amp;cluster_connection,<span class="stringliteral">"TEST_DB"</span>);
  <span class="keywordflow">if</span> (myNdb.<a class="code" href="classNdb.html#b938638f0ced10e31ab67b3a80901270">init</a>(1024) == -1) {      <span class="comment">// Set max 1024  parallel transactions</span>
    APIERROR(myNdb.<a class="code" href="classNdb.html#80b53a037bb2e93b3cd6830eda58643a">getNdbError</a>());
    exit(-1);
  }

  <span class="comment">/*******************************************</span>
<span class="comment">   * Check table definition                  *</span>
<span class="comment">   *******************************************/</span>
  <span class="keywordtype">int</span> column_color;
  {
    <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Dictionary.html" title="Dictionary for defining and retreiving meta data.">NdbDictionary::Dictionary</a>* myDict= myNdb.<a class="code" href="classNdb.html#f27ca0f4e5c074211252a7c83060a3a4">getDictionary</a>();
    <span class="keyword">const</span> <a class="code" href="classNdbDictionary_1_1Table.html" title="Represents a table in NDB Cluster.">NdbDictionary::Table</a> *t= myDict-&gt;<a class="code" href="classNdbDictionary_1_1Dictionary.html#1a30b1bb5fa164113cb839eed64eb3b6">getTable</a>(<span class="stringliteral">"GARAGE"</span>);

    Car car;
    <span class="keywordflow">if</span> (t-&gt;<a class="code" href="classNdbDictionary_1_1Table.html#eb4d21052db69933cda75d4bb1509501">getColumn</a>(<span class="stringliteral">"COLOR"</span>)-&gt;getLength() != <span class="keyword">sizeof</span>(car.color) ||
  t-&gt;<a class="code" href="classNdbDictionary_1_1Table.html#eb4d21052db69933cda75d4bb1509501">getColumn</a>(<span class="stringliteral">"BRAND"</span>)-&gt;getLength() != <span class="keyword">sizeof</span>(car.brand))
    {
      std::cout &lt;&lt; <span class="stringliteral">"Wrong table definition"</span> &lt;&lt; std::endl;
      exit(-1);
    }
    column_color= t-&gt;<a class="code" href="classNdbDictionary_1_1Table.html#eb4d21052db69933cda75d4bb1509501">getColumn</a>(<span class="stringliteral">"COLOR"</span>)-&gt;getColumnNo();
  }

  <span class="keywordflow">if</span>(populate(&amp;myNdb) &gt; 0)
    std::cout &lt;&lt; <span class="stringliteral">"populate: Success!"</span> &lt;&lt; std::endl;
  
  <span class="keywordflow">if</span>(scan_print(&amp;myNdb) &gt; 0)
    std::cout &lt;&lt; <span class="stringliteral">"scan_print: Success!"</span> &lt;&lt; std::endl  &lt;&lt; std::endl;
  
  std::cout &lt;&lt; <span class="stringliteral">"Going to delete all pink cars!"</span> &lt;&lt; std::endl;
  
  {
    Car tmp;
    sprintf(tmp.color, <span class="stringliteral">"Pink"</span>);
    <span class="keywordflow">if</span>(scan_delete(&amp;myNdb, column_color, tmp.color) &gt; 0)
      std::cout &lt;&lt; <span class="stringliteral">"scan_delete: Success!"</span> &lt;&lt; std::endl  &lt;&lt; std::endl;
  }

  <span class="keywordflow">if</span>(scan_print(&amp;myNdb) &gt; 0)
    std::cout &lt;&lt; <span class="stringliteral">"scan_print: Success!"</span> &lt;&lt; std::endl  &lt;&lt; std::endl;
  
  {
    Car tmp1, tmp2;
    sprintf(tmp1.color, <span class="stringliteral">"Blue"</span>);
    sprintf(tmp2.color, <span class="stringliteral">"Black"</span>);
    std::cout &lt;&lt; <span class="stringliteral">"Going to update all "</span> &lt;&lt; tmp1.color 
        &lt;&lt; <span class="stringliteral">" cars to "</span> &lt;&lt; tmp2.color &lt;&lt; <span class="stringliteral">" cars!"</span> &lt;&lt; std::endl;
    <span class="keywordflow">if</span>(scan_update(&amp;myNdb, column_color, tmp1.color, tmp2.color) &gt; 0) 
      std::cout &lt;&lt; <span class="stringliteral">"scan_update: Success!"</span> &lt;&lt; std::endl  &lt;&lt; std::endl;
  }
  <span class="keywordflow">if</span>(scan_print(&amp;myNdb) &gt; 0)
    std::cout &lt;&lt; <span class="stringliteral">"scan_print: Success!"</span> &lt;&lt; std::endl  &lt;&lt; std::endl;

  <span class="keywordflow">return</span> 0;
}
</pre></div> </div>
<hr>
<address>
<small>
<center>
Documentation generated Sun Apr 20 06:25:31 2008 from mysql source files.<br>
&copy; 2003-2004 
<a href="http://www.mysql.com">MySQL AB</a>
<br>
</center>
</small></address>
</body>
</html>