<!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 <mysql.h></span> <span class="preprocessor">#include <mysqld_error.h></span> <span class="preprocessor">#include <NdbApi.hpp></span> <span class="comment">// Used for cout</span> <span class="preprocessor">#include <iostream></span> <span class="preprocessor">#include <stdio.h></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, &sleeptime); } <span class="preprocessor">#define PRINT_ERROR(code,msg) \</span> <span class="preprocessor"> std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \</span> <span class="preprocessor"> << ", code: " << code \</span> <span class="preprocessor"> << ", msg: " << msg << "." << std::endl</span> <span class="preprocessor"></span><span class="preprocessor">#define MYSQLERROR(mysql) { \</span> <span class="preprocessor"> PRINT_ERROR(mysql_errno(&mysql),mysql_error(&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 &mysql) { <span class="keywordflow">while</span> (mysql_query(&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(&mysql) != ER_TABLE_EXISTS_ERROR) MYSQLERROR(mysql); std::cout << <span class="stringliteral">"MySQL Cluster already has example table: GARAGE. "</span> << <span class="stringliteral">"Dropping it..."</span> << std::endl; <span class="comment">/**************</span> <span class="comment"> * Drop table *</span> <span class="comment"> **************/</span> <span class="keywordflow">if</span> (mysql_query(&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-><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-><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-><a class="code" href="classNdbDictionary_1_1Dictionary.html#0af68ea9b273172b46528ee1bd806f71">getNdbError</a>()); <span class="keywordflow">for</span> (i = 0; i < 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 < 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 < 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-><a class="code" href="classNdb.html#7e34bb5d8e3d878a54ebb7c0e6d0c5f1">startTransaction</a>(); <span class="keywordflow">if</span> (myTrans == NULL) APIERROR(myNdb-><a class="code" href="classNdb.html#80b53a037bb2e93b3cd6830eda58643a">getNdbError</a>()); <span class="keywordflow">for</span> (i = 0; i < 15; i++) { <a class="code" href="classNdbOperation.html" title="Class of operations for use in transactions.">NdbOperation</a>* myNdbOperation = myTrans-><a class="code" href="classNdbTransaction.html#2aeb211e54f84bd2de6cfb8fccec8166">getNdbOperation</a>(myTable); <span class="keywordflow">if</span> (myNdbOperation == NULL) APIERROR(myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>()); myNdbOperation-><a class="code" href="classNdbOperation.html#1e06cf9bb1ce1c5357004c32b1e89b15">insertTuple</a>(); myNdbOperation-><a class="code" href="classNdbOperation.html#2839b64df3a181f6023fb36a9fe8ab74">equal</a>(<span class="stringliteral">"REG_NO"</span>, cars[i].reg_no); myNdbOperation-><a class="code" href="classNdbOperation.html#e6fd36220eca78873d1d9b59539ab192">setValue</a>(<span class="stringliteral">"BRAND"</span>, cars[i].brand); myNdbOperation-><a class="code" href="classNdbOperation.html#e6fd36220eca78873d1d9b59539ab192">setValue</a>(<span class="stringliteral">"COLOR"</span>, cars[i].color); } <span class="keywordtype">int</span> check = myTrans-><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-><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-><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-><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-><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 >= retryMax) { std::cout << <span class="stringliteral">"ERROR: has retried this operation "</span> << retryAttempt << <span class="stringliteral">" times, failing!"</span> << std::endl; <span class="keywordflow">return</span> -1; } myTrans = myNdb-><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-><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 << err.<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; <span class="keywordflow">return</span> -1; } myScanOp = myTrans-><a class="code" href="classNdbTransaction.html#165fbac99710fd693485b16d073957dd">getNdbScanOperation</a>(myTable); <span class="keywordflow">if</span> (myScanOp == NULL) { std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">if</span>(myScanOp-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><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>) < 0 || filter.cmp(<a class="code" href="classNdbScanFilter.html#c87b7e23acac95f929923702e91d294a59e58f7ce14ecf1e688ca8729919caf3" title="equality">NdbScanFilter::COND_EQ</a>, column, color) < 0 || filter.end() < 0) { std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">if</span>(myTrans-><a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ed2041cab47f522aa4365d70a49267d6d">NdbTransaction::NoCommit</a>) != 0){ err = myTrans-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); milliSleep(50); <span class="keywordflow">continue</span>; } std::cout << err.<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> << std::endl; std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">while</span>((check = myScanOp-><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-><a class="code" href="classNdbScanOperation.html#6d76ccfea4566d6cb4a7ecbd2858df58">deleteCurrentTuple</a>() != 0) { std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } deletedRows++; } <span class="keywordflow">while</span>((check = myScanOp-><a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">false</span>)) == 0); <span class="keywordflow">if</span>(check != -1) { check = myTrans-><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->restart(); } err = myTrans-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); milliSleep(50); <span class="keywordflow">continue</span>; } } } std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><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-><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-><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-><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 >= retryMax) { std::cout << <span class="stringliteral">"ERROR: has retried this operation "</span> << retryAttempt << <span class="stringliteral">" times, failing!"</span> << std::endl; <span class="keywordflow">return</span> -1; } myTrans = myNdb-><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-><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 << err.<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; <span class="keywordflow">return</span> -1; } myScanOp = myTrans-><a class="code" href="classNdbTransaction.html#165fbac99710fd693485b16d073957dd">getNdbScanOperation</a>(myTable); <span class="keywordflow">if</span> (myScanOp == NULL) { std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">if</span>( myScanOp-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><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>) < 0 || filter.cmp(<a class="code" href="classNdbScanFilter.html#c87b7e23acac95f929923702e91d294a59e58f7ce14ecf1e688ca8729919caf3" title="equality">NdbScanFilter::COND_EQ</a>, update_column, before_color) <0|| filter.end() <0) { std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">if</span>(myTrans-><a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ed2041cab47f522aa4365d70a49267d6d">NdbTransaction::NoCommit</a>) != 0) { err = myTrans-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); milliSleep(50); <span class="keywordflow">continue</span>; } std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">while</span>((check = myScanOp-><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-><a class="code" href="classNdbScanOperation.html#c4fae6a089d87d69385ff859517ba190">updateCurrentTuple</a>(); <span class="keywordflow">if</span> (myUpdateOp == 0) { std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } updatedRows++; myUpdateOp-><a class="code" href="classNdbOperation.html#e6fd36220eca78873d1d9b59539ab192">setValue</a>(update_column, after_color); } <span class="keywordflow">while</span>((check = myScanOp-><a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">false</span>)) == 0); <span class="keywordflow">if</span>(check != -1) { check = myTrans-><a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ed2041cab47f522aa4365d70a49267d6d">NdbTransaction::NoCommit</a>); } err = myTrans-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); milliSleep(50); <span class="keywordflow">continue</span>; } } } <span class="keywordflow">if</span>(myTrans-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); milliSleep(50); <span class="keywordflow">continue</span>; } } std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><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-><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-><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-><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 >= retryMax) { std::cout << <span class="stringliteral">"ERROR: has retried this operation "</span> << retryAttempt << <span class="stringliteral">" times, failing!"</span> << std::endl; <span class="keywordflow">return</span> -1; } myTrans = myNdb-><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-><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 << err.<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << 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-><a class="code" href="classNdbTransaction.html#165fbac99710fd693485b16d073957dd">getNdbScanOperation</a>(myTable); <span class="keywordflow">if</span> (myScanOp == NULL) { std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">if</span>( myScanOp-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } myRecAttr[0] = myScanOp-><a class="code" href="classNdbOperation.html#644b56e6e5dbe4d4cc414a7c1ec13cc4">getValue</a>(<span class="stringliteral">"REG_NO"</span>); myRecAttr[1] = myScanOp-><a class="code" href="classNdbOperation.html#644b56e6e5dbe4d4cc414a7c1ec13cc4">getValue</a>(<span class="stringliteral">"BRAND"</span>); myRecAttr[2] = myScanOp-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">if</span>(myTrans-><a class="code" href="classNdbTransaction.html#361d5a82078f86a5d18923f56d43cc84">execute</a>(<a class="code" href="classNdbTransaction.html#2d2a5911b91e5cf78da970a1e97f7e3ed2041cab47f522aa4365d70a49267d6d">NdbTransaction::NoCommit</a>) != 0){ err = myTrans-><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 << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#59d98203577586394c30cdb01a270c2c">message</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); milliSleep(50); <span class="keywordflow">continue</span>; } std::cout << err.<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> << std::endl; std::cout << myTrans-><a class="code" href="classNdbTransaction.html#f4af91ca21b97c4fe6256a18903020fc">getNdbError</a>().<a class="code" href="structNdbError.html#87429c24aeeafdee05f41051ba0f2160">code</a> << std::endl; myNdb-><a class="code" href="classNdb.html#afbf5620c516bf18e0a3d3bacaf38e67">closeTransaction</a>(myTrans); <span class="keywordflow">return</span> -1; } <span class="keywordflow">while</span>((check = myScanOp-><a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">true</span>)) == 0){ <span class="keywordflow">do</span> { fetchedRows++; std::cout << myRecAttr[0]-><a class="code" href="classNdbRecAttr.html#21767995531c0ff23f110d682bd7df67">u_32_value</a>() << <span class="stringliteral">"\t"</span>; std::cout << myRecAttr[1]-><a class="code" href="classNdbRecAttr.html#6e24d0a0ebd5c2f32a85b91411917428">aRef</a>() << <span class="stringliteral">"\t"</span>; std::cout << myRecAttr[2]-><a class="code" href="classNdbRecAttr.html#6e24d0a0ebd5c2f32a85b91411917428">aRef</a>() << std::endl; } <span class="keywordflow">while</span>((check = myScanOp-><a class="code" href="classNdbScanOperation.html#1507839f1b36a707314f16b52c94b20b">nextResult</a>(<span class="keyword">false</span>)) == 0); } myNdb-><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(&mysql) ) { std::cout << <span class="stringliteral">"mysql_init failed\n"</span>; exit(-1); } <span class="keywordflow">if</span> ( !mysql_real_connect(&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(&mysql, <span class="stringliteral">"CREATE DATABASE TEST_DB"</span>); <span class="keywordflow">if</span> (mysql_query(&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 << <span class="stringliteral">"Unable to connect to cluster within 30 secs."</span> << 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) < 0) { std::cout << <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(&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-><a class="code" href="classNdbDictionary_1_1Dictionary.html#1a30b1bb5fa164113cb839eed64eb3b6">getTable</a>(<span class="stringliteral">"GARAGE"</span>); Car car; <span class="keywordflow">if</span> (t-><a class="code" href="classNdbDictionary_1_1Table.html#eb4d21052db69933cda75d4bb1509501">getColumn</a>(<span class="stringliteral">"COLOR"</span>)->getLength() != <span class="keyword">sizeof</span>(car.color) || t-><a class="code" href="classNdbDictionary_1_1Table.html#eb4d21052db69933cda75d4bb1509501">getColumn</a>(<span class="stringliteral">"BRAND"</span>)->getLength() != <span class="keyword">sizeof</span>(car.brand)) { std::cout << <span class="stringliteral">"Wrong table definition"</span> << std::endl; exit(-1); } column_color= t-><a class="code" href="classNdbDictionary_1_1Table.html#eb4d21052db69933cda75d4bb1509501">getColumn</a>(<span class="stringliteral">"COLOR"</span>)->getColumnNo(); } <span class="keywordflow">if</span>(populate(&myNdb) > 0) std::cout << <span class="stringliteral">"populate: Success!"</span> << std::endl; <span class="keywordflow">if</span>(scan_print(&myNdb) > 0) std::cout << <span class="stringliteral">"scan_print: Success!"</span> << std::endl << std::endl; std::cout << <span class="stringliteral">"Going to delete all pink cars!"</span> << std::endl; { Car tmp; sprintf(tmp.color, <span class="stringliteral">"Pink"</span>); <span class="keywordflow">if</span>(scan_delete(&myNdb, column_color, tmp.color) > 0) std::cout << <span class="stringliteral">"scan_delete: Success!"</span> << std::endl << std::endl; } <span class="keywordflow">if</span>(scan_print(&myNdb) > 0) std::cout << <span class="stringliteral">"scan_print: Success!"</span> << std::endl << std::endl; { Car tmp1, tmp2; sprintf(tmp1.color, <span class="stringliteral">"Blue"</span>); sprintf(tmp2.color, <span class="stringliteral">"Black"</span>); std::cout << <span class="stringliteral">"Going to update all "</span> << tmp1.color << <span class="stringliteral">" cars to "</span> << tmp2.color << <span class="stringliteral">" cars!"</span> << std::endl; <span class="keywordflow">if</span>(scan_update(&myNdb, column_color, tmp1.color, tmp2.color) > 0) std::cout << <span class="stringliteral">"scan_update: Success!"</span> << std::endl << std::endl; } <span class="keywordflow">if</span>(scan_print(&myNdb) > 0) std::cout << <span class="stringliteral">"scan_print: Success!"</span> << std::endl << 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> © 2003-2004 <a href="http://www.mysql.com">MySQL AB</a> <br> </center> </small></address> </body> </html>