November 15, 2009

NDB API examples, the trivia to make ndbapi_scan works!

Posted by Yves Trudeau |

When I did NDB Cluster engagements, it happened a few time that I had to cover the NDB API. Once, a customer asked an example on how to perform a simple scan. Remembering that some examples are within the NDB source tree, under ./storage/ndb/ndbapi-examples/ and I decided to take a look, why writing something when a good example already exists… I was not expecting what I found!

1. Missing headers


$ make
g++ -g -O0 -c -Wall -fno-rtti -fno-exceptions -I/usr/include -I../../../../include -I../../../../storage/ndb/include -I../../../../storage/ndb/include/ndbapi ndbapi_scan.cpp
ndbapi_scan.cpp: In constructor ‘Car::Car()’:
ndbapi_scan.cpp:111: error: ‘memset’ was not declared in this scope
ndbapi_scan.cpp: In function ‘void drop_table(MYSQL&)’:
ndbapi_scan.cpp:124: error: ‘exit’ was not declared in this scope
ndbapi_scan.cpp: In function ‘void create_table(MYSQL&)’:
...

Hmmm, some header files are missing, let’s add them


#include <string.h>
#include <stdlib.h>

2. The clean up code

With the added header files, the program compiles flawlessly. Let’s try it!


$ LD_LIBRARY_PATH=/usr/local/mysql-cluster-gpl-7.0.8a/lib/mysql ./ndbapi_scan /usr/local/mysql-cluster-gpl-7.0.8a/mysql.sock 127.0.0.
Unable to connect with connect string: nodeid=0,127.0.0.:1186
Retrying every 5 seconds. Attempts left: 4^C

My bad…. I did a typo in the IP of the MGM server. Easy to correct…


yves@yves-laptop:/opt/mysql-cluster-gpl-7.0.8/storage/ndb/ndbapi-examples/ndbapi_scan$ LD_LIBRARY_PATH=/usr/local/mysql-cluster-gpl-7.0.8a/lib/mysql ./ndbapi_scan /usr/local/mysql-cluster-gpl-7.0.8a/mysql.sock 127.0.0.1
MySQL Cluster already has example table: GARAGE. Dropping it...
MySQL Cluster already has example table: GARAGE. Dropping it...
MySQL Cluster already has example table: GARAGE. Dropping it...
MySQL Cluster already has example table: GARAGE. Dropping it...
^C

What’s that? Wow… look at the create_table code…


void create_table(MYSQL &mysql)
{
while (mysql_query(&mysql,
"CREATE TABLE"
" GARAGE"
" (REG_NO INT UNSIGNED NOT NULL,"
" BRAND CHAR(20) NOT NULL,"
" COLOR CHAR(20) NOT NULL,"
" PRIMARY KEY USING HASH (REG_NO))"
" ENGINE=NDB"))
{
if (mysql_errno(&mysql) != ER_TABLE_EXISTS_ERROR)
MYSQLERROR(mysql);
std::cout << "MySQL Cluster already has example table: GARAGE. "
<< "Dropping it..." << std::endl;
/******************
* Recreate table *
******************/
drop_table(mysql);
create_table(mysql);
}
}

That one is sweet, no need to be a C guru to catch it… it is fairly obvious where the problem is isn’t it? Let’s remove the recursive “create_table” call.

3. Success

$ LD_LIBRARY_PATH=/usr/local/mysql-cluster-gpl-7.0.8a/lib/mysql ./ndbapi_scan /usr/local/mysql-cluster-gpl-7.0.8a/mysql.sock 127.0.0.1
Connecting…Connected!
Initializing NDB…Done
Looking for table GARAGE…Got it! = GARAGE
Getting the columns…
Done
Populating…populate: Success!
Scanning and printing…0 Mercedes Blue
12 Toyota Pink
5 BMW Black
7 BMW Black
3 Mercedes Blue
9 BMW Black
10 Toyota Pink
14 Toyota Pink
11 Toyota Pink
1 Mercedes Blue
13 Toyota Pink
6 BMW Black
2 Mercedes Blue
4 Mercedes Blue
8 BMW Black
scan_print: Success!

Going to delete all pink cars!
Deleting pink cars…No error
Done
0 Mercedes Blue
5 BMW Black
7 BMW Black
3 Mercedes Blue
9 BMW Black
1 Mercedes Blue
6 BMW Black
2 Mercedes Blue
4 Mercedes Blue
8 BMW Black
scan_print: Success!

Going to update all Blue cars to Black cars!
No error
0 Mercedes Black
5 BMW Black
7 BMW Black
3 Mercedes Black
9 BMW Black
1 Mercedes Black
6 BMW Black
2 Mercedes Black
4 Mercedes Black
8 BMW Black
scan_print: Success!

I know that these programs are just examples. But yet, they are in some way part of the documentation and the quality is, let’s say, subject to questions.

Related posts: :Guidance for MySQL Optimizer Developers::Is it query which needs to be optimized ?::No more MySQL Crash Safe Replication in 5.0 ?:
 

4 Comments »

  1. They could certainly do with some love, and a few additions. Patches probably quite welcome, and quite likely to get quickly applied.

    Comment :: November 16, 2009 @ 12:48 am

  2. 2. Jonas Oreland

    yes, just mail a patch…please
    (hmm..wonder if it would require SCA…not sure…)

    Comment :: November 16, 2009 @ 1:01 am

  3. The infinite loop problem is fixed in http://bugs.mysql.com/bug.php?id=30552 put it hasn’t been pushed for some reason. I don’t know why the other problem hasn’t been spotted before, my guess is those includes were not required in older versions of g++.

    Comment :: November 16, 2009 @ 2:20 am

  4. @Stewart, @Jonas and @LinuxJedi, I’ll submit a patch tomorrow.

    Comment :: November 16, 2009 @ 4:53 pm

 

Subscribe without commenting

Trackbacks/Pingbacks