mirror of
https://github.com/MariaDB/server.git
synced 2025-09-02 09:41:40 +03:00
Merge joreland@bk-internal.mysql.com:/home/bk/mysql-5.0-ndb
into mysql.com:/home/jonas/src/mysql-5.0-ndb
This commit is contained in:
@@ -96,6 +96,7 @@ jcole@tetra.spaceapes.com
|
||||
jimw@mysql.com
|
||||
joerg@mysql.com
|
||||
jon@gigan.
|
||||
jonas@mysql.com
|
||||
joreland@bk-internal.mysql.com
|
||||
joreland@mysql.com
|
||||
jorge@linux.jorge.mysql.com
|
||||
|
@@ -1,5 +1,10 @@
|
||||
BIN_DIRS := ndbapi_example1 ndbapi_example3 ndbapi_example4 \
|
||||
ndbapi_example5 ndbapi_scan_example
|
||||
BIN_DIRS := ndbapi_simple_example \
|
||||
ndbapi_async_example \
|
||||
ndbapi_async_example1 \
|
||||
ndbapi_retries_example \
|
||||
ndbapi_simple_index_example \
|
||||
ndbapi_event_example \
|
||||
ndbapi_scan_example
|
||||
|
||||
bins: $(patsubst %, _bins_%, $(BIN_DIRS))
|
||||
|
||||
|
@@ -381,7 +381,7 @@ int populate(Ndb * myNdb, int data, async_callback_t * cbData)
|
||||
}
|
||||
|
||||
/*Prepare transaction (the transaction is NOT yet sent to NDB)*/
|
||||
transaction[current].conn->executeAsynchPrepare(Commit,
|
||||
transaction[current].conn->executeAsynchPrepare(NdbTransaction::Commit,
|
||||
&callback,
|
||||
cb);
|
||||
/**
|
||||
|
@@ -1,6 +1,6 @@
|
||||
TARGET = ndbapi_example3
|
||||
SRCS = ndbapi_example3.cpp
|
||||
OBJS = ndbapi_example3.o
|
||||
TARGET = ndbapi_async1
|
||||
SRCS = ndbapi_async1.cpp
|
||||
OBJS = ndbapi_async1.o
|
||||
CXX = g++
|
||||
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
||||
DEBUG =
|
@@ -15,7 +15,7 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
//
|
||||
// ndbapi_example2.cpp: Using asynchronous transactions in NDB API
|
||||
// ndbapi_async1.cpp: Using asynchronous transactions in NDB API
|
||||
//
|
||||
// Execute ndbapi_example1 to create the table "MYTABLENAME"
|
||||
// before executing this program.
|
||||
@@ -99,7 +99,8 @@ int main()
|
||||
myNdbOperation->setValue("ATTR2", 20 + i);
|
||||
|
||||
// Prepare transaction (the transaction is NOT yet sent to NDB)
|
||||
myNdbTransaction[i]->executeAsynchPrepare(Commit, &callback, NULL);
|
||||
myNdbTransaction[i]->executeAsynchPrepare(NdbTransaction::Commit,
|
||||
&callback, NULL);
|
||||
}
|
||||
|
||||
// Send all transactions to NDB
|
@@ -1,6 +1,6 @@
|
||||
TARGET = ndbapi_example5
|
||||
SRCS = ndbapi_example5.cpp
|
||||
OBJS = ndbapi_example5.o
|
||||
TARGET = ndbapi_event
|
||||
SRCS = ndbapi_event.cpp
|
||||
OBJS = ndbapi_event.o
|
||||
CXX = g++
|
||||
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
||||
CXXFLAGS =
|
@@ -15,7 +15,38 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
/**
|
||||
* ndbapi_example5.cpp: Using API level events in NDB API
|
||||
* ndbapi_event.cpp: Using API level events in NDB API
|
||||
*
|
||||
* Classes and methods used in this example:
|
||||
*
|
||||
* Ndb_cluster_connection
|
||||
* connect()
|
||||
* wait_until_ready()
|
||||
*
|
||||
* Ndb
|
||||
* init()
|
||||
* getDictionary()
|
||||
* createEventOperation()
|
||||
* dropEventOperation()
|
||||
* pollEvents()
|
||||
*
|
||||
* NdbDictionary
|
||||
* createEvent()
|
||||
* dropEvent()
|
||||
*
|
||||
* NdbDictionary::Event
|
||||
* setTable()
|
||||
* addTableEvent()
|
||||
* addEventColumn()
|
||||
*
|
||||
* NdbEventOperation
|
||||
* getValue()
|
||||
* getPreValue()
|
||||
* execute()
|
||||
* next()
|
||||
* isConsistent()
|
||||
* getEventType()
|
||||
*
|
||||
*/
|
||||
|
||||
#include <NdbApi.hpp>
|
||||
@@ -32,12 +63,12 @@
|
||||
* another process (e.g. flexBench -l 0 -stdtables).
|
||||
* We want to monitor what happens with columns COL0, COL2, COL11
|
||||
*
|
||||
* or together with the mysqlcluster client;
|
||||
* or together with the mysql client;
|
||||
*
|
||||
* shell> mysqlcluster -u root
|
||||
* shell> mysql -u root
|
||||
* mysql> create database TEST_DB;
|
||||
* mysql> use TEST_DB;
|
||||
* mysql> create table TAB0 (COL0 int primary key, COL1 int, COL11 int);
|
||||
* mysql> create table TAB0 (COL0 int primary key, COL1 int, COL11 int) engine=ndb;
|
||||
*
|
||||
* In another window start ndbapi_example5, wait until properly started
|
||||
*
|
||||
@@ -168,7 +199,7 @@ int main()
|
||||
printf("NULL");
|
||||
}
|
||||
if (recAttrPre[i]->isNULL() >= 0) { // we have a value
|
||||
printf(" post[%u]=", i);
|
||||
printf(" pre[%u]=", i);
|
||||
if (recAttrPre[i]->isNULL() == 0) // we have a non-null value
|
||||
printf("%u", recAttrPre[i]->u_32_value());
|
||||
else // we have a null value
|
||||
@@ -181,7 +212,7 @@ int main()
|
||||
;//printf("timed out\n");
|
||||
}
|
||||
// don't want to listen to events anymore
|
||||
myNdb->dropEventOperation(op);
|
||||
if (myNdb->dropEventOperation(op)) APIERROR(myNdb->getNdbError());
|
||||
|
||||
j++;
|
||||
}
|
||||
@@ -189,7 +220,8 @@ int main()
|
||||
{
|
||||
NdbDictionary::Dictionary *myDict = myNdb->getDictionary();
|
||||
if (!myDict) APIERROR(myNdb->getNdbError());
|
||||
myDict->dropEvent(eventName); // remove event from database
|
||||
// remove event from database
|
||||
if (myDict->dropEvent(eventName)) APIERROR(myDict->getNdbError());
|
||||
}
|
||||
|
||||
delete myNdb;
|
||||
@@ -201,8 +233,8 @@ int main()
|
||||
int myCreateEvent(Ndb* myNdb,
|
||||
const char *eventName,
|
||||
const char *eventTableName,
|
||||
const char **eventColumnName,
|
||||
const int noEventColumnName)
|
||||
const char **eventColumnNames,
|
||||
const int noEventColumnNames)
|
||||
{
|
||||
NdbDictionary::Dictionary *myDict= myNdb->getDictionary();
|
||||
if (!myDict) APIERROR(myNdb->getNdbError());
|
||||
@@ -214,24 +246,20 @@ int myCreateEvent(Ndb* myNdb,
|
||||
// myEvent.addTableEvent(NdbDictionary::Event::TE_UPDATE);
|
||||
// myEvent.addTableEvent(NdbDictionary::Event::TE_DELETE);
|
||||
|
||||
for (int i = 0; i < noEventColumnName; i++)
|
||||
myEvent.addEventColumn(eventColumnName[i]);
|
||||
myEvent.addEventColumns(noEventColumnNames, eventColumnNames);
|
||||
|
||||
int res = myDict->createEvent(myEvent); // Add event to database
|
||||
|
||||
if (res == 0)
|
||||
// Add event to database
|
||||
if (myDict->createEvent(myEvent) == 0)
|
||||
myEvent.print();
|
||||
else {
|
||||
printf("Event creation failed\n");
|
||||
printf("trying drop Event, maybe event exists\n");
|
||||
res = myDict->dropEvent(eventName);
|
||||
if (res)
|
||||
exit(-1);
|
||||
else if (myDict->getNdbError().code == 4709) {
|
||||
printf("Event creation failed, event exists\n");
|
||||
printf("dropping Event...\n");
|
||||
if (myDict->dropEvent(eventName)) APIERROR(myDict->getNdbError());
|
||||
// try again
|
||||
res = myDict->createEvent(myEvent); // Add event to database
|
||||
if (res)
|
||||
exit(-1);
|
||||
}
|
||||
// Add event to database
|
||||
if ( myDict->createEvent(myEvent)) APIERROR(myDict->getNdbError());
|
||||
} else
|
||||
APIERROR(myDict->getNdbError());
|
||||
|
||||
return res;
|
||||
return 0;
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
TARGET = ndbapi_example2
|
||||
SRCS = ndbapi_example2.cpp
|
||||
OBJS = ndbapi_example2.o
|
||||
TARGET = ndbapi_retries
|
||||
SRCS = ndbapi_retries.cpp
|
||||
OBJS = ndbapi_retries.o
|
||||
CXX = g++
|
||||
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
||||
DEBUG =
|
@@ -15,9 +15,9 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
//
|
||||
// ndbapi_example3.cpp: Error handling and transaction retries
|
||||
// ndbapi_retries.cpp: Error handling and transaction retries
|
||||
//
|
||||
// Execute ndbapi_example1 to create the table "MYTABLENAME"
|
||||
// Execute ndbapi_simple to create the table "MYTABLENAME"
|
||||
// before executing this program.
|
||||
//
|
||||
// There are many ways to program using the NDB API. In this example
|
||||
@@ -104,7 +104,7 @@ int insert(int transactionId, NdbTransaction* myTransaction) {
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
return myTransaction->execute(NoCommit);
|
||||
return myTransaction->execute(NdbTransaction::NoCommit);
|
||||
}
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@ int executeInsertTransaction(int transactionId, Ndb* myNdb) {
|
||||
result = -1; // Failure
|
||||
} else if (insert(transactionId, myTransaction) ||
|
||||
insert(10000+transactionId, myTransaction) ||
|
||||
myTransaction->execute(Commit)) {
|
||||
myTransaction->execute(NdbTransaction::Commit)) {
|
||||
TRANSERROR(myTransaction);
|
||||
ndberror = myTransaction->getNdbError();
|
||||
result = -1; // Failure
|
@@ -187,7 +187,7 @@ int populate(Ndb * myNdb)
|
||||
myNdbOperation->setValue("COLOR", cars[i].color);
|
||||
}
|
||||
|
||||
int check = myTrans->execute(Commit);
|
||||
int check = myTrans->execute(NdbTransaction::Commit);
|
||||
|
||||
myTrans->close();
|
||||
|
||||
@@ -280,7 +280,7 @@ int scan_delete(Ndb* myNdb,
|
||||
/**
|
||||
* Start scan (NoCommit since we are only reading at this stage);
|
||||
*/
|
||||
if(myTrans->execute(NoCommit) != 0){
|
||||
if(myTrans->execute(NdbTransaction::NoCommit) != 0){
|
||||
err = myTrans->getNdbError();
|
||||
if(err.status == NdbError::TemporaryError){
|
||||
std::cout << myTrans->getNdbError().message << std::endl;
|
||||
@@ -322,7 +322,7 @@ int scan_delete(Ndb* myNdb,
|
||||
*/
|
||||
if(check != -1)
|
||||
{
|
||||
check = myTrans->execute(Commit);
|
||||
check = myTrans->execute(NdbTransaction::Commit);
|
||||
}
|
||||
|
||||
if(check == -1)
|
||||
@@ -453,7 +453,7 @@ int scan_update(Ndb* myNdb,
|
||||
/**
|
||||
* Start scan (NoCommit since we are only reading at this stage);
|
||||
*/
|
||||
if(myTrans->execute(NoCommit) != 0)
|
||||
if(myTrans->execute(NdbTransaction::NoCommit) != 0)
|
||||
{
|
||||
err = myTrans->getNdbError();
|
||||
if(err.status == NdbError::TemporaryError){
|
||||
@@ -501,7 +501,7 @@ int scan_update(Ndb* myNdb,
|
||||
*/
|
||||
if(check != -1)
|
||||
{
|
||||
check = myTrans->execute(NoCommit);
|
||||
check = myTrans->execute(NdbTransaction::NoCommit);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -525,7 +525,7 @@ int scan_update(Ndb* myNdb,
|
||||
/**
|
||||
* Commit all prepared operations
|
||||
*/
|
||||
if(myTrans->execute(Commit) == -1)
|
||||
if(myTrans->execute(NdbTransaction::Commit) == -1)
|
||||
{
|
||||
if(err.status == NdbError::TemporaryError){
|
||||
std::cout << myTrans->getNdbError().message << std::endl;
|
||||
@@ -640,7 +640,7 @@ int scan_print(Ndb * myNdb)
|
||||
/**
|
||||
* Start scan (NoCommit since we are only reading at this stage);
|
||||
*/
|
||||
if(myTrans->execute(NoCommit) != 0){
|
||||
if(myTrans->execute(NdbTransaction::NoCommit) != 0){
|
||||
err = myTrans->getNdbError();
|
||||
if(err.status == NdbError::TemporaryError){
|
||||
std::cout << myTrans->getNdbError().message << std::endl;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
TARGET = ndbapi_example1
|
||||
TARGET = ndbapi_simple
|
||||
SRCS = $(TARGET).cpp
|
||||
OBJS = $(TARGET).o
|
||||
CXX = g++
|
@@ -15,7 +15,7 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
/*
|
||||
* ndbapi_example1.cpp: Using synchronous transactions in NDB API
|
||||
* ndbapi_simple.cpp: Using synchronous transactions in NDB API
|
||||
*
|
||||
* Correct output from this program is:
|
||||
*
|
||||
@@ -72,7 +72,7 @@ int main()
|
||||
}
|
||||
|
||||
// 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.\n";
|
||||
exit(-1);
|
||||
@@ -92,7 +92,6 @@ int main()
|
||||
run_application(mysql, cluster_connection);
|
||||
}
|
||||
|
||||
// ndb_end should not be called until all "Ndb" objects are deleted
|
||||
ndb_end(0);
|
||||
|
||||
std::cout << "\nTo drop created table use:\n"
|
||||
@@ -170,7 +169,7 @@ static void do_insert(Ndb &myNdb)
|
||||
myOperation->equal("ATTR1", i+5);
|
||||
myOperation->setValue("ATTR2", i+5);
|
||||
|
||||
if (myTransaction->execute( Commit ) == -1)
|
||||
if (myTransaction->execute( NdbTransaction::Commit ) == -1)
|
||||
APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myNdb.closeTransaction(myTransaction);
|
||||
@@ -193,7 +192,7 @@ static void do_update(Ndb &myNdb)
|
||||
myOperation->equal( "ATTR1", i );
|
||||
myOperation->setValue( "ATTR2", i+10);
|
||||
|
||||
if( myTransaction->execute( Commit ) == -1 )
|
||||
if( myTransaction->execute( NdbTransaction::Commit ) == -1 )
|
||||
APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myNdb.closeTransaction(myTransaction);
|
||||
@@ -214,7 +213,7 @@ static void do_delete(Ndb &myNdb)
|
||||
myOperation->deleteTuple();
|
||||
myOperation->equal( "ATTR1", 3 );
|
||||
|
||||
if (myTransaction->execute(Commit) == -1)
|
||||
if (myTransaction->execute(NdbTransaction::Commit) == -1)
|
||||
APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myNdb.closeTransaction(myTransaction);
|
||||
@@ -240,7 +239,7 @@ static void do_read(Ndb &myNdb)
|
||||
NdbRecAttr *myRecAttr= myOperation->getValue("ATTR2", NULL);
|
||||
if (myRecAttr == NULL) APIERROR(myTransaction->getNdbError());
|
||||
|
||||
if(myTransaction->execute( Commit ) == -1)
|
||||
if(myTransaction->execute( NdbTransaction::Commit ) == -1)
|
||||
if (i == 3) {
|
||||
std::cout << "Detected that deleted tuple doesn't exist!" << std::endl;
|
||||
} else {
|
@@ -1,4 +1,4 @@
|
||||
TARGET = ndbapi_example4
|
||||
TARGET = ndbapi_simple_index
|
||||
SRCS = $(TARGET).cpp
|
||||
OBJS = $(TARGET).o
|
||||
CXX = g++
|
@@ -15,7 +15,7 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
//
|
||||
// ndbapi_example4.cpp: Using secondary indexes in NDB API
|
||||
// ndbapi_simple_index.cpp: Using secondary indexes in NDB API
|
||||
//
|
||||
// Correct output from this program is:
|
||||
//
|
||||
@@ -127,7 +127,7 @@ int main()
|
||||
myOperation->equal("ATTR1", i+5);
|
||||
myOperation->setValue("ATTR2", i+5);
|
||||
|
||||
if (myTransaction->execute( Commit ) == -1)
|
||||
if (myTransaction->execute( NdbTransaction::Commit ) == -1)
|
||||
APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myNdb->closeTransaction(myTransaction);
|
||||
@@ -143,7 +143,7 @@ int main()
|
||||
if (myTransaction == NULL) APIERROR(myNdb->getNdbError());
|
||||
|
||||
NdbIndexOperation *myIndexOperation=
|
||||
myTransaction->getNdbIndexOperation("MYINDEXNAME$unique","MYTABLENAME");
|
||||
myTransaction->getNdbIndexOperation("MYINDEXNAME","MYTABLENAME");
|
||||
if (myIndexOperation == NULL) APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myIndexOperation->readTuple(NdbOperation::LM_Read);
|
||||
@@ -152,7 +152,7 @@ int main()
|
||||
NdbRecAttr *myRecAttr= myIndexOperation->getValue("ATTR1", NULL);
|
||||
if (myRecAttr == NULL) APIERROR(myTransaction->getNdbError());
|
||||
|
||||
if(myTransaction->execute( Commit ) != -1)
|
||||
if(myTransaction->execute( NdbTransaction::Commit ) != -1)
|
||||
printf(" %2d %2d\n", myRecAttr->u_32_value(), i);
|
||||
|
||||
myNdb->closeTransaction(myTransaction);
|
||||
@@ -166,14 +166,14 @@ int main()
|
||||
if (myTransaction == NULL) APIERROR(myNdb->getNdbError());
|
||||
|
||||
NdbIndexOperation *myIndexOperation=
|
||||
myTransaction->getNdbIndexOperation("MYINDEXNAME$unique", "MYTABLENAME");
|
||||
myTransaction->getNdbIndexOperation("MYINDEXNAME", "MYTABLENAME");
|
||||
if (myIndexOperation == NULL) APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myIndexOperation->updateTuple();
|
||||
myIndexOperation->equal( "ATTR2", i );
|
||||
myIndexOperation->setValue( "ATTR2", i+10);
|
||||
|
||||
if( myTransaction->execute( Commit ) == -1 )
|
||||
if( myTransaction->execute( NdbTransaction::Commit ) == -1 )
|
||||
APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myNdb->closeTransaction(myTransaction);
|
||||
@@ -187,13 +187,13 @@ int main()
|
||||
if (myTransaction == NULL) APIERROR(myNdb->getNdbError());
|
||||
|
||||
NdbIndexOperation *myIndexOperation=
|
||||
myTransaction->getNdbIndexOperation("MYINDEXNAME$unique", "MYTABLENAME");
|
||||
myTransaction->getNdbIndexOperation("MYINDEXNAME", "MYTABLENAME");
|
||||
if (myIndexOperation == NULL) APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myIndexOperation->deleteTuple();
|
||||
myIndexOperation->equal( "ATTR2", 3 );
|
||||
|
||||
if (myTransaction->execute(Commit) == -1)
|
||||
if (myTransaction->execute(NdbTransaction::Commit) == -1)
|
||||
APIERROR(myTransaction->getNdbError());
|
||||
|
||||
myNdb->closeTransaction(myTransaction);
|
||||
@@ -218,7 +218,7 @@ int main()
|
||||
NdbRecAttr *myRecAttr= myOperation->getValue("ATTR2", NULL);
|
||||
if (myRecAttr == NULL) APIERROR(myTransaction->getNdbError());
|
||||
|
||||
if(myTransaction->execute( Commit ) == -1)
|
||||
if(myTransaction->execute( NdbTransaction::Commit ) == -1)
|
||||
if (i == 3) {
|
||||
std::cout << "Detected that deleted tuple doesn't exist!\n";
|
||||
} else {
|
@@ -101,7 +101,7 @@ public:
|
||||
Busy = 701,
|
||||
NotMaster = 702,
|
||||
SeizeError = 703,
|
||||
EventNotFound = 4238,
|
||||
EventNotFound = 4710,
|
||||
EventNameTooLong = 4241,
|
||||
TooManyEvents = 4242,
|
||||
BadRequestType = 4247,
|
||||
@@ -363,11 +363,10 @@ struct CreateEvntRef {
|
||||
Busy = 701,
|
||||
NotMaster = 702,
|
||||
SeizeError = 703,
|
||||
EventNotFound = 4238,
|
||||
EventExists = 4239,
|
||||
EventNameTooLong = 4241,
|
||||
TooManyEvents = 4242,
|
||||
// EventExists = 4244,
|
||||
TooManyEvents = 4707,
|
||||
EventNameTooLong = 4708,
|
||||
EventExists = 4709,
|
||||
EventNotFound = 4731,
|
||||
AttributeNotStored = 4245,
|
||||
AttributeNullable = 4246,
|
||||
BadRequestType = 4247,
|
||||
@@ -376,7 +375,7 @@ struct CreateEvntRef {
|
||||
InvalidEventType = 4250,
|
||||
NotUnique = 4251,
|
||||
AllocationError = 4252,
|
||||
CreateEventTableFailed = 4253,
|
||||
CreateEventTableFailed = 4711,
|
||||
InvalidAttributeOrder = 4255,
|
||||
Temporary = 0x1 << 16
|
||||
};
|
||||
|
@@ -25,7 +25,7 @@
|
||||
that implements transactions.
|
||||
The NDB API consists of the following fundamental classes:
|
||||
- Ndb_cluster_connection, representing a connection to a cluster,
|
||||
- Ndb is the main class, representing the database,
|
||||
- Ndb is the main class, representing a connection to a database,
|
||||
- NdbTransaction represents a transaction,
|
||||
- NdbOperation represents an operation using a primary key,
|
||||
- NdbScanOperation represents an operation performing a full table scan.
|
||||
@@ -44,15 +44,15 @@
|
||||
The main structure of an application program is as follows:
|
||||
-# Construct and connect to a cluster using the Ndb_cluster_connection
|
||||
object.
|
||||
-# Construct and initialize Ndb object(s).
|
||||
-# Define and execute transactions using NdbTransaction and Ndb*Operation.
|
||||
-# Delete Ndb objects
|
||||
-# Delete cluster connection
|
||||
-# Construct and initialize Ndb object(s) to connect to a database.
|
||||
-# Define and execute transactions using NdbTransaction.
|
||||
-# Delete Ndb objects.
|
||||
-# Delete cluster connection.
|
||||
|
||||
The main structure of a transaction is as follows:
|
||||
-# Start transaction (an NdbTransaction)
|
||||
-# Add and define operations associated with the transaction using
|
||||
Ndb*Operation
|
||||
NdbOperation, NdbScanOperation, NdbIndexOperation, NdbIndexScanOperation
|
||||
-# Execute transaction
|
||||
|
||||
The execution can be of two different types,
|
||||
@@ -65,8 +65,9 @@
|
||||
for later execution.
|
||||
|
||||
If the execute is of type <var>Commit</var>, then the transaction is
|
||||
committed, and no further addition or definition of operations
|
||||
is allowed.
|
||||
committed. The transaction <em>must</em> be closed after it has been
|
||||
commited (event if commit fails), and no further addition or definition of
|
||||
operations is allowed.
|
||||
|
||||
|
||||
@section secSync Synchronous Transactions
|
||||
@@ -78,14 +79,18 @@
|
||||
(typically created using Ndb::startTransaction()).
|
||||
At this point, the transaction is only being defined,
|
||||
and is not yet sent to the NDB kernel.
|
||||
-# Define operations and add them to the transaction,
|
||||
using NdbTransaction::getNdb*Operation() and
|
||||
methods of the Ndb*Operation class.
|
||||
-# Define operations and add them to the transaction, using
|
||||
NdbTransaction::getNdbOperation(),
|
||||
NdbTransaction::getNdbScanOperation(),
|
||||
NdbTransaction::getNdbIndexOperation(), or
|
||||
NdbTransaction::getNdbIndexScanOperation(),
|
||||
and methods of the respective NdbOperation class.
|
||||
Note that the transaction has still not yet been sent to the NDB kernel.
|
||||
-# Execute the transaction, using the NdbTransaction::execute() method.
|
||||
-# Close the transaction (using Ndb::closeTransaction()).
|
||||
|
||||
For an example of this process, see the program listing in @ref ndbapi_example1.cpp.
|
||||
For an example of this process, see the program listing in
|
||||
@ref ndbapi_simple.cpp.
|
||||
|
||||
To execute several parallel synchronous transactions, one can either
|
||||
use multiple Ndb objects in several threads, or start multiple
|
||||
@@ -93,9 +98,9 @@
|
||||
|
||||
@section secNdbOperations Operations
|
||||
|
||||
Each NdbTransaction
|
||||
consists of a list of operations which are represented by instances
|
||||
of Ndb*Operation.
|
||||
Each NdbTransaction consists of a list of operations which are represented
|
||||
by instances of NdbOperation, NdbScanOperation, NdbIndexOperation, and/or
|
||||
NdbIndexScanOperation.
|
||||
|
||||
<h3>Single row operations</h3>
|
||||
After the operation is created using NdbTransaction::getNdbOperation()
|
||||
@@ -105,8 +110,8 @@
|
||||
-# Specify search conditions, using NdbOperation::equal()
|
||||
-# Specify attribute actions, using NdbOperation::getValue()
|
||||
|
||||
Here are two brief examples illustrating this process. For the sake of brevity,
|
||||
we omit error-handling.
|
||||
Here are two brief examples illustrating this process. For the sake of
|
||||
brevity, we omit error-handling.
|
||||
|
||||
This first example uses an NdbOperation:
|
||||
@code
|
||||
@@ -122,12 +127,12 @@
|
||||
// 4. Attribute Actions
|
||||
MyRecAttr= MyOperation->getValue("ATTR2", NULL);
|
||||
@endcode
|
||||
For additional examples of this sort, see @ref ndbapi_example1.cpp.
|
||||
For additional examples of this sort, see @ref ndbapi_simple.cpp.
|
||||
|
||||
The second example uses an NdbIndexOperation:
|
||||
@code
|
||||
// 1. Create
|
||||
MyOperation= MyTransaction->getNdbIndexOperation("MYINDEX", "MYTABLENAME");
|
||||
MyOperation= MyTransaction->getNdbIndexOperation("MYINDEX","MYTABLENAME");
|
||||
|
||||
// 2. Define type of operation and lock mode
|
||||
MyOperation->readTuple(NdbOperation::LM_Read);
|
||||
@@ -138,10 +143,11 @@
|
||||
// 4. Attribute Actions
|
||||
MyRecAttr = MyOperation->getValue("ATTR2", NULL);
|
||||
@endcode
|
||||
Another example of this second type can be found in @ref ndbapi_example4.cpp.
|
||||
Another example of this second type can be found in
|
||||
@ref ndbapi_simple_index.cpp.
|
||||
|
||||
We will now discuss in somewhat greater detail each step involved in the creation
|
||||
and use of synchronous transactions.
|
||||
We will now discuss in somewhat greater detail each step involved in the
|
||||
creation and use of synchronous transactions.
|
||||
|
||||
<h4>Step 1: Define single row operation type</h4>
|
||||
The following types of operations exist:
|
||||
@@ -162,18 +168,11 @@
|
||||
operate on a defined unique hash index.)
|
||||
|
||||
@note If you want to define multiple operations within the same transaction,
|
||||
then you need to call NdbTransaction::getNdb*Operation for each
|
||||
operation.
|
||||
then you need to call NdbTransaction::getNdbOperation() or
|
||||
NdbTransaction::getNdbIndexOperation() for each operation.
|
||||
|
||||
<h4>Step 2: Specify Search Conditions</h4>
|
||||
The search condition is used to select tuples.
|
||||
|
||||
For NdbOperation::insertTuple it is also allowed to define the
|
||||
search key by using NdbOperation::setValue.
|
||||
The NDB API will automatically detect that it is
|
||||
supposed to use NdbOperation::equal instead.
|
||||
For NdbOperation::insertTuple it is not necessary to use
|
||||
NdbOperation::setValue on key attributes before other attributes.
|
||||
The search condition is used to select tuples using NdbOperation::equal()
|
||||
|
||||
<h4>Step 3: Specify Attribute Actions</h4>
|
||||
Now it is time to define which attributes should be read or updated.
|
||||
@@ -183,21 +182,21 @@
|
||||
also possible to use the attribute identity to define the
|
||||
attribute.
|
||||
|
||||
NdbOperation::getValue returns an NdbRecAttr object
|
||||
NdbOperation::getValue() returns an NdbRecAttr object
|
||||
containing the read value.
|
||||
To get the value, there is actually two methods.
|
||||
The application can either
|
||||
- use its own memory (passed through a pointer aValue) to
|
||||
NdbOperation::getValue, or
|
||||
NdbOperation::getValue(), or
|
||||
- receive the attribute value in an NdbRecAttr object allocated
|
||||
by the NDB API.
|
||||
|
||||
The NdbRecAttr object is released when Ndb::closeTransaction
|
||||
The NdbRecAttr object is released when Ndb::closeTransaction()
|
||||
is called.
|
||||
Thus, the application can not reference this object after
|
||||
Ndb::closeTransaction have been called.
|
||||
Ndb::closeTransaction() have been called.
|
||||
The result of reading data from an NdbRecAttr object before
|
||||
calling NdbTransaction::execute is undefined.
|
||||
calling NdbTransaction::execute() is undefined.
|
||||
|
||||
|
||||
@subsection secScan Scan Operations
|
||||
@@ -214,16 +213,17 @@
|
||||
- They can operate on several nodes in parallell
|
||||
|
||||
After the operation is created using NdbTransaction::getNdbScanOperation()
|
||||
(or NdbTransaction::getNdbIndexScanOperation()), it is defined in the following
|
||||
three steps:
|
||||
(or NdbTransaction::getNdbIndexScanOperation()),
|
||||
it is defined in the following three steps:
|
||||
-# Define the standard operation type, using NdbScanOperation::readTuples()
|
||||
-# Specify search conditions, using @ref NdbScanFilter and/or @ref NdbIndexScanOperation::setBound
|
||||
-# Specify search conditions, using @ref NdbScanFilter and/or
|
||||
@ref NdbIndexScanOperation::setBound()
|
||||
-# Specify attribute actions, using NdbOperation::getValue()
|
||||
-# Executing the transaction, using NdbTransaction::execute()
|
||||
-# Iterating through the result set using NdbScanOperation::nextResult
|
||||
-# Iterating through the result set using NdbScanOperation::nextResult()
|
||||
|
||||
Here are two brief examples illustrating this process. For the sake of brevity,
|
||||
we omit error-handling.
|
||||
Here are two brief examples illustrating this process. For the sake of
|
||||
brevity, we omit error-handling.
|
||||
|
||||
This first example uses an NdbScanOperation:
|
||||
@code
|
||||
@@ -262,11 +262,14 @@
|
||||
@endcode
|
||||
|
||||
<h4>Step 1: Define scan operation operation type</h4>
|
||||
Scan operations only support 1 operation, @ref NdbScanOperation::readTuples or @ref NdbIndexScanOperation::readTuples
|
||||
Scan operations only support 1 operation,
|
||||
@ref NdbScanOperation::readTuples()
|
||||
or @ref NdbIndexScanOperation::readTuples()
|
||||
|
||||
@note If you want to define multiple scan operations within the same transaction,
|
||||
then you need to call NdbTransaction::getNdb*ScanOperation for each
|
||||
operation.
|
||||
@note If you want to define multiple scan operations within the same
|
||||
transaction, then you need to call
|
||||
NdbTransaction::getNdbScanOperation() or
|
||||
NdbTransaction::getNdbIndexScanOperation() for each operation.
|
||||
|
||||
<h4>Step 2: Specify Search Conditions</h4>
|
||||
The search condition is used to select tuples.
|
||||
@@ -288,33 +291,32 @@
|
||||
also possible to use the attribute identity to define the
|
||||
attribute.
|
||||
|
||||
NdbOperation::getValue returns an NdbRecAttr object
|
||||
NdbOperation::getValue() returns an NdbRecAttr object
|
||||
containing the read value.
|
||||
To get the value, there is actually two methods.
|
||||
The application can either
|
||||
- use its own memory (passed through a pointer aValue) to
|
||||
NdbOperation::getValue, or
|
||||
NdbOperation::getValue(), or
|
||||
- receive the attribute value in an NdbRecAttr object allocated
|
||||
by the NDB API.
|
||||
|
||||
The NdbRecAttr object is released when Ndb::closeTransaction
|
||||
is called.
|
||||
Thus, the application can not reference this object after
|
||||
Ndb::closeTransaction have been called.
|
||||
The NdbRecAttr object is released when Ndb::closeTransaction()
|
||||
is called. Thus, the application can not reference this object after
|
||||
Ndb::closeTransaction() have been called.
|
||||
The result of reading data from an NdbRecAttr object before
|
||||
calling NdbTransaction::execute is undefined.
|
||||
calling NdbTransaction::execute() is undefined.
|
||||
|
||||
<h3> Using Scan to update/delete </h3>
|
||||
Scanning can also be used to update/delete rows.
|
||||
This is performed by
|
||||
-# Scan using exclusive locks, NdbOperation::LM_Exclusive
|
||||
-# When iterating through the result set, for each row optionally call
|
||||
either NdbScanOperation::updateCurrentTuple or
|
||||
NdbScanOperation::deleteCurrentTuple
|
||||
-# If performing NdbScanOperation::updateCurrentTuple,
|
||||
set new values on record using ordinary @ref NdbOperation::setValue.
|
||||
NdbOperation::equal should _not_ be called as the primary key is
|
||||
retreived from the scan.
|
||||
either NdbScanOperation::updateCurrentTuple() or
|
||||
NdbScanOperation::deleteCurrentTuple()
|
||||
-# If performing NdbScanOperation::updateCurrentTuple(),
|
||||
set new values on record using ordinary @ref NdbOperation::setValue().
|
||||
NdbOperation::equal() should <em>not</em> be called as the primary
|
||||
key is retreived from the scan.
|
||||
|
||||
@note that the actual update/delete will not be performed until next
|
||||
NdbTransaction::execute (as with single row operations),
|
||||
@@ -323,13 +325,16 @@
|
||||
|
||||
<h4> Index scans specific features </h4>
|
||||
The following features are available when performing an index scan
|
||||
- Scan subset of table using @ref NdbIndexScanOperation::setBound
|
||||
- Ordering result set ascending or descending, @ref NdbIndexScanOperation::readTuples
|
||||
- When using NdbIndexScanOperation::BoundEQ on distribution key
|
||||
only fragment containing rows will be scanned.
|
||||
- Scan subset of table using @ref NdbIndexScanOperation::setBound()
|
||||
- Ordering result set ascending or descending,
|
||||
@ref NdbIndexScanOperation::readTuples()
|
||||
- When using NdbIndexScanOperation::BoundEQ on partition key
|
||||
only fragments containing rows will be scanned.
|
||||
|
||||
Rows are returned unordered unless sorted is set to true.
|
||||
@note When performing sorted scan, parameter parallelism to readTuples will
|
||||
|
||||
@note When performing sorted scan, parameter parallelism to
|
||||
NdbIndexScanOperation::readTuples() will
|
||||
be ignored and max parallelism will be used instead.
|
||||
|
||||
@subsection secScanLocks Lock handling with scans
|
||||
@@ -339,11 +344,11 @@
|
||||
|
||||
But Ndb will only lock a batch of rows per fragment at a time.
|
||||
How many rows will be locked per fragment is controlled by the
|
||||
batch parameter to @ref NdbScanOperation::readTuples.
|
||||
batch parameter to NdbScanOperation::readTuples().
|
||||
|
||||
To let the application handle how locks are released
|
||||
@ref NdbScanOperation::nextResult have a parameter fetch_allow.
|
||||
If NdbScanOperation::nextResult is called with fetch_allow = false, no
|
||||
NdbScanOperation::nextResult() have a parameter fetch_allow.
|
||||
If NdbScanOperation::nextResult() is called with fetch_allow = false, no
|
||||
locks may be released as result of the function call. Otherwise the locks
|
||||
for the current batch may be released.
|
||||
|
||||
@@ -376,11 +381,12 @@
|
||||
|
||||
One recommended way to handle a transaction failure
|
||||
(i.e. an error is reported) is to:
|
||||
-# Rollback transaction (NdbTransaction::execute with a special parameter)
|
||||
-# Rollback transaction (NdbTransaction::execute() with a special parameter)
|
||||
-# Close transaction
|
||||
-# Restart transaction (if the error was temporary)
|
||||
|
||||
@note Transaction are not automatically closed when an error occur.
|
||||
@note Transactions are not automatically closed when an error occur. Call
|
||||
Ndb::closeTransaction() to close.
|
||||
|
||||
Several errors can occur when a transaction holds multiple
|
||||
operations which are simultaneously executed.
|
||||
@@ -388,9 +394,9 @@
|
||||
objects and query for their NdbError objects to find out what really
|
||||
happened.
|
||||
|
||||
NdbTransaction::getNdbErrorOperation returns a reference to the
|
||||
NdbTransaction::getNdbErrorOperation() returns a reference to the
|
||||
operation causing the latest error.
|
||||
NdbTransaction::getNdbErrorLine delivers the method number of the
|
||||
NdbTransaction::getNdbErrorLine() delivers the method number of the
|
||||
erroneous method in the operation.
|
||||
|
||||
@code
|
||||
@@ -413,35 +419,35 @@
|
||||
Getting errorLine == 0 means that the error occurred when executing the
|
||||
operations.
|
||||
Here errorOperation will be a pointer to the theOperation object.
|
||||
NdbTransaction::getNdbError will return the NdbError object
|
||||
NdbTransaction::getNdbError() will return the NdbError object
|
||||
including holding information about the error.
|
||||
|
||||
Since errors could have occurred even when a commit was reported,
|
||||
there is also a special method, NdbTransaction::commitStatus,
|
||||
there is also a special method, NdbTransaction::commitStatus(),
|
||||
to check the commit status of the transaction.
|
||||
|
||||
*******************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* @page ndbapi_example1.cpp ndbapi_example1.cpp
|
||||
* @include ndbapi_example1.cpp
|
||||
* @page ndbapi_simple.cpp ndbapi_simple.cpp
|
||||
* @include ndbapi_simple.cpp
|
||||
*/
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
/**
|
||||
* @page ndbapi_example2.cpp ndbapi_example2.cpp
|
||||
* @include ndbapi_example2.cpp
|
||||
* @page ndbapi_async1.cpp ndbapi_async1.cpp
|
||||
* @include ndbapi_async1.cpp
|
||||
*/
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @page ndbapi_example3.cpp ndbapi_example3.cpp
|
||||
* @include ndbapi_example3.cpp
|
||||
* @page ndbapi_retries.cpp ndbapi_retries.cpp
|
||||
* @include ndbapi_retries.cpp
|
||||
*/
|
||||
|
||||
/**
|
||||
* @page ndbapi_example4.cpp ndbapi_example4.cpp
|
||||
* @include ndbapi_example4.cpp
|
||||
* @page ndbapi_simple_index.cpp ndbapi_simple_index.cpp
|
||||
* @include ndbapi_simple_index.cpp
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -454,32 +460,14 @@
|
||||
@page secAdapt Adaptive Send Algorithm
|
||||
|
||||
At the time of "sending" the transaction
|
||||
(using NdbTransaction::execute), the transactions
|
||||
(using NdbTransaction::execute()), the transactions
|
||||
are in reality <em>not</em> immediately transfered to the NDB Kernel.
|
||||
Instead, the "sent" transactions are only kept in a
|
||||
special send list (buffer) in the Ndb object to which they belong.
|
||||
The adaptive send algorithm decides when transactions should
|
||||
be transfered to the NDB kernel.
|
||||
|
||||
For each of these "sent" transactions, there are three
|
||||
possible states:
|
||||
-# Waiting to be transferred to NDB Kernel.
|
||||
-# Has been transferred to the NDB Kernel and is currently
|
||||
being processed.
|
||||
-# Has been transferred to the NDB Kernel and has
|
||||
finished processing.
|
||||
Now it is waiting for a call to a poll method.
|
||||
(When the poll method is invoked,
|
||||
then the transaction callback method will be executed.)
|
||||
|
||||
The poll method invoked (either Ndb::pollNdb or Ndb::sendPollNdb)
|
||||
will return when:
|
||||
-# at least 'minNoOfEventsToWakeup' of the transactions
|
||||
in the send list have transitioned to state 3 as described above, and
|
||||
-# all of these transactions have executed their callback methods.
|
||||
|
||||
|
||||
Since the NDB API is designed as a multi-threaded interface,
|
||||
The NDB API is designed as a multi-threaded interface and
|
||||
it is desirable to transfer database operations from more than
|
||||
one thread at a time.
|
||||
The NDB API keeps track of which Ndb objects are active in transfering
|
||||
@@ -510,14 +498,36 @@
|
||||
later releases of NDB Cluster.
|
||||
However, to support faster than 10 ms checks,
|
||||
there has to be support from the operating system.
|
||||
-# When calling NdbTransaction::execute synchronously or calling any
|
||||
of the poll-methods, there is a force parameter that overrides the
|
||||
adaptive algorithm and forces the send to all nodes.
|
||||
-# When methods that are affected by the adaptive send alorithm,
|
||||
e.g. NdbTransaction::execute(), there is a force parameter
|
||||
that overrides it forces the send to all nodes.
|
||||
|
||||
@note The times mentioned above are examples. These might
|
||||
@note The reasons mentioned above are examples. These might
|
||||
change in later releases of NDB Cluster.
|
||||
*/
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
/**
|
||||
|
||||
For each of these "sent" transactions, there are three
|
||||
possible states:
|
||||
-# Waiting to be transferred to NDB Kernel.
|
||||
-# Has been transferred to the NDB Kernel and is currently
|
||||
being processed.
|
||||
-# Has been transferred to the NDB Kernel and has
|
||||
finished processing.
|
||||
Now it is waiting for a call to a poll method.
|
||||
(When the poll method is invoked,
|
||||
then the transaction callback method will be executed.)
|
||||
|
||||
The poll method invoked (either Ndb::pollNdb() or Ndb::sendPollNdb())
|
||||
will return when:
|
||||
-# at least 'minNoOfEventsToWakeup' of the transactions
|
||||
in the send list have transitioned to state 3 as described above, and
|
||||
-# all of these transactions have executed their callback methods.
|
||||
*/
|
||||
#endif
|
||||
|
||||
/**
|
||||
@page secConcepts NDB Cluster Concepts
|
||||
|
||||
@@ -559,14 +569,17 @@
|
||||
|
||||
The application programmer can however hint the NDB API which
|
||||
transaction coordinator to use
|
||||
by providing a <em>distribution key</em> (usually the primary key).
|
||||
By using the primary key as distribution key,
|
||||
by providing a <em>partition key</em> (usually the primary key).
|
||||
By using the primary key as partition key,
|
||||
the transaction will be placed on the node where the primary replica
|
||||
of that record resides.
|
||||
Note that this is only a hint, the system can be
|
||||
reconfigured and then the NDB API will choose a transaction
|
||||
coordinator without using the hint.
|
||||
For more information, see NdbDictionary::Column::setDistributionKey.
|
||||
For more information, see NdbDictionary::Column::getPartitionKey(),
|
||||
Ndb::startTransaction(). The application programmer can specify
|
||||
the partition key from SQL by using the construct,
|
||||
"CREATE TABLE ... ENGINE=NDB PARTITION BY KEY (<attribute list>)".
|
||||
|
||||
|
||||
@section secRecordStruct Record Structure
|
||||
@@ -635,7 +648,7 @@
|
||||
A simple example is an application that uses many simple updates where
|
||||
a transaction needs to update one record.
|
||||
This record has a 32 bit primary key,
|
||||
which is also the distribution key.
|
||||
which is also the partition key.
|
||||
Then the keyData will be the address of the integer
|
||||
of the primary key and keyLen will be 4.
|
||||
*/
|
||||
|
@@ -309,8 +309,8 @@ private:
|
||||
int invokeActiveHook();
|
||||
// blob handle maintenance
|
||||
int atPrepare(NdbTransaction* aCon, NdbOperation* anOp, const NdbColumnImpl* aColumn);
|
||||
int preExecute(ExecType anExecType, bool& batch);
|
||||
int postExecute(ExecType anExecType);
|
||||
int preExecute(NdbTransaction::ExecType anExecType, bool& batch);
|
||||
int postExecute(NdbTransaction::ExecType anExecType);
|
||||
int preCommit();
|
||||
int atNextResult();
|
||||
// errors
|
||||
|
@@ -56,7 +56,7 @@ typedef struct charset_info_st CHARSET_INFO;
|
||||
* -# NdbDictionary::Column for creating table columns
|
||||
* -# NdbDictionary::Index for creating secondary indexes
|
||||
*
|
||||
* See @ref ndbapi_example4.cpp for details of usage.
|
||||
* See @ref ndbapi_simple_index.cpp for details of usage.
|
||||
*/
|
||||
class NdbDictionary {
|
||||
public:
|
||||
@@ -286,14 +286,14 @@ public:
|
||||
int getSize() const;
|
||||
|
||||
/**
|
||||
* Check if column is part of distribution key
|
||||
* Check if column is part of partition key
|
||||
*
|
||||
* A <em>distribution key</em> is a set of attributes which are used
|
||||
* A <em>partition key</em> is a set of attributes which are used
|
||||
* to distribute the tuples onto the NDB nodes.
|
||||
* The distribution key uses the NDB Cluster hashing function.
|
||||
* The partition key uses the NDB Cluster hashing function.
|
||||
*
|
||||
* An example where this is useful is TPC-C where it might be
|
||||
* good to use the warehouse id and district id as the distribution key.
|
||||
* good to use the warehouse id and district id as the partition key.
|
||||
* This would place all data for a specific district and warehouse
|
||||
* in the same database node.
|
||||
*
|
||||
@@ -301,9 +301,12 @@ public:
|
||||
* will still be used with the hashing algorithm.
|
||||
*
|
||||
* @return true then the column is part of
|
||||
* the distribution key.
|
||||
* the partition key.
|
||||
*/
|
||||
bool getDistributionKey() const;
|
||||
bool getPartitionKey() const;
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
|
||||
inline bool getDistributionKey() const { return getPartitionKey(); };
|
||||
#endif
|
||||
|
||||
/** @} *******************************************************************/
|
||||
|
||||
@@ -401,13 +404,17 @@ public:
|
||||
void setStripeSize(int size);
|
||||
|
||||
/**
|
||||
* Set distribution key
|
||||
* @see getDistributionKey
|
||||
* Set partition key
|
||||
* @see getPartitionKey
|
||||
*
|
||||
* @param enable If set to true, then the column will be part of
|
||||
* the distribution key.
|
||||
* the partition key.
|
||||
*/
|
||||
void setDistributionKey(bool enable);
|
||||
void setPartitionKey(bool enable);
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
|
||||
inline void setDistributionKey(bool enable)
|
||||
{ setPartitionKey(enable); };
|
||||
#endif
|
||||
|
||||
/** @} *******************************************************************/
|
||||
|
||||
@@ -691,7 +698,7 @@ public:
|
||||
|
||||
/** @} *******************************************************************/
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
void setStoredTable(bool x) { setLogging(x); }
|
||||
bool getStoredTable() const { return getLogging(); }
|
||||
|
||||
@@ -894,32 +901,80 @@ public:
|
||||
*/
|
||||
class Event : public Object {
|
||||
public:
|
||||
enum TableEvent { TE_INSERT=1, TE_DELETE=2, TE_UPDATE=4, TE_ALL=7 };
|
||||
enum TableEvent {
|
||||
TE_INSERT=1, ///< Insert event on table
|
||||
TE_DELETE=2, ///< Delete event on table
|
||||
TE_UPDATE=4, ///< Update event on table
|
||||
TE_ALL=7 ///< Any/all event on table (not relevant when
|
||||
///< events are received)
|
||||
};
|
||||
enum EventDurability {
|
||||
ED_UNDEFINED = 0,
|
||||
ED_UNDEFINED
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
= 0
|
||||
#endif
|
||||
#if 0 // not supported
|
||||
ED_SESSION = 1,
|
||||
,ED_SESSION = 1,
|
||||
// Only this API can use it
|
||||
// and it's deleted after api has disconnected or ndb has restarted
|
||||
|
||||
ED_TEMPORARY = 2,
|
||||
ED_TEMPORARY = 2
|
||||
// All API's can use it,
|
||||
// But's its removed when ndb is restarted
|
||||
#endif
|
||||
ED_PERMANENT = 3
|
||||
// All API's can use it,
|
||||
// It's still defined after a restart
|
||||
,ED_PERMANENT ///< All API's can use it,
|
||||
///< It's still defined after a restart
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
= 3
|
||||
#endif
|
||||
};
|
||||
|
||||
Event(const char *name);
|
||||
virtual ~Event();
|
||||
void setName(const char *);
|
||||
void setTable(const char *);
|
||||
void addTableEvent(const TableEvent);
|
||||
void setDurability(const EventDurability);
|
||||
/**
|
||||
* Set unique identifier for the event
|
||||
*/
|
||||
void setName(const char *name);
|
||||
/**
|
||||
* Set table for which events should be detected
|
||||
*/
|
||||
void setTable(const char *tableName);
|
||||
/**
|
||||
* Add type of event that should be detected
|
||||
*/
|
||||
void addTableEvent(const TableEvent te);
|
||||
/**
|
||||
* Set durability of the event
|
||||
*/
|
||||
void setDurability(const EventDurability ed);
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
void addColumn(const Column &c);
|
||||
#endif
|
||||
/**
|
||||
* Add a column on which events should be detected
|
||||
*
|
||||
* @param attrId Column id
|
||||
*
|
||||
* @note errors will mot be detected until createEvent() is called
|
||||
*/
|
||||
void addEventColumn(unsigned attrId);
|
||||
/**
|
||||
* Add a column on which events should be detected
|
||||
*
|
||||
* @param columnName Column name
|
||||
*
|
||||
* @note errors will mot be detected until createEvent() is called
|
||||
*/
|
||||
void addEventColumn(const char * columnName);
|
||||
/**
|
||||
* Add several columns on which events should be detected
|
||||
*
|
||||
* @param n Number of columns
|
||||
* @param columnNames Column names
|
||||
*
|
||||
* @note errors will mot be detected until
|
||||
* NdbDictionary::Dictionary::createEvent() is called
|
||||
*/
|
||||
void addEventColumns(int n, const char ** columnNames);
|
||||
|
||||
/**
|
||||
@@ -932,7 +987,9 @@ public:
|
||||
*/
|
||||
virtual int getObjectVersion() const;
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
void print();
|
||||
#endif
|
||||
|
||||
private:
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
@@ -1003,6 +1060,8 @@ public:
|
||||
* Fetch list of all objects, optionally restricted to given type.
|
||||
*/
|
||||
int listObjects(List & list, Object::Type type = Object::TypeUndefined);
|
||||
int listObjects(List & list,
|
||||
Object::Type type = Object::TypeUndefined) const;
|
||||
|
||||
/**
|
||||
* Get the latest error
|
||||
@@ -1041,6 +1100,7 @@ public:
|
||||
* @return 0 if successful, otherwise -1
|
||||
*/
|
||||
int listIndexes(List & list, const char * tableName);
|
||||
int listIndexes(List & list, const char * tableName) const;
|
||||
|
||||
/** @} *******************************************************************/
|
||||
/**
|
||||
|
@@ -41,7 +41,7 @@
|
||||
* The <em>error messages</em> and <em>error details</em> may
|
||||
* change without notice.
|
||||
*
|
||||
* For example of use, see @ref ndbapi_example3.cpp.
|
||||
* For example of use, see @ref ndbapi_retries.cpp.
|
||||
*/
|
||||
struct NdbError {
|
||||
/**
|
||||
|
@@ -46,7 +46,7 @@ class NdbEventOperationImpl;
|
||||
* The instance is removed by Ndb::dropEventOperation
|
||||
*
|
||||
* For more info see:
|
||||
* @ref ndbapi_example5.cpp
|
||||
* @ref ndbapi_event.cpp
|
||||
*
|
||||
* Known limitations:
|
||||
*
|
||||
|
@@ -73,7 +73,7 @@ public:
|
||||
*
|
||||
* For equality, it is better to use BoundEQ instead of the equivalent
|
||||
* pair of BoundLE and BoundGE. This is especially true when table
|
||||
* distribution key is an initial part of the index key.
|
||||
* partition key is an initial part of the index key.
|
||||
*
|
||||
* The sets of lower and upper bounds must be on initial sequences of
|
||||
* index keys. All but possibly the last bound must be non-strict.
|
||||
|
@@ -59,10 +59,17 @@ public:
|
||||
*/
|
||||
|
||||
enum LockMode {
|
||||
LM_Read = 0,
|
||||
LM_Exclusive = 1,
|
||||
LM_CommittedRead = 2,
|
||||
LM_Read ///< Read with shared lock
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
= 0
|
||||
#endif
|
||||
,LM_Exclusive ///< Read with exclusive lock
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
= 1
|
||||
#endif
|
||||
,LM_CommittedRead ///< Ignore locks, read last committed value
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
= 2,
|
||||
LM_Dirty = 2
|
||||
#endif
|
||||
};
|
||||
@@ -237,10 +244,13 @@ public:
|
||||
* use several equals (then all of them must be satisfied for the
|
||||
* tuple to be selected).
|
||||
*
|
||||
* @note There are 10 versions of NdbOperation::equal with
|
||||
* @note For insertTuple() it is also allowed to define the
|
||||
* search key by using setValue().
|
||||
*
|
||||
* @note There are 10 versions of equal() with
|
||||
* slightly different parameters.
|
||||
*
|
||||
* @note When using NdbOperation::equal with a string (char *) as
|
||||
* @note When using equal() with a string (char *) as
|
||||
* second argument, the string needs to be padded with
|
||||
* zeros in the following sense:
|
||||
* @code
|
||||
@@ -249,6 +259,8 @@ public:
|
||||
* NdbOperation->equal("Attr1", buf);
|
||||
* @endcode
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param anAttrName Attribute name
|
||||
* @param aValue Attribute value.
|
||||
* @param len Attribute length expressed in bytes.
|
||||
@@ -328,6 +340,12 @@ public:
|
||||
* then the API will assume that the pointer
|
||||
* is correct and not bother with checking it.
|
||||
*
|
||||
* @note For insertTuple() the NDB API will automatically detect that
|
||||
* it is supposed to use equal() instead.
|
||||
*
|
||||
* @note For insertTuple() it is not necessary to use
|
||||
* setValue() on key attributes before other attributes.
|
||||
*
|
||||
* @note There are 14 versions of NdbOperation::setValue with
|
||||
* slightly different parameters.
|
||||
*
|
||||
@@ -720,7 +738,7 @@ public:
|
||||
void setAbortOption(Int8 ao) { m_abortOption = ao; }
|
||||
|
||||
/**
|
||||
* Set/get distribution/partition key
|
||||
* Set/get partition key
|
||||
*/
|
||||
void setPartitionId(Uint32 id);
|
||||
void setPartitionHash(Uint32 key);
|
||||
|
@@ -39,7 +39,7 @@ class NdbOperation;
|
||||
* ndbout << MyRecAttr->u_32_value();
|
||||
* @endcode
|
||||
* For more examples, see
|
||||
* @ref ndbapi_example1.cpp.
|
||||
* @ref ndbapi_simple.cpp.
|
||||
*
|
||||
* @note The NdbRecAttr object is instantiated with its value when
|
||||
* NdbTransaction::execute is called. Before this, the value is
|
||||
|
@@ -42,72 +42,62 @@ class NdbBlob;
|
||||
typedef void (* NdbAsynchCallback)(int, NdbTransaction*, void*);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Commit type of transaction
|
||||
*/
|
||||
enum AbortOption {
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
CommitIfFailFree = 0,
|
||||
CommitAsMuchAsPossible = 2, ///< Commit transaction with as many
|
||||
TryCommit = 0, ///< <i>Missing explanation</i>
|
||||
#endif
|
||||
AbortOnError = 0, ///< Abort transaction on failed operation
|
||||
AO_IgnoreError = 2 ///< Transaction continues on failed operation
|
||||
enum AbortOption {
|
||||
CommitIfFailFree= 0,
|
||||
TryCommit= 0,
|
||||
AbortOnError= 0,
|
||||
CommitAsMuchAsPossible= 2,
|
||||
AO_IgnoreError= 2
|
||||
};
|
||||
|
||||
typedef AbortOption CommitType;
|
||||
|
||||
|
||||
/**
|
||||
* Execution type of transaction
|
||||
*/
|
||||
enum ExecType {
|
||||
NoExecTypeDef = -1, ///< Erroneous type (Used for debugging only)
|
||||
Prepare, ///< <i>Missing explanation</i>
|
||||
NoCommit, ///< Execute the transaction as far as it has
|
||||
///< been defined, but do not yet commit it
|
||||
Commit, ///< Execute and try to commit the transaction
|
||||
Rollback ///< Rollback transaction
|
||||
NoExecTypeDef = -1,
|
||||
Prepare,
|
||||
NoCommit,
|
||||
Commit,
|
||||
Rollback
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @class NdbTransaction
|
||||
* @brief Represents a transaction.
|
||||
*
|
||||
* A transaction (represented by an NdbTransaction object)
|
||||
* belongs to an Ndb object and is typically created using
|
||||
* Ndb::startTransaction.
|
||||
* belongs to an Ndb object and is created using
|
||||
* Ndb::startTransaction().
|
||||
* A transaction consists of a list of operations
|
||||
* (represented by NdbOperation objects).
|
||||
* (represented by NdbOperation, NdbScanOperation, NdbIndexOperation,
|
||||
* and NdbIndexScanOperation objects).
|
||||
* Each operation access exactly one table.
|
||||
*
|
||||
* After getting the NdbTransaction object,
|
||||
* the first step is to get (allocate) an operation given the table name.
|
||||
* the first step is to get (allocate) an operation given the table name using
|
||||
* one of the methods getNdbOperation(), getNdbScanOperation(),
|
||||
* getNdbIndexOperation(), or getNdbIndexScanOperation().
|
||||
* Then the operation is defined.
|
||||
* Several operations can be defined in parallel on the same
|
||||
* NdbTransaction object.
|
||||
* When all operations are defined, the NdbTransaction::execute
|
||||
* Several operations can be defined on the same
|
||||
* NdbTransaction object, they will in that case be executed in parallell.
|
||||
* When all operations are defined, the execute()
|
||||
* method sends them to the NDB kernel for execution.
|
||||
*
|
||||
* The NdbTransaction::execute method returns when the NDB kernel has
|
||||
* The execute() method returns when the NDB kernel has
|
||||
* completed execution of all operations defined before the call to
|
||||
* NdbTransaction::execute.
|
||||
* All allocated operations should be properly defined
|
||||
* before calling NdbTransaction::execute.
|
||||
* execute(). All allocated operations should be properly defined
|
||||
* before calling execute().
|
||||
*
|
||||
* A call to NdbTransaction::execute uses one out of three types of execution:
|
||||
* -# ExecType::NoCommit Executes operations without committing them.
|
||||
* -# ExecType::Commit Executes remaining operation and commits the
|
||||
* A call to execute() uses one out of three types of execution:
|
||||
* -# NdbTransaction::NoCommit Executes operations without committing them.
|
||||
* -# NdbTransaction::Commit Executes remaining operation and commits the
|
||||
* complete transaction
|
||||
* -# ExecType::Rollback Rollbacks the entire transaction.
|
||||
* -# NdbTransaction::Rollback Rollbacks the entire transaction.
|
||||
*
|
||||
* NdbTransaction::execute is equipped with an extra error handling parameter
|
||||
* execute() is equipped with an extra error handling parameter.
|
||||
* There are two alternatives:
|
||||
* -# AbortOption::AbortOnError (default).
|
||||
* -# NdbTransaction::AbortOnError (default).
|
||||
* The transaction is aborted if there are any error during the
|
||||
* execution
|
||||
* -# AbortOption::IgnoreError
|
||||
* -# NdbTransaction::AO_IgnoreError
|
||||
* Continue execution of transaction even if operation fails
|
||||
*
|
||||
*/
|
||||
@@ -139,6 +129,7 @@ enum ExecType {
|
||||
* primary key since it came along from the scanned tuple.
|
||||
*
|
||||
*/
|
||||
|
||||
class NdbTransaction
|
||||
{
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
@@ -152,6 +143,44 @@ class NdbTransaction
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Commit type of transaction
|
||||
*/
|
||||
enum AbortOption {
|
||||
AbortOnError= ///< Abort transaction on failed operation
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
::AbortOnError
|
||||
#endif
|
||||
,AO_IgnoreError= ///< Transaction continues on failed operation
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
::AO_IgnoreError
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* Execution type of transaction
|
||||
*/
|
||||
enum ExecType {
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
NoExecTypeDef=
|
||||
::NoExecTypeDef, ///< Erroneous type (Used for debugging only)
|
||||
Prepare= ::Prepare, ///< <i>Missing explanation</i>
|
||||
#endif
|
||||
NoCommit= ///< Execute the transaction as far as it has
|
||||
///< been defined, but do not yet commit it
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
::NoCommit
|
||||
#endif
|
||||
,Commit= ///< Execute and try to commit the transaction
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
::Commit
|
||||
#endif
|
||||
,Rollback ///< Rollback transaction
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
= ::Rollback
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* Get an NdbOperation for a table.
|
||||
* Note that the operation has to be defined before it is executed.
|
||||
@@ -282,6 +311,12 @@ public:
|
||||
int execute(ExecType execType,
|
||||
AbortOption abortOption = AbortOnError,
|
||||
int force = 0 );
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
|
||||
int execute(::ExecType execType,
|
||||
::AbortOption abortOption = ::AbortOnError,
|
||||
int force = 0 )
|
||||
{ return execute ((ExecType)execType,(AbortOption)abortOption,force); }
|
||||
#endif
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
// to be documented later
|
||||
@@ -298,7 +333,7 @@ public:
|
||||
* ExecType::Rollback rollbacks the entire transaction.
|
||||
* @param callback A callback method. This method gets
|
||||
* called when the transaction has been
|
||||
* executed. See @ref ndbapi_example2.cpp
|
||||
* executed. See @ref ndbapi_async1.cpp
|
||||
* for an example on how to specify and use
|
||||
* a callback method.
|
||||
* @param anyObject A void pointer. This pointer is forwarded to the
|
||||
@@ -312,6 +347,14 @@ public:
|
||||
NdbAsynchCallback callback,
|
||||
void* anyObject,
|
||||
AbortOption abortOption = AbortOnError);
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
|
||||
void executeAsynchPrepare(::ExecType execType,
|
||||
NdbAsynchCallback callback,
|
||||
void* anyObject,
|
||||
::AbortOption abortOption = ::AbortOnError)
|
||||
{ executeAsynchPrepare((ExecType)execType, callback, anyObject,
|
||||
(AbortOption)abortOption); }
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Prepare and send an asynchronous transaction.
|
||||
@@ -330,6 +373,14 @@ public:
|
||||
NdbAsynchCallback aCallback,
|
||||
void* anyObject,
|
||||
AbortOption abortOption = AbortOnError);
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
|
||||
void executeAsynch(::ExecType aTypeOfExec,
|
||||
NdbAsynchCallback aCallback,
|
||||
void* anyObject,
|
||||
::AbortOption abortOption= ::AbortOnError)
|
||||
{ executeAsynch((ExecType)aTypeOfExec, aCallback, anyObject,
|
||||
(AbortOption)abortOption); }
|
||||
#endif
|
||||
#endif
|
||||
/**
|
||||
* Refresh
|
||||
@@ -345,6 +396,8 @@ public:
|
||||
|
||||
/**
|
||||
* Close transaction
|
||||
*
|
||||
* @note Equivalent to to calling Ndb::closeTransaction()
|
||||
*/
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||
/**
|
||||
@@ -366,7 +419,13 @@ public:
|
||||
* Once a transaction has been completed successfully
|
||||
* it can be started again wo/ calling closeTransaction/startTransaction
|
||||
*
|
||||
* Note this method also releases completed operations
|
||||
* @note This method also releases completed operations
|
||||
*
|
||||
* @note This method does not close open scans,
|
||||
* c.f. NdbScanOperation::close()
|
||||
*
|
||||
* @note This method can only be called _directly_ after commit
|
||||
* and only if commit is successful
|
||||
*/
|
||||
int restart();
|
||||
#endif
|
||||
@@ -409,10 +468,7 @@ public:
|
||||
Uint64 getTransactionId();
|
||||
|
||||
/**
|
||||
* Returns the commit status of the transaction.
|
||||
*
|
||||
* @return The commit status of the transaction, i.e. one of
|
||||
* { NotStarted, Started, TimeOut, Committed, Aborted, NeedAbort }
|
||||
* The commit status of the transaction.
|
||||
*/
|
||||
enum CommitStatusType {
|
||||
NotStarted, ///< Transaction not yet started
|
||||
@@ -422,6 +478,11 @@ public:
|
||||
NeedAbort ///< <i>Missing explanation</i>
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the commit status of the transaction.
|
||||
*
|
||||
* @return The commit status of the transaction
|
||||
*/
|
||||
CommitStatusType commitStatus();
|
||||
|
||||
/** @} *********************************************************************/
|
||||
@@ -443,7 +504,7 @@ public:
|
||||
* This method is used on the NdbTransaction object to find the
|
||||
* NdbOperation causing an error.
|
||||
* To find more information about the
|
||||
* actual error, use method NdbOperation::getNdbError
|
||||
* actual error, use method NdbOperation::getNdbError()
|
||||
* on the returned NdbOperation object.
|
||||
*
|
||||
* @return The NdbOperation causing the latest error.
|
||||
|
@@ -875,7 +875,7 @@ NdbBlob::readParts(char* buf, Uint32 part, Uint32 count)
|
||||
setErrorCode(tOp);
|
||||
return -1;
|
||||
}
|
||||
tOp->m_abortOption = AbortOnError;
|
||||
tOp->m_abortOption = NdbTransaction::AbortOnError;
|
||||
buf += thePartSize;
|
||||
n++;
|
||||
thePendingBlobOps |= (1 << NdbOperation::ReadRequest);
|
||||
@@ -898,7 +898,7 @@ NdbBlob::insertParts(const char* buf, Uint32 part, Uint32 count)
|
||||
setErrorCode(tOp);
|
||||
return -1;
|
||||
}
|
||||
tOp->m_abortOption = AbortOnError;
|
||||
tOp->m_abortOption = NdbTransaction::AbortOnError;
|
||||
buf += thePartSize;
|
||||
n++;
|
||||
thePendingBlobOps |= (1 << NdbOperation::InsertRequest);
|
||||
@@ -921,7 +921,7 @@ NdbBlob::updateParts(const char* buf, Uint32 part, Uint32 count)
|
||||
setErrorCode(tOp);
|
||||
return -1;
|
||||
}
|
||||
tOp->m_abortOption = AbortOnError;
|
||||
tOp->m_abortOption = NdbTransaction::AbortOnError;
|
||||
buf += thePartSize;
|
||||
n++;
|
||||
thePendingBlobOps |= (1 << NdbOperation::UpdateRequest);
|
||||
@@ -943,7 +943,7 @@ NdbBlob::deleteParts(Uint32 part, Uint32 count)
|
||||
setErrorCode(tOp);
|
||||
return -1;
|
||||
}
|
||||
tOp->m_abortOption = AbortOnError;
|
||||
tOp->m_abortOption = NdbTransaction::AbortOnError;
|
||||
n++;
|
||||
thePendingBlobOps |= (1 << NdbOperation::DeleteRequest);
|
||||
theNdbCon->thePendingBlobOps |= (1 << NdbOperation::DeleteRequest);
|
||||
@@ -976,11 +976,11 @@ NdbBlob::deletePartsUnknown(Uint32 part)
|
||||
setErrorCode(tOp);
|
||||
return -1;
|
||||
}
|
||||
tOp->m_abortOption = AO_IgnoreError;
|
||||
tOp->m_abortOption= NdbTransaction::AO_IgnoreError;
|
||||
n++;
|
||||
}
|
||||
DBG("deletePartsUnknown: executeNoBlobs [in] bat=" << bat);
|
||||
if (theNdbCon->executeNoBlobs(NoCommit) == -1)
|
||||
if (theNdbCon->executeNoBlobs(NdbTransaction::NoCommit) == -1)
|
||||
return -1;
|
||||
DBG("deletePartsUnknown: executeNoBlobs [out]");
|
||||
n = 0;
|
||||
@@ -1012,7 +1012,7 @@ NdbBlob::executePendingBlobReads()
|
||||
Uint8 flags = (1 << NdbOperation::ReadRequest);
|
||||
if (thePendingBlobOps & flags) {
|
||||
DBG("executePendingBlobReads: executeNoBlobs [in]");
|
||||
if (theNdbCon->executeNoBlobs(NoCommit) == -1)
|
||||
if (theNdbCon->executeNoBlobs(NdbTransaction::NoCommit) == -1)
|
||||
return -1;
|
||||
DBG("executePendingBlobReads: executeNoBlobs [out]");
|
||||
thePendingBlobOps = 0;
|
||||
@@ -1027,7 +1027,7 @@ NdbBlob::executePendingBlobWrites()
|
||||
Uint8 flags = 0xFF & ~(1 << NdbOperation::ReadRequest);
|
||||
if (thePendingBlobOps & flags) {
|
||||
DBG("executePendingBlobWrites: executeNoBlobs [in]");
|
||||
if (theNdbCon->executeNoBlobs(NoCommit) == -1)
|
||||
if (theNdbCon->executeNoBlobs(NdbTransaction::NoCommit) == -1)
|
||||
return -1;
|
||||
DBG("executePendingBlobWrites: executeNoBlobs [out]");
|
||||
thePendingBlobOps = 0;
|
||||
@@ -1175,7 +1175,7 @@ NdbBlob::atPrepare(NdbTransaction* aCon, NdbOperation* anOp, const NdbColumnImpl
|
||||
* back after postExecute.
|
||||
*/
|
||||
int
|
||||
NdbBlob::preExecute(ExecType anExecType, bool& batch)
|
||||
NdbBlob::preExecute(NdbTransaction::ExecType anExecType, bool& batch)
|
||||
{
|
||||
DBG("preExecute [in]");
|
||||
if (theState == Invalid)
|
||||
@@ -1224,7 +1224,7 @@ NdbBlob::preExecute(ExecType anExecType, bool& batch)
|
||||
return -1;
|
||||
}
|
||||
if (isWriteOp()) {
|
||||
tOp->m_abortOption = AO_IgnoreError;
|
||||
tOp->m_abortOption = NdbTransaction::AO_IgnoreError;
|
||||
}
|
||||
theHeadInlineReadOp = tOp;
|
||||
// execute immediately
|
||||
@@ -1270,7 +1270,7 @@ NdbBlob::preExecute(ExecType anExecType, bool& batch)
|
||||
return -1;
|
||||
}
|
||||
if (isWriteOp()) {
|
||||
tOp->m_abortOption = AO_IgnoreError;
|
||||
tOp->m_abortOption = NdbTransaction::AO_IgnoreError;
|
||||
}
|
||||
theHeadInlineReadOp = tOp;
|
||||
// execute immediately
|
||||
@@ -1316,18 +1316,18 @@ NdbBlob::preExecute(ExecType anExecType, bool& batch)
|
||||
* any remaining prepared operations.
|
||||
*/
|
||||
int
|
||||
NdbBlob::postExecute(ExecType anExecType)
|
||||
NdbBlob::postExecute(NdbTransaction::ExecType anExecType)
|
||||
{
|
||||
DBG("postExecute [in] type=" << anExecType);
|
||||
if (theState == Invalid)
|
||||
return -1;
|
||||
if (theState == Active) {
|
||||
setState(anExecType == NoCommit ? Active : Closed);
|
||||
setState(anExecType == NdbTransaction::NoCommit ? Active : Closed);
|
||||
DBG("postExecute [skip]");
|
||||
return 0;
|
||||
}
|
||||
assert(theState == Prepared);
|
||||
setState(anExecType == NoCommit ? Active : Closed);
|
||||
setState(anExecType == NdbTransaction::NoCommit ? Active : Closed);
|
||||
assert(isKeyOp());
|
||||
if (isIndexOp()) {
|
||||
NdbBlob* tFirstBlob = theNdbOp->theBlobList;
|
||||
@@ -1343,14 +1343,15 @@ NdbBlob::postExecute(ExecType anExecType)
|
||||
return -1;
|
||||
if (theGetFlag) {
|
||||
assert(theGetSetBytes == 0 || theGetBuf != 0);
|
||||
assert(theGetSetBytes <= theInlineSize || anExecType == NoCommit);
|
||||
assert(theGetSetBytes <= theInlineSize ||
|
||||
anExecType == NdbTransaction::NoCommit);
|
||||
Uint32 bytes = theGetSetBytes;
|
||||
if (readDataPrivate(theGetBuf, bytes) == -1)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (isUpdateOp()) {
|
||||
assert(anExecType == NoCommit);
|
||||
assert(anExecType == NdbTransaction::NoCommit);
|
||||
getHeadFromRecAttr();
|
||||
if (theSetFlag) {
|
||||
// setValue overwrites everything
|
||||
@@ -1367,7 +1368,7 @@ NdbBlob::postExecute(ExecType anExecType)
|
||||
}
|
||||
}
|
||||
if (isWriteOp() && isTableOp()) {
|
||||
assert(anExecType == NoCommit);
|
||||
assert(anExecType == NdbTransaction::NoCommit);
|
||||
if (theHeadInlineReadOp->theError.code == 0) {
|
||||
int tNullFlag = theNullFlag;
|
||||
Uint64 tLength = theLength;
|
||||
@@ -1418,18 +1419,18 @@ NdbBlob::postExecute(ExecType anExecType)
|
||||
}
|
||||
}
|
||||
if (isDeleteOp()) {
|
||||
assert(anExecType == NoCommit);
|
||||
assert(anExecType == NdbTransaction::NoCommit);
|
||||
getHeadFromRecAttr();
|
||||
if (deleteParts(0, getPartCount()) == -1)
|
||||
return -1;
|
||||
}
|
||||
setState(anExecType == NoCommit ? Active : Closed);
|
||||
setState(anExecType == NdbTransaction::NoCommit ? Active : Closed);
|
||||
// activation callback
|
||||
if (theActiveHook != NULL) {
|
||||
if (invokeActiveHook() == -1)
|
||||
return -1;
|
||||
}
|
||||
if (anExecType == NoCommit && theHeadInlineUpdateFlag) {
|
||||
if (anExecType == NdbTransaction::NoCommit && theHeadInlineUpdateFlag) {
|
||||
NdbOperation* tOp = theNdbCon->getNdbOperation(theTable);
|
||||
if (tOp == NULL ||
|
||||
tOp->updateTuple() == -1 ||
|
||||
@@ -1438,7 +1439,7 @@ NdbBlob::postExecute(ExecType anExecType)
|
||||
setErrorCode(NdbBlobImpl::ErrAbort);
|
||||
return -1;
|
||||
}
|
||||
tOp->m_abortOption = AbortOnError;
|
||||
tOp->m_abortOption = NdbTransaction::AbortOnError;
|
||||
DBG("added op to update head+inline");
|
||||
}
|
||||
DBG("postExecute [out]");
|
||||
@@ -1468,7 +1469,7 @@ NdbBlob::preCommit()
|
||||
setErrorCode(NdbBlobImpl::ErrAbort);
|
||||
return -1;
|
||||
}
|
||||
tOp->m_abortOption = AbortOnError;
|
||||
tOp->m_abortOption = NdbTransaction::AbortOnError;
|
||||
DBG("added op to update head+inline");
|
||||
}
|
||||
}
|
||||
|
@@ -177,12 +177,12 @@ NdbDictionary::Column::getPrimaryKey() const {
|
||||
}
|
||||
|
||||
void
|
||||
NdbDictionary::Column::setDistributionKey(bool val){
|
||||
NdbDictionary::Column::setPartitionKey(bool val){
|
||||
m_impl.m_distributionKey = val;
|
||||
}
|
||||
|
||||
bool
|
||||
NdbDictionary::Column::getDistributionKey() const{
|
||||
NdbDictionary::Column::getPartitionKey() const{
|
||||
return m_impl.m_distributionKey;
|
||||
}
|
||||
|
||||
@@ -823,6 +823,12 @@ NdbDictionary::Dictionary::listObjects(List& list, Object::Type type)
|
||||
return m_impl.listObjects(list, type);
|
||||
}
|
||||
|
||||
int
|
||||
NdbDictionary::Dictionary::listObjects(List& list, Object::Type type) const
|
||||
{
|
||||
return m_impl.listObjects(list, type);
|
||||
}
|
||||
|
||||
int
|
||||
NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName)
|
||||
{
|
||||
@@ -834,6 +840,18 @@ NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName)
|
||||
return m_impl.listIndexes(list, tab->getTableId());
|
||||
}
|
||||
|
||||
int
|
||||
NdbDictionary::Dictionary::listIndexes(List& list,
|
||||
const char * tableName) const
|
||||
{
|
||||
const NdbDictionary::Table* tab= getTable(tableName);
|
||||
if(tab == 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return m_impl.listIndexes(list, tab->getTableId());
|
||||
}
|
||||
|
||||
const struct NdbError &
|
||||
NdbDictionary::Dictionary::getNdbError() const {
|
||||
return m_impl.getNdbError();
|
||||
|
@@ -941,7 +941,7 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
|
||||
for (int j=0; j < noerrcodes; j++)
|
||||
if(m_error.code == errcodes[j]) {
|
||||
doContinue = 1;
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
if (doContinue)
|
||||
continue;
|
||||
@@ -1007,12 +1007,14 @@ NdbDictInterface::getTable(class NdbApiSignal * signal,
|
||||
Uint32 noOfSections, bool fullyQualifiedNames)
|
||||
{
|
||||
//GetTabInfoReq * const req = CAST_PTR(GetTabInfoReq, signal->getDataPtrSend());
|
||||
int errCodes[] = {GetTabInfoRef::Busy };
|
||||
|
||||
int r = dictSignal(signal,ptr,noOfSections,
|
||||
0/*do not use masternode id*/,
|
||||
100,
|
||||
WAIT_GET_TAB_INFO_REQ,
|
||||
WAITFOR_RESPONSE_TIMEOUT,
|
||||
NULL,0);
|
||||
errCodes, 1);
|
||||
if (r) return 0;
|
||||
|
||||
NdbTableImpl * rt = 0;
|
||||
@@ -2234,10 +2236,9 @@ NdbDictionaryImpl::createEvent(NdbEventImpl & evnt)
|
||||
NdbTableImpl* tab = getTable(evnt.getTable());
|
||||
|
||||
if(tab == 0){
|
||||
// m_error.code = 3249;
|
||||
ndbout_c(":createEvent: table %s not found", evnt.getTable());
|
||||
#ifdef EVENT_DEBUG
|
||||
ndbout_c("NdbDictionaryImpl::createEvent: table not found: %s", evnt.getTable());
|
||||
ndbout_c("NdbDictionaryImpl::createEvent: table not found: %s",
|
||||
evnt.getTable());
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
@@ -1076,15 +1076,15 @@ NdbTransaction::getNdbScanOperation(const char* aTableName)
|
||||
}//NdbTransaction::getNdbScanOperation()
|
||||
|
||||
/*****************************************************************************
|
||||
NdbScanOperation* getNdbScanOperation(const char* anIndexName, const char* aTableName);
|
||||
NdbScanOperation* getNdbIndexScanOperation(const char* anIndexName, const char* aTableName);
|
||||
|
||||
Return Value Return a pointer to a NdbScanOperation object if getNdbScanOperation was succesful.
|
||||
Return Value Return a pointer to a NdbIndexScanOperation object if getNdbIndexScanOperation was succesful.
|
||||
Return NULL : In all other case.
|
||||
Parameters: anIndexName : Name of the index to use.
|
||||
aTableName : Name of the database table.
|
||||
Remark: Get an operation from NdbScanOperation idlelist and get the NdbTransaction object
|
||||
Remark: Get an operation from NdbIndexScanOperation idlelist and get the NdbTransaction object
|
||||
who was fetch by startTransaction pointing to this operation
|
||||
getOperation will set the theTableId in the NdbOperation object.synchronous
|
||||
getOperation will set the theTableId in the NdbIndexScanOperation object.synchronous
|
||||
******************************************************************************/
|
||||
NdbIndexScanOperation*
|
||||
NdbTransaction::getNdbIndexScanOperation(const char* anIndexName,
|
||||
@@ -1134,12 +1134,12 @@ NdbTransaction::getNdbIndexScanOperation(const NdbDictionary::Index * index,
|
||||
/*****************************************************************************
|
||||
NdbScanOperation* getNdbScanOperation(int aTableId);
|
||||
|
||||
Return Value Return a pointer to a NdbOperation object if getNdbOperation was succesful.
|
||||
Return Value Return a pointer to a NdbScanOperation object if getNdbScanOperation was succesful.
|
||||
Return NULL: In all other case.
|
||||
Parameters: tableId : Id of the database table beeing deleted.
|
||||
Remark: Get an operation from NdbScanOperation object idlelist and get the NdbTransaction
|
||||
object who was fetch by startTransaction pointing to this operation
|
||||
getOperation will set the theTableId in the NdbOperation object, synchronous.
|
||||
getOperation will set the theTableId in the NdbScanOperation object, synchronous.
|
||||
*****************************************************************************/
|
||||
NdbIndexScanOperation*
|
||||
NdbTransaction::getNdbScanOperation(const NdbTableImpl * tab)
|
||||
@@ -1203,12 +1203,12 @@ NdbTransaction::getNdbScanOperation(const NdbDictionary::Table * table)
|
||||
NdbIndexOperation* getNdbIndexOperation(const char* anIndexName,
|
||||
const char* aTableName);
|
||||
|
||||
Return Value Return a pointer to a NdbOperation object if getNdbScanOperation was succesful.
|
||||
Return Value Return a pointer to a NdbOperation object if getNdbIndexOperation was succesful.
|
||||
Return NULL : In all other case.
|
||||
Parameters: aTableName : Name of the database table.
|
||||
Remark: Get an operation from NdbScanOperation idlelist and get the NdbTransaction object
|
||||
Remark: Get an operation from NdbIndexOperation idlelist and get the NdbTransaction object
|
||||
who was fetch by startTransaction pointing to this operation
|
||||
getOperation will set the theTableId in the NdbScanOperation object.synchronous
|
||||
getOperation will set the theTableId in the NdbIndexOperation object.synchronous
|
||||
******************************************************************************/
|
||||
NdbIndexOperation*
|
||||
NdbTransaction::getNdbIndexOperation(const char* anIndexName,
|
||||
@@ -1216,7 +1216,20 @@ NdbTransaction::getNdbIndexOperation(const char* anIndexName,
|
||||
{
|
||||
if (theCommitStatus == Started) {
|
||||
NdbTableImpl * table = theNdb->theDictionary->getTable(aTableName);
|
||||
NdbIndexImpl * index = theNdb->theDictionary->getIndex(anIndexName,
|
||||
NdbIndexImpl * index;
|
||||
|
||||
if (table->m_frm.get_data())
|
||||
{
|
||||
// This unique index is defined from SQL level
|
||||
static const char* uniqueSuffix= "$unique";
|
||||
char uniqueIndexName[MAX_TAB_NAME_SIZE];
|
||||
|
||||
strxnmov(uniqueIndexName, MAX_TAB_NAME_SIZE, anIndexName, uniqueSuffix, NullS);
|
||||
index = theNdb->theDictionary->getIndex(uniqueIndexName,
|
||||
aTableName);
|
||||
}
|
||||
else
|
||||
index = theNdb->theDictionary->getIndex(anIndexName,
|
||||
aTableName);
|
||||
if(table != 0 && index != 0){
|
||||
return getNdbIndexOperation(index, table);
|
||||
|
@@ -79,6 +79,7 @@ static const char* empty_string = "";
|
||||
* 4400 - ""
|
||||
* 4500 - ""
|
||||
* 4600 - ""
|
||||
* 4700 - "" Event
|
||||
* 5000 - Management server
|
||||
*/
|
||||
|
||||
@@ -296,6 +297,22 @@ ErrorBundle ErrorCodes[] = {
|
||||
{ 4232, AE, "Parallelism can only be between 1 and 240" },
|
||||
{ 290, AE, "Scan not started or has been closed by kernel due to timeout" },
|
||||
|
||||
/**
|
||||
* Event application errors
|
||||
*/
|
||||
|
||||
{ 4707, AE, "Too many event have been defined"},
|
||||
{ 4708, AE, "Event name is too long"},
|
||||
{ 4709, AE, "Event already exists"},
|
||||
{ 4710, AE, "Event not found"},
|
||||
{ 4711, AE, "Creation of event failed"},
|
||||
|
||||
/**
|
||||
* Event internal errors
|
||||
*/
|
||||
|
||||
{ 4731, IE, "Event not found"},
|
||||
|
||||
/**
|
||||
* SchemaError
|
||||
*/
|
||||
|
@@ -80,19 +80,21 @@ int main(int argc, char** argv){
|
||||
Ndb_cluster_connection con(opt_connect_str);
|
||||
if(con.connect(12, 5, 1) != 0)
|
||||
{
|
||||
ndbout << "Unable to connect to management server." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
if (con.wait_until_ready(30,0) < 0)
|
||||
{
|
||||
ndbout << "Cluster nodes not ready in 30 seconds." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
if(MyNdb.init() != 0){
|
||||
ERR(MyNdb.getNdbError());
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
|
||||
// Connect to Ndb and wait for it to become ready
|
||||
while(MyNdb.waitUntilReady() != 0)
|
||||
ndbout << "Waiting for ndb to become ready..." << endl;
|
||||
|
||||
// Check if table exists in db
|
||||
int res = NDBT_OK;
|
||||
for(int i = 0; i<argc; i++){
|
||||
@@ -148,11 +150,11 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if( pOp->readTuplesExclusive(par) ) {
|
||||
if( pOp->readTuples(NdbOperation::LM_Exclusive,par) ) {
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if(pTrans->execute(NoCommit) != 0){
|
||||
if(pTrans->execute(NdbTransaction::NoCommit) != 0){
|
||||
err = pTrans->getNdbError();
|
||||
if(err.status == NdbError::TemporaryError){
|
||||
ERR(err);
|
||||
@@ -172,7 +174,7 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism)
|
||||
} while((check = pOp->nextResult(false)) == 0);
|
||||
|
||||
if(check != -1){
|
||||
check = pTrans->execute(Commit);
|
||||
check = pTrans->execute(NdbTransaction::Commit);
|
||||
pTrans->restart();
|
||||
}
|
||||
|
||||
|
@@ -80,19 +80,22 @@ int main(int argc, char** argv){
|
||||
Ndb_cluster_connection con(opt_connect_str);
|
||||
if(con.connect(12, 5, 1) != 0)
|
||||
{
|
||||
ndbout << "Unable to connect to management server." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
if (con.wait_until_ready(30,0) < 0)
|
||||
{
|
||||
ndbout << "Cluster nodes not ready in 30 seconds." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
|
||||
Ndb* pMyNdb = new Ndb(&con, _dbname);
|
||||
pMyNdb->init();
|
||||
|
||||
ndbout << "Waiting...";
|
||||
while (pMyNdb->waitUntilReady() != 0) {
|
||||
ndbout << "...";
|
||||
Ndb MyNdb(&con, _dbname);
|
||||
if(MyNdb.init() != 0){
|
||||
ERR(MyNdb.getNdbError());
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
ndbout << endl;
|
||||
|
||||
NdbDictionary::Dictionary * dict = pMyNdb->getDictionary();
|
||||
const NdbDictionary::Dictionary * dict= MyNdb.getDictionary();
|
||||
for (int i = 0; i < argc; i++) {
|
||||
NDBT_Table* pTab = (NDBT_Table*)dict->getTable(argv[i]);
|
||||
if (pTab != 0){
|
||||
@@ -132,6 +135,5 @@ int main(int argc, char** argv){
|
||||
ndbout << argv[i] << ": " << dict->getNdbError() << endl;
|
||||
}
|
||||
|
||||
delete pMyNdb;
|
||||
return NDBT_ProgramExit(NDBT_OK);
|
||||
}
|
||||
|
@@ -83,16 +83,18 @@ int main(int argc, char** argv){
|
||||
{
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
if (con.wait_until_ready(30,0) < 0)
|
||||
{
|
||||
ndbout << "Cluster nodes not ready in 30 seconds." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
if(MyNdb.init() != 0){
|
||||
ERR(MyNdb.getNdbError());
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
|
||||
while(MyNdb.waitUntilReady() != 0)
|
||||
ndbout << "Waiting for ndb to become ready..." << endl;
|
||||
|
||||
int res = 0;
|
||||
for(int i = 0; i<argc; i++){
|
||||
ndbout << "Dropping index " << argv[i] << "...";
|
||||
|
@@ -81,18 +81,21 @@ int main(int argc, char** argv){
|
||||
Ndb_cluster_connection con(opt_connect_str);
|
||||
if(con.connect(12, 5, 1) != 0)
|
||||
{
|
||||
ndbout << "Unable to connect to management server." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
if (con.wait_until_ready(30,0) < 0)
|
||||
{
|
||||
ndbout << "Cluster nodes not ready in 30 seconds." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
if(MyNdb.init() != 0){
|
||||
ERR(MyNdb.getNdbError());
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
|
||||
while(MyNdb.waitUntilReady() != 0)
|
||||
ndbout << "Waiting for ndb to become ready..." << endl;
|
||||
|
||||
int res = 0;
|
||||
for(int i = 0; i<argc; i++){
|
||||
ndbout << "Dropping table " << argv[i] << "...";
|
||||
|
@@ -29,7 +29,7 @@
|
||||
|
||||
static Ndb_cluster_connection *ndb_cluster_connection= 0;
|
||||
static Ndb* ndb = 0;
|
||||
static NdbDictionary::Dictionary* dic = 0;
|
||||
static const NdbDictionary::Dictionary * dic = 0;
|
||||
static int _unqualified = 0;
|
||||
|
||||
static void
|
||||
@@ -233,16 +233,19 @@ int main(int argc, char** argv){
|
||||
|
||||
ndb_cluster_connection = new Ndb_cluster_connection(opt_connect_str);
|
||||
if (ndb_cluster_connection->connect(12,5,1))
|
||||
fatal("unable to connect");
|
||||
fatal("Unable to connect to management server.");
|
||||
if (ndb_cluster_connection->wait_until_ready(30,0) < 0)
|
||||
fatal("Cluster nodes not ready in 30 seconds.");
|
||||
|
||||
ndb = new Ndb(ndb_cluster_connection, _dbname);
|
||||
if (ndb->init() != 0)
|
||||
fatal("init");
|
||||
if (ndb->waitUntilReady(30) < 0)
|
||||
fatal("waitUntilReady");
|
||||
dic = ndb->getDictionary();
|
||||
for (int i = 0; _loops == 0 || i < _loops; i++) {
|
||||
list(_tabname, (NdbDictionary::Object::Type)_type);
|
||||
}
|
||||
delete ndb;
|
||||
delete ndb_cluster_connection;
|
||||
return NDBT_ProgramExit(NDBT_OK);
|
||||
}
|
||||
|
||||
|
@@ -375,7 +375,8 @@ void BackupRestore::tuple_a(restore_callback_t *cb)
|
||||
}
|
||||
|
||||
// Prepare transaction (the transaction is NOT yet sent to NDB)
|
||||
cb->connection->executeAsynchPrepare(Commit, &callback, cb);
|
||||
cb->connection->executeAsynchPrepare(NdbTransaction::Commit,
|
||||
&callback, cb);
|
||||
m_transactions++;
|
||||
return;
|
||||
}
|
||||
@@ -543,7 +544,7 @@ BackupRestore::logEntry(const LogEntry & tup)
|
||||
op->setValue(attr->Desc->attrId, dataPtr, length);
|
||||
}
|
||||
|
||||
const int ret = trans->execute(Commit);
|
||||
const int ret = trans->execute(NdbTransaction::Commit);
|
||||
if (ret != 0)
|
||||
{
|
||||
// Both insert update and delete can fail during log running
|
||||
@@ -654,7 +655,7 @@ BackupRestore::tuple(const TupleS & tup)
|
||||
else
|
||||
op->setValue(i, dataPtr, length);
|
||||
}
|
||||
int ret = trans->execute(Commit);
|
||||
int ret = trans->execute(NdbTransaction::Commit);
|
||||
if (ret != 0)
|
||||
{
|
||||
ndbout << "execute failed: ";
|
||||
|
@@ -24,7 +24,6 @@
|
||||
#include <NdbMain.h>
|
||||
#include <NDBT.hpp>
|
||||
#include <NdbSleep.h>
|
||||
#include <NdbScanFilter.hpp>
|
||||
|
||||
int scanReadRecords(Ndb*,
|
||||
const NdbDictionary::Table*,
|
||||
@@ -127,19 +126,21 @@ int main(int argc, char** argv){
|
||||
Ndb_cluster_connection con(opt_connect_str);
|
||||
if(con.connect(12, 5, 1) != 0)
|
||||
{
|
||||
ndbout << "Unable to connect to management server." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
if (con.wait_until_ready(30,0) < 0)
|
||||
{
|
||||
ndbout << "Cluster nodes not ready in 30 seconds." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
if(MyNdb.init() != 0){
|
||||
ERR(MyNdb.getNdbError());
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
|
||||
// Connect to Ndb and wait for it to become ready
|
||||
while(MyNdb.waitUntilReady() != 0)
|
||||
ndbout << "Waiting for ndb to become ready..." << endl;
|
||||
|
||||
// Check if table exists in db
|
||||
const NdbDictionary::Table* pTab = NDBT_Table::discoverTableFromDb(&MyNdb, _tabname);
|
||||
const NdbDictionary::Index * pIdx = 0;
|
||||
@@ -320,7 +321,7 @@ int scanReadRecords(Ndb* pNdb,
|
||||
}
|
||||
}
|
||||
|
||||
check = pTrans->execute(NoCommit);
|
||||
check = pTrans->execute(NdbTransaction::NoCommit);
|
||||
if( check == -1 ) {
|
||||
const NdbError err = pTrans->getNdbError();
|
||||
|
||||
|
@@ -100,19 +100,21 @@ int main(int argc, char** argv){
|
||||
Ndb_cluster_connection con(opt_connect_str);
|
||||
if(con.connect(12, 5, 1) != 0)
|
||||
{
|
||||
ndbout << "Unable to connect to management server." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
if (con.wait_until_ready(30,0) < 0)
|
||||
{
|
||||
ndbout << "Cluster nodes not ready in 30 seconds." << endl;
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
|
||||
Ndb MyNdb(&con, _dbname );
|
||||
if(MyNdb.init() != 0){
|
||||
ERR(MyNdb.getNdbError());
|
||||
return NDBT_ProgramExit(NDBT_FAILED);
|
||||
}
|
||||
|
||||
// Connect to Ndb and wait for it to become ready
|
||||
while(MyNdb.waitUntilReady() != 0)
|
||||
ndbout << "Waiting for ndb to become ready..." << endl;
|
||||
|
||||
for(int i = 0; i<argc; i++){
|
||||
// Check if table exists in db
|
||||
const NdbDictionary::Table * pTab = NDBT_Table::discoverTableFromDb(&MyNdb, argv[i]);
|
||||
@@ -189,7 +191,7 @@ select_count(Ndb* pNdb, const NdbDictionary::Table* pTab,
|
||||
Uint32 row_size;
|
||||
pOp->getValue(NdbDictionary::Column::ROW_COUNT, (char*)&tmp);
|
||||
pOp->getValue(NdbDictionary::Column::ROW_SIZE, (char*)&row_size);
|
||||
check = pTrans->execute(NoCommit);
|
||||
check = pTrans->execute(NdbTransaction::NoCommit);
|
||||
if( check == -1 ) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
|
@@ -161,7 +161,9 @@ int execute_no_commit(ha_ndbcluster *h, NdbTransaction *trans)
|
||||
if (m_batch_execute)
|
||||
return 0;
|
||||
#endif
|
||||
return trans->execute(NoCommit,AbortOnError,h->m_force_send);
|
||||
return trans->execute(NdbTransaction::NoCommit,
|
||||
NdbTransaction::AbortOnError,
|
||||
h->m_force_send);
|
||||
}
|
||||
|
||||
inline
|
||||
@@ -172,7 +174,9 @@ int execute_commit(ha_ndbcluster *h, NdbTransaction *trans)
|
||||
if (m_batch_execute)
|
||||
return 0;
|
||||
#endif
|
||||
return trans->execute(Commit,AbortOnError,h->m_force_send);
|
||||
return trans->execute(NdbTransaction::Commit,
|
||||
NdbTransaction::AbortOnError,
|
||||
h->m_force_send);
|
||||
}
|
||||
|
||||
inline
|
||||
@@ -183,7 +187,9 @@ int execute_commit(THD *thd, NdbTransaction *trans)
|
||||
if (m_batch_execute)
|
||||
return 0;
|
||||
#endif
|
||||
return trans->execute(Commit,AbortOnError,thd->variables.ndb_force_send);
|
||||
return trans->execute(NdbTransaction::Commit,
|
||||
NdbTransaction::AbortOnError,
|
||||
thd->variables.ndb_force_send);
|
||||
}
|
||||
|
||||
inline
|
||||
@@ -194,7 +200,9 @@ int execute_no_commit_ie(ha_ndbcluster *h, NdbTransaction *trans)
|
||||
if (m_batch_execute)
|
||||
return 0;
|
||||
#endif
|
||||
return trans->execute(NoCommit,AO_IgnoreError,h->m_force_send);
|
||||
return trans->execute(NdbTransaction::NoCommit,
|
||||
NdbTransaction::AO_IgnoreError,
|
||||
h->m_force_send);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3345,7 +3353,7 @@ int ndbcluster_rollback(THD *thd, void *ndb_transaction)
|
||||
"stmt" : "all"));
|
||||
DBUG_ASSERT(ndb && trans);
|
||||
|
||||
if (trans->execute(Rollback) != 0)
|
||||
if (trans->execute(NdbTransaction::Rollback) != 0)
|
||||
{
|
||||
const NdbError err= trans->getNdbError();
|
||||
const NdbOperation *error_op= trans->getNdbErrorOperation();
|
||||
@@ -4863,7 +4871,9 @@ ndb_get_table_statistics(Ndb* ndb, const char * table,
|
||||
pOp->getValue(NdbDictionary::Column::ROW_COUNT, (char*)&rows);
|
||||
pOp->getValue(NdbDictionary::Column::COMMIT_COUNT, (char*)&commits);
|
||||
|
||||
check= pTrans->execute(NoCommit, AbortOnError, TRUE);
|
||||
check= pTrans->execute(NdbTransaction::NoCommit,
|
||||
NdbTransaction::AbortOnError,
|
||||
TRUE);
|
||||
if (check == -1)
|
||||
break;
|
||||
|
||||
|
Reference in New Issue
Block a user