updated all examples to use mysql c-api create table

parent c1cfd9b4
-include .defs.mk
#NDB_OS = OS_YOU_ARE_RUNNING_ON
#NDB_OS = LINUX
#You need to set the NDB_OS variable here (LINUX, SOLARIS, MACOSX)
TARGET = ndbapi_async TARGET = ndbapi_async
SRCS = ndbapi_async.cpp SRCS = $(TARGET).cpp
OBJS = ndbapi_async.o OBJS = $(TARGET).o
CC = g++ CXX = g++
CFLAGS = -c -Wall -fno-rtti -D$(NDB_OS) CFLAGS = -g -c -Wall -fno-rtti -fno-exceptions
CXXFLAGS = -g
DEBUG = DEBUG =
LFLAGS = -Wall LFLAGS = -Wall
INCLUDE_DIR = ../../include TOP_SRCDIR = ../../..
LIB_DIR = ../../lib INCLUDE_DIR = $(TOP_SRCDIR)
ifeq ($(NDB_OS), SOLARIS) LIB_DIR = -L$(TOP_SRCDIR)/ndb/src/.libs \
# Here is the definition of system libraries necessary for Solaris 7 -L$(TOP_SRCDIR)/libmysql_r/.libs \
SYS_LIB = -lpthread -lsocket -lnsl -lrt -L$(TOP_SRCDIR)/mysys
endif
ifeq ($(NDB_OS), LINUX)
# Here is the definition of system libraries necessary for Linux 2.4
SYS_LIB = -lpthread
endif
ifeq ($(NDB_OS), MACOSX)
# Here is the definition of system libraries necessary for Mac OS X
SYS_LIB = SYS_LIB =
endif
$(TARGET): $(OBJS) $(TARGET): $(OBJS)
$(CC) $(LFLAGS) -L$(LIB_DIR) -lNDB_API $(OBJS) $(SYS_LIB) -o $(TARGET) $(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lz $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS) $(TARGET).o: $(SRCS)
$(CC) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS) $(CXX) $(CFLAGS) -I$(INCLUDE_DIR)/include -I$(INCLUDE_DIR)/extra -I$(INCLUDE_DIR)/ndb/include -I$(INCLUDE_DIR)/ndb/include/ndbapi $(SRCS)
clean: clean:
rm -f *.o $(TARGET) rm -f *.o $(TARGET)
...@@ -24,9 +24,12 @@ ...@@ -24,9 +24,12 @@
* *
* Classes and methods in NDBAPI used in this example: * Classes and methods in NDBAPI used in this example:
* *
* Ndb_cluster_connection
* connect()
* wait_until_ready()
*
* Ndb * Ndb
* init() * init()
* waitUntilRead()
* getDictionary() * getDictionary()
* startTransaction() * startTransaction()
* closeTransaction() * closeTransaction()
...@@ -38,23 +41,6 @@ ...@@ -38,23 +41,6 @@
* executeAsynchPrepare() * executeAsynchPrepare()
* getNdbError() * getNdbError()
* *
* NdbDictionary::Dictionary
* getTable()
* dropTable()
* createTable()
* getNdbError()
*
* NdbDictionary::Column
* setName()
* setType()
* setLength()
* setPrimaryKey()
* setNullable()
*
* NdbDictionary::Table
* setName()
* addColumn()
*
* NdbOperation * NdbOperation
* insertTuple() * insertTuple()
* equal() * equal()
...@@ -63,10 +49,10 @@ ...@@ -63,10 +49,10 @@
*/ */
#include <ndb_global.h> #include <mysql.h>
#include <mysqld_error.h>
#include <NdbApi.hpp> #include <NdbApi.hpp>
#include <NdbScanFilter.hpp>
#include <iostream> // Used for cout #include <iostream> // Used for cout
/** /**
...@@ -85,11 +71,16 @@ milliSleep(int milliseconds){ ...@@ -85,11 +71,16 @@ milliSleep(int milliseconds){
/** /**
* error printout macro * error printout macro
*/ */
#define APIERROR(error) \ #define PRINT_ERROR(code,msg) \
{ std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \
<< error.code << ", msg: " << error.message << "." << std::endl; \ << ", code: " << code \
exit(-1); } << ", msg: " << msg << "." << std::endl
#define MYSQLERROR(mysql) { \
PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \
exit(-1); }
#define APIERROR(error) { \
PRINT_ERROR(error.code,error.message); \
exit(-1); }
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
/** /**
...@@ -207,61 +198,26 @@ callback(int result, NdbConnection* trans, void* aObject) ...@@ -207,61 +198,26 @@ callback(int result, NdbConnection* trans, void* aObject)
/** /**
* Create table "GARAGE" * Create table "GARAGE"
*/ */
int create_table(Ndb * myNdb) int create_table(MYSQL &mysql)
{ {
NdbDictionary::Table myTable; while (mysql_query(&mysql,
NdbDictionary::Column myColumn; "CREATE TABLE"
" GARAGE"
NdbDictionary::Dictionary* myDict = myNdb->getDictionary(); " (REG_NO INT UNSIGNED NOT NULL,"
" BRAND CHAR(20) NOT NULL,"
/********************************************************* " COLOR CHAR(20) NOT NULL,"
* Create a table named GARAGE if it does not exist * " PRIMARY KEY USING HASH (REG_NO))"
*********************************************************/ " ENGINE=NDB"))
if (myDict->getTable("GARAGE") != NULL)
{ {
std::cout << "NDB already has example table: GARAGE. " if (mysql_errno(&mysql) != ER_TABLE_EXISTS_ERROR)
MYSQLERROR(mysql);
std::cout << "MySQL Cluster already has example table: GARAGE. "
<< "Dropping it..." << std::endl; << "Dropping it..." << std::endl;
if(myDict->dropTable("GARAGE") == -1) /**************
{ * Drop table *
std::cout << "Failed to drop: GARAGE." << std::endl; **************/
exit(1); if (mysql_query(&mysql, "DROP TABLE GARAGE"))
} MYSQLERROR(mysql);
}
myTable.setName("GARAGE");
/**
* Column REG_NO
*/
myColumn.setName("REG_NO");
myColumn.setType(NdbDictionary::Column::Unsigned);
myColumn.setLength(1);
myColumn.setPrimaryKey(true);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
/**
* Column BRAND
*/
myColumn.setName("BRAND");
myColumn.setType(NdbDictionary::Column::Char);
myColumn.setLength(20);
myColumn.setPrimaryKey(false);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
/**
* Column COLOR
*/
myColumn.setName("COLOR");
myColumn.setType(NdbDictionary::Column::Char);
myColumn.setLength(20);
myColumn.setPrimaryKey(false);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
if (myDict->createTable(myTable) == -1) {
APIERROR(myDict->getNdbError());
} }
return 1; return 1;
} }
...@@ -455,22 +411,48 @@ int populate(Ndb * myNdb, int data, async_callback_t * cbData) ...@@ -455,22 +411,48 @@ int populate(Ndb * myNdb, int data, async_callback_t * cbData)
int main() int main()
{ {
ndb_init(); ndb_init();
Ndb* myNdb = new Ndb( "TEST_DB" ); // Object representing the database MYSQL mysql;
/******************************************* /**************************************************************
* Initialize NDB and wait until its ready * * Connect to mysql server and create table *
*******************************************/ **************************************************************/
if (myNdb->init(1024) == -1) { // Set max 1024 parallel transactions {
APIERROR(myNdb->getNdbError()); if ( !mysql_init(&mysql) ) {
std::cout << "mysql_init failed\n";
exit(-1);
}
if ( !mysql_real_connect(&mysql, "localhost", "root", "", "",
3306, "/tmp/mysql.sock", 0) )
MYSQLERROR(mysql);
mysql_query(&mysql, "CREATE DATABASE TEST_DB");
if (mysql_query(&mysql, "USE TEST_DB") != 0) MYSQLERROR(mysql);
create_table(mysql);
} }
if (myNdb->waitUntilReady(30) != 0) { /**************************************************************
std::cout << "NDB was not ready within 30 secs." << std::endl; * Connect to ndb cluster *
**************************************************************/
Ndb_cluster_connection cluster_connection;
if (cluster_connection.connect(4, 5, 1))
{
std::cout << "Unable to connect to cluster within 30 secs." << std::endl;
exit(-1);
}
// Optionally connect and wait for the storage nodes (ndbd's)
if (cluster_connection.wait_until_ready(30,0) < 0)
{
std::cout << "Cluster was not ready within 30 secs.\n";
exit(-1); exit(-1);
} }
create_table(myNdb);
Ndb* myNdb = new Ndb( &cluster_connection,
"TEST_DB" ); // Object representing the database
if (myNdb->init(1024) == -1) { // Set max 1024 parallel transactions
APIERROR(myNdb->getNdbError());
}
/** /**
* Initialise transaction array * Initialise transaction array
*/ */
......
...@@ -141,8 +141,8 @@ static void create_table(MYSQL &mysql) ...@@ -141,8 +141,8 @@ static void create_table(MYSQL &mysql)
if (mysql_query(&mysql, if (mysql_query(&mysql,
"CREATE TABLE" "CREATE TABLE"
" MYTABLENAME" " MYTABLENAME"
" (ATTR1 INT UNSIGNED PRIMARY KEY," " (ATTR1 INT UNSIGNED NOT NULL PRIMARY KEY,"
" ATTR2 INT UNSIGNED)" " ATTR2 INT UNSIGNED NOT NULL)"
" ENGINE=NDB")) " ENGINE=NDB"))
MYSQLERROR(mysql); MYSQLERROR(mysql);
} }
...@@ -234,7 +234,7 @@ static void do_read(Ndb &myNdb) ...@@ -234,7 +234,7 @@ static void do_read(Ndb &myNdb)
NdbOperation *myOperation= myTransaction->getNdbOperation("MYTABLENAME"); NdbOperation *myOperation= myTransaction->getNdbOperation("MYTABLENAME");
if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); if (myOperation == NULL) APIERROR(myTransaction->getNdbError());
myOperation->readTuple(); myOperation->readTuple(NdbOperation::LM_Read);
myOperation->equal("ATTR1", i); myOperation->equal("ATTR1", i);
NdbRecAttr *myRecAttr= myOperation->getValue("ATTR2", NULL); NdbRecAttr *myRecAttr= myOperation->getValue("ATTR2", NULL);
......
TARGET = ndbapi_example4 TARGET = ndbapi_example4
SRCS = ndbapi_example4.cpp SRCS = $(TARGET).cpp
OBJS = ndbapi_example4.o OBJS = $(TARGET).o
CXX = g++ CXX = g++
CFLAGS = -c -Wall -fno-rtti -fno-exceptions CFLAGS = -c -Wall -fno-rtti -fno-exceptions
CXXFLAGS =
DEBUG = DEBUG =
LFLAGS = -Wall LFLAGS = -Wall
INCLUDE_DIR = ../../include TOP_SRCDIR = ../../..
LIB_DIR = -L../../src/.libs \ INCLUDE_DIR = $(TOP_SRCDIR)
-L../../../libmysql_r/.libs \ LIB_DIR = -L$(TOP_SRCDIR)/ndb/src/.libs \
-L../../../mysys -L$(TOP_SRCDIR)/libmysql_r/.libs \
-L$(TOP_SRCDIR)/mysys
SYS_LIB = SYS_LIB =
$(TARGET): $(OBJS) $(TARGET): $(OBJS)
$(CXX) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lz $(SYS_LIB) -o $(TARGET) $(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lz $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS) $(TARGET).o: $(SRCS)
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS) $(CXX) $(CFLAGS) -I$(INCLUDE_DIR)/include -I$(INCLUDE_DIR)/ndb/include -I$(INCLUDE_DIR)/ndb/include/ndbapi $(SRCS)
clean: clean:
rm -f *.o $(TARGET) rm -f *.o $(TARGET)
TARGET = ndbapi_scan TARGET = ndbapi_scan
SRCS = ndbapi_scan.cpp SRCS = $(TARGET).cpp
OBJS = ndbapi_scan.o OBJS = $(TARGET).o
CXX = g++ CXX = g++
CFLAGS = -c -Wall -fno-rtti -fno-exceptions CFLAGS = -g -c -Wall -fno-rtti -fno-exceptions
CXXFLAGS = CXXFLAGS = -g
DEBUG = DEBUG =
LFLAGS = -Wall LFLAGS = -Wall
TOP_SRCDIR = ../../.. TOP_SRCDIR = ../../..
INCLUDE_DIR = $(TOP_SRCDIR)/ndb/include INCLUDE_DIR = $(TOP_SRCDIR)
LIB_DIR = -L$(TOP_SRCDIR)/ndb/src/.libs \ LIB_DIR = -L$(TOP_SRCDIR)/ndb/src/.libs \
-L$(TOP_SRCDIR)/libmysql_r/.libs \ -L$(TOP_SRCDIR)/libmysql_r/.libs \
-L$(TOP_SRCDIR)/mysys -L$(TOP_SRCDIR)/mysys
...@@ -17,7 +17,7 @@ $(TARGET): $(OBJS) ...@@ -17,7 +17,7 @@ $(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lz $(SYS_LIB) -o $(TARGET) $(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lz $(SYS_LIB) -o $(TARGET)
$(TARGET).o: $(SRCS) $(TARGET).o: $(SRCS)
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS) $(CXX) $(CFLAGS) -I$(INCLUDE_DIR)/include -I$(INCLUDE_DIR)/extra -I$(INCLUDE_DIR)/ndb/include -I$(INCLUDE_DIR)/ndb/include/ndbapi $(SRCS)
clean: clean:
rm -f *.o $(TARGET) rm -f *.o $(TARGET)
...@@ -38,8 +38,6 @@ ...@@ -38,8 +38,6 @@
* getNdbScanOperation() * getNdbScanOperation()
* execute() * execute()
* *
* NdbResultSet
*
* NdbScanOperation * NdbScanOperation
* getValue() * getValue()
* readTuples() * readTuples()
...@@ -47,21 +45,14 @@ ...@@ -47,21 +45,14 @@
* deleteCurrentTuple() * deleteCurrentTuple()
* updateCurrentTuple() * updateCurrentTuple()
* *
* NdbDictionary::Dictionary * const NdbDictionary::Dictionary
* getTable() * getTable()
* dropTable()
* createTable()
* *
* NdbDictionary::Column * const NdbDictionary::Table
* setName() * getColumn()
* setType()
* setLength()
* setPrimaryKey()
* setNullable()
* *
* NdbDictionary::Table * const NdbDictionary::Column
* setName() * getLength()
* addColumn()
* *
* NdbOperation * NdbOperation
* insertTuple() * insertTuple()
...@@ -76,6 +67,8 @@ ...@@ -76,6 +67,8 @@
*/ */
#include <mysql.h>
#include <mysqld_error.h>
#include <NdbApi.hpp> #include <NdbApi.hpp>
// Used for cout // Used for cout
#include <iostream> #include <iostream>
...@@ -97,10 +90,16 @@ milliSleep(int milliseconds){ ...@@ -97,10 +90,16 @@ milliSleep(int milliseconds){
/** /**
* Helper sleep function * Helper sleep function
*/ */
#define APIERROR(error) \ #define PRINT_ERROR(code,msg) \
{ std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \
<< error.code << ", msg: " << error.message << "." << std::endl; \ << ", code: " << code \
exit(-1); } << ", msg: " << msg << "." << std::endl
#define MYSQLERROR(mysql) { \
PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \
exit(-1); }
#define APIERROR(error) { \
PRINT_ERROR(error.code,error.message); \
exit(-1); }
struct Car struct Car
{ {
...@@ -112,55 +111,26 @@ struct Car ...@@ -112,55 +111,26 @@ struct Car
/** /**
* Function to create table * Function to create table
*/ */
int create_table(Ndb * myNdb) int create_table(MYSQL &mysql)
{ {
NdbDictionary::Table myTable; while (mysql_query(&mysql,
NdbDictionary::Column myColumn; "CREATE TABLE"
" GARAGE"
NdbDictionary::Dictionary* myDict = myNdb->getDictionary(); " (REG_NO INT UNSIGNED NOT NULL,"
" BRAND CHAR(20) NOT NULL,"
/********************************************************* " COLOR CHAR(20) NOT NULL,"
* Create a table named GARAGE if it does not exist * " PRIMARY KEY USING HASH (REG_NO))"
*********************************************************/ " ENGINE=NDB"))
if (myDict->getTable("GARAGE") != NULL) { {
std::cout << "NDB already has example table: GARAGE. " if (mysql_errno(&mysql) != ER_TABLE_EXISTS_ERROR)
MYSQLERROR(mysql);
std::cout << "MySQL Cluster already has example table: GARAGE. "
<< "Dropping it..." << std::endl; << "Dropping it..." << std::endl;
if(myDict->dropTable("GARAGE") == -1) /**************
{ * Drop table *
std::cout << "Failed to drop: GARAGE." << std::endl; **************/
exit(1); if (mysql_query(&mysql, "DROP TABLE GARAGE"))
} MYSQLERROR(mysql);
}
Car car;
myTable.setName("GARAGE");
myColumn.setName("REG_NO");
myColumn.setType(NdbDictionary::Column::Unsigned);
myColumn.setLength(1);
myColumn.setPrimaryKey(true);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
myColumn.setName("BRAND");
myColumn.setType(NdbDictionary::Column::Char);
myColumn.setLength(sizeof(car.brand));
myColumn.setPrimaryKey(false);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
myColumn.setName("COLOR");
myColumn.setType(NdbDictionary::Column::Char);
myColumn.setLength(sizeof(car.color));
myColumn.setPrimaryKey(false);
myColumn.setNullable(false);
myTable.addColumn(myColumn);
if (myDict->createTable(myTable) == -1) {
APIERROR(myDict->getNdbError());
return -1;
} }
return 1; return 1;
} }
...@@ -460,7 +430,7 @@ int scan_update(Ndb* myNdb, ...@@ -460,7 +430,7 @@ int scan_update(Ndb* myNdb,
/** /**
* Define a result set for the scan. * Define a result set for the scan.
*/ */
if( myScanOp->readTuplesExclusive(NdbOperation::LM_Exclusive) ) if( myScanOp->readTuples(NdbOperation::LM_Exclusive) )
{ {
std::cout << myTrans->getNdbError().message << std::endl; std::cout << myTrans->getNdbError().message << std::endl;
myNdb->closeTransaction(myTrans); myNdb->closeTransaction(myTrans);
...@@ -726,36 +696,67 @@ int scan_print(Ndb * myNdb) ...@@ -726,36 +696,67 @@ int scan_print(Ndb * myNdb)
int main() int main()
{ {
ndb_init(); ndb_init();
MYSQL mysql;
Ndb_cluster_connection cluster_connection; /**************************************************************
* Connect to mysql server and create table *
**************************************************************/
{
if ( !mysql_init(&mysql) ) {
std::cout << "mysql_init failed\n";
exit(-1);
}
if ( !mysql_real_connect(&mysql, "localhost", "root", "", "",
3306, "/tmp/mysql.sock", 0) )
MYSQLERROR(mysql);
mysql_query(&mysql, "CREATE DATABASE TEST_DB");
if (mysql_query(&mysql, "USE TEST_DB") != 0) MYSQLERROR(mysql);
if (cluster_connection.connect(12, 5, 1)) create_table(mysql);
}
/**************************************************************
* Connect to ndb cluster *
**************************************************************/
Ndb_cluster_connection cluster_connection;
if (cluster_connection.connect(4, 5, 1))
{ {
std::cout << "Unable to connect to cluster within 30 secs." << std::endl; std::cout << "Unable to connect to cluster within 30 secs." << std::endl;
exit(-1); exit(-1);
} }
// Optionally connect and wait for the storage nodes (ndbd's)
if (cluster_connection.wait_until_ready(30,30)) if (cluster_connection.wait_until_ready(30,0) < 0)
{ {
std::cout << "Cluster was not ready within 30 secs." << std::endl; std::cout << "Cluster was not ready within 30 secs.\n";
exit(-1); exit(-1);
} }
Ndb myNdb(&cluster_connection,"TEST_DB" ); Ndb myNdb(&cluster_connection,"TEST_DB");
if (myNdb.init(1024) == -1) { // Set max 1024 parallel transactions
/*******************************************
* Initialize NDB and wait until its ready *
*******************************************/
if (myNdb.init(1024) == -1) { // Set max 1024 parallel transactions
APIERROR(myNdb.getNdbError()); APIERROR(myNdb.getNdbError());
exit(-1); exit(-1);
} }
create_table(&myNdb); /*******************************************
* Check table definition *
NdbDictionary::Dictionary* myDict = myNdb.getDictionary(); *******************************************/
int column_color = myDict->getTable("GARAGE")->getColumn("COLOR")->getColumnNo(); int column_color;
{
const NdbDictionary::Dictionary* myDict= myNdb.getDictionary();
const NdbDictionary::Table *t= myDict->getTable("GARAGE");
Car car;
if (t->getColumn("COLOR")->getLength() != sizeof(car.color) ||
t->getColumn("BRAND")->getLength() != sizeof(car.brand))
{
std::cout << "Wrong table definition" << std::endl;
exit(-1);
}
column_color= t->getColumn("COLOR")->getColumnNo();
}
if(populate(&myNdb) > 0) if(populate(&myNdb) > 0)
std::cout << "populate: Success!" << std::endl; std::cout << "populate: Success!" << std::endl;
...@@ -789,4 +790,6 @@ int main() ...@@ -789,4 +790,6 @@ int main()
} }
if(scan_print(&myNdb) > 0) if(scan_print(&myNdb) > 0)
std::cout << "scan_print: Success!" << std::endl << std::endl; std::cout << "scan_print: Success!" << std::endl << std::endl;
return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment