From 2e7148576c8ecaf1f377fcf8f9cebb95b341cd2e Mon Sep 17 00:00:00 2001 From: "tomas@poseidon.ndb.mysql.com" <> Date: Tue, 4 Jan 2005 16:15:15 +0100 Subject: [PATCH 1/8] changed example names and updated some docs --- ndb/examples/Makefile | 9 +- .../Makefile | 6 +- .../ndbapi_async1.cpp} | 2 +- .../Makefile | 6 +- .../ndbapi_event.cpp} | 33 +++- .../Makefile | 6 +- .../ndbapi_retries.cpp} | 4 +- .../Makefile | 2 +- .../ndbapi_simple.cpp} | 2 +- .../Makefile | 2 +- .../ndbapi_simple_index.cpp} | 2 +- ndb/include/ndbapi/Ndb.hpp | 148 +++++++++--------- ndb/include/ndbapi/NdbDictionary.hpp | 2 +- ndb/include/ndbapi/NdbError.hpp | 2 +- ndb/include/ndbapi/NdbEventOperation.hpp | 2 +- ndb/include/ndbapi/NdbOperation.hpp | 15 +- ndb/include/ndbapi/NdbRecAttr.hpp | 2 +- ndb/include/ndbapi/NdbTransaction.hpp | 10 +- 18 files changed, 156 insertions(+), 99 deletions(-) rename ndb/examples/{ndbapi_example3 => ndbapi_async_example1}/Makefile (85%) rename ndb/examples/{ndbapi_example2/ndbapi_example2.cpp => ndbapi_async_example1/ndbapi_async1.cpp} (98%) rename ndb/examples/{ndbapi_example5 => ndbapi_event_example}/Makefile (87%) rename ndb/examples/{ndbapi_example5/ndbapi_example5.cpp => ndbapi_event_example/ndbapi_event.cpp} (91%) rename ndb/examples/{ndbapi_example2 => ndbapi_retries_example}/Makefile (85%) rename ndb/examples/{ndbapi_example3/ndbapi_example3.cpp => ndbapi_retries_example/ndbapi_retries.cpp} (98%) rename ndb/examples/{ndbapi_example1 => ndbapi_simple_example}/Makefile (96%) rename ndb/examples/{ndbapi_example1/ndbapi_example1.cpp => ndbapi_simple_example/ndbapi_simple.cpp} (99%) rename ndb/examples/{ndbapi_example4 => ndbapi_simple_index_example}/Makefile (95%) rename ndb/examples/{ndbapi_example4/ndbapi_example4.cpp => ndbapi_simple_index_example/ndbapi_simple_index.cpp} (99%) diff --git a/ndb/examples/Makefile b/ndb/examples/Makefile index d533c4ff422..87a821773ec 100644 --- a/ndb/examples/Makefile +++ b/ndb/examples/Makefile @@ -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)) diff --git a/ndb/examples/ndbapi_example3/Makefile b/ndb/examples/ndbapi_async_example1/Makefile similarity index 85% rename from ndb/examples/ndbapi_example3/Makefile rename to ndb/examples/ndbapi_async_example1/Makefile index d7355650ada..b6fc31a00e5 100644 --- a/ndb/examples/ndbapi_example3/Makefile +++ b/ndb/examples/ndbapi_async_example1/Makefile @@ -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 = diff --git a/ndb/examples/ndbapi_example2/ndbapi_example2.cpp b/ndb/examples/ndbapi_async_example1/ndbapi_async1.cpp similarity index 98% rename from ndb/examples/ndbapi_example2/ndbapi_example2.cpp rename to ndb/examples/ndbapi_async_example1/ndbapi_async1.cpp index de19cb19584..9af9c72c260 100644 --- a/ndb/examples/ndbapi_example2/ndbapi_example2.cpp +++ b/ndb/examples/ndbapi_async_example1/ndbapi_async1.cpp @@ -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. diff --git a/ndb/examples/ndbapi_example5/Makefile b/ndb/examples/ndbapi_event_example/Makefile similarity index 87% rename from ndb/examples/ndbapi_example5/Makefile rename to ndb/examples/ndbapi_event_example/Makefile index 67460402210..07d244c9346 100644 --- a/ndb/examples/ndbapi_example5/Makefile +++ b/ndb/examples/ndbapi_event_example/Makefile @@ -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 = diff --git a/ndb/examples/ndbapi_example5/ndbapi_example5.cpp b/ndb/examples/ndbapi_event_example/ndbapi_event.cpp similarity index 91% rename from ndb/examples/ndbapi_example5/ndbapi_example5.cpp rename to ndb/examples/ndbapi_event_example/ndbapi_event.cpp index e2e29e2d62c..82e39e32d13 100644 --- a/ndb/examples/ndbapi_example5/ndbapi_example5.cpp +++ b/ndb/examples/ndbapi_event_example/ndbapi_event.cpp @@ -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 diff --git a/ndb/examples/ndbapi_example2/Makefile b/ndb/examples/ndbapi_retries_example/Makefile similarity index 85% rename from ndb/examples/ndbapi_example2/Makefile rename to ndb/examples/ndbapi_retries_example/Makefile index 53dfb047beb..c7a8946cd9a 100644 --- a/ndb/examples/ndbapi_example2/Makefile +++ b/ndb/examples/ndbapi_retries_example/Makefile @@ -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 = diff --git a/ndb/examples/ndbapi_example3/ndbapi_example3.cpp b/ndb/examples/ndbapi_retries_example/ndbapi_retries.cpp similarity index 98% rename from ndb/examples/ndbapi_example3/ndbapi_example3.cpp rename to ndb/examples/ndbapi_retries_example/ndbapi_retries.cpp index 9d2014c4eb4..e832964ee94 100644 --- a/ndb/examples/ndbapi_example3/ndbapi_example3.cpp +++ b/ndb/examples/ndbapi_retries_example/ndbapi_retries.cpp @@ -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 diff --git a/ndb/examples/ndbapi_example1/Makefile b/ndb/examples/ndbapi_simple_example/Makefile similarity index 96% rename from ndb/examples/ndbapi_example1/Makefile rename to ndb/examples/ndbapi_simple_example/Makefile index 8b17700d2e2..99d4bfe68a6 100644 --- a/ndb/examples/ndbapi_example1/Makefile +++ b/ndb/examples/ndbapi_simple_example/Makefile @@ -1,4 +1,4 @@ -TARGET = ndbapi_example1 +TARGET = ndbapi_simple SRCS = $(TARGET).cpp OBJS = $(TARGET).o CXX = g++ diff --git a/ndb/examples/ndbapi_example1/ndbapi_example1.cpp b/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp similarity index 99% rename from ndb/examples/ndbapi_example1/ndbapi_example1.cpp rename to ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp index e033c8f4cca..f97032f66ed 100644 --- a/ndb/examples/ndbapi_example1/ndbapi_example1.cpp +++ b/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp @@ -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: * diff --git a/ndb/examples/ndbapi_example4/Makefile b/ndb/examples/ndbapi_simple_index_example/Makefile similarity index 95% rename from ndb/examples/ndbapi_example4/Makefile rename to ndb/examples/ndbapi_simple_index_example/Makefile index 9bcdc14d437..dc17ff0eeaa 100644 --- a/ndb/examples/ndbapi_example4/Makefile +++ b/ndb/examples/ndbapi_simple_index_example/Makefile @@ -1,4 +1,4 @@ -TARGET = ndbapi_example4 +TARGET = ndbapi_simple_index SRCS = $(TARGET).cpp OBJS = $(TARGET).o CXX = g++ diff --git a/ndb/examples/ndbapi_example4/ndbapi_example4.cpp b/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp similarity index 99% rename from ndb/examples/ndbapi_example4/ndbapi_example4.cpp rename to ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp index 5073794a713..efd77b96eae 100644 --- a/ndb/examples/ndbapi_example4/ndbapi_example4.cpp +++ b/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp @@ -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: // diff --git a/ndb/include/ndbapi/Ndb.hpp b/ndb/include/ndbapi/Ndb.hpp index 97e869baf9b..666a3597fba 100644 --- a/ndb/include/ndbapi/Ndb.hpp +++ b/ndb/include/ndbapi/Ndb.hpp @@ -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 Commit, then the transaction is - committed, and no further addition or definition of operations - is allowed. + committed. The transaction must 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.

Single row operations

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.

Step 1: Define single row operation type

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.

Step 2: Specify Search Conditions

- 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()

Step 3: Specify Attribute Actions

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

Step 1: Define scan operation operation type

- 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.

Step 2: Specify Search Conditions

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.

Using Scan to update/delete

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 not 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,12 +325,14 @@

Index scans specific features

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 + - 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. Rows are returned unordered unless sorted is set to true. + @note When performing sorted scan, parameter parallelism to readTuples will be ignored and max parallelism will be used instead. @@ -342,8 +346,8 @@ batch parameter to @ref 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 + @ref 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. @@ -423,25 +427,25 @@ *******************************************************************************/ /** - * @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 */ /** diff --git a/ndb/include/ndbapi/NdbDictionary.hpp b/ndb/include/ndbapi/NdbDictionary.hpp index 8556754e2a6..75232a3cee5 100644 --- a/ndb/include/ndbapi/NdbDictionary.hpp +++ b/ndb/include/ndbapi/NdbDictionary.hpp @@ -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: diff --git a/ndb/include/ndbapi/NdbError.hpp b/ndb/include/ndbapi/NdbError.hpp index 8cde2a8cf38..45dbd5d3995 100644 --- a/ndb/include/ndbapi/NdbError.hpp +++ b/ndb/include/ndbapi/NdbError.hpp @@ -41,7 +41,7 @@ * The error messages and error details may * change without notice. * - * For example of use, see @ref ndbapi_example3.cpp. + * For example of use, see @ref ndbapi_retries.cpp. */ struct NdbError { /** diff --git a/ndb/include/ndbapi/NdbEventOperation.hpp b/ndb/include/ndbapi/NdbEventOperation.hpp index dc02df7fa4a..8c2de36fc51 100644 --- a/ndb/include/ndbapi/NdbEventOperation.hpp +++ b/ndb/include/ndbapi/NdbEventOperation.hpp @@ -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: * diff --git a/ndb/include/ndbapi/NdbOperation.hpp b/ndb/include/ndbapi/NdbOperation.hpp index 4d7db773505..ce556fb5b7a 100644 --- a/ndb/include/ndbapi/NdbOperation.hpp +++ b/ndb/include/ndbapi/NdbOperation.hpp @@ -237,10 +237,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 @@ -248,6 +251,8 @@ public: * strncpy(buf, str, sizeof(buf)); * NdbOperation->equal("Attr1", buf); * @endcode + * + * * * @param anAttrName Attribute name * @param aValue Attribute value. @@ -328,6 +333,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. * diff --git a/ndb/include/ndbapi/NdbRecAttr.hpp b/ndb/include/ndbapi/NdbRecAttr.hpp index 3b596c60d09..86f891dca95 100644 --- a/ndb/include/ndbapi/NdbRecAttr.hpp +++ b/ndb/include/ndbapi/NdbRecAttr.hpp @@ -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 diff --git a/ndb/include/ndbapi/NdbTransaction.hpp b/ndb/include/ndbapi/NdbTransaction.hpp index 10d641c022e..16effcaf05f 100644 --- a/ndb/include/ndbapi/NdbTransaction.hpp +++ b/ndb/include/ndbapi/NdbTransaction.hpp @@ -298,7 +298,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 @@ -366,7 +366,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 From 8b8f17ddd6df97947b64d1c79f39b3a6c5061057 Mon Sep 17 00:00:00 2001 From: "marty@linux.site" <> Date: Tue, 4 Jan 2005 16:18:45 +0100 Subject: [PATCH 2/8] Hide internal unique index naming --- .../ndbapi_simple_index.cpp | 6 +-- ndb/src/ndbapi/NdbTransaction.cpp | 37 +++++++++++++------ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp b/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp index efd77b96eae..39574fae208 100644 --- a/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp +++ b/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp @@ -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); @@ -166,7 +166,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->updateTuple(); @@ -187,7 +187,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->deleteTuple(); diff --git a/ndb/src/ndbapi/NdbTransaction.cpp b/ndb/src/ndbapi/NdbTransaction.cpp index 40a79421fdd..d010c0ae0d8 100644 --- a/ndb/src/ndbapi/NdbTransaction.cpp +++ b/ndb/src/ndbapi/NdbTransaction.cpp @@ -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 - who was fetch by startTransaction pointing to this operation - getOperation will set the theTableId in the NdbScanOperation object.synchronous +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 NdbIndexOperation object.synchronous ******************************************************************************/ NdbIndexOperation* NdbTransaction::getNdbIndexOperation(const char* anIndexName, @@ -1216,8 +1216,21 @@ NdbTransaction::getNdbIndexOperation(const char* anIndexName, { if (theCommitStatus == Started) { NdbTableImpl * table = theNdb->theDictionary->getTable(aTableName); - NdbIndexImpl * index = theNdb->theDictionary->getIndex(anIndexName, - aTableName); + 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); } From 9ca6cd71b1b2e2a6b12dd94e5be7da06d3a30695 Mon Sep 17 00:00:00 2001 From: "tomas@poseidon.ndb.mysql.com" <> Date: Tue, 4 Jan 2005 19:51:59 +0100 Subject: [PATCH 3/8] changed documented method from get/setDistributionKey to get/setPartitionKey + some extra docs on the area updated docs by removing som async stuff --- ndb/include/ndbapi/Ndb.hpp | 89 +++++++++++--------- ndb/include/ndbapi/NdbDictionary.hpp | 27 +++--- ndb/include/ndbapi/NdbIndexScanOperation.hpp | 2 +- ndb/include/ndbapi/NdbOperation.hpp | 2 +- ndb/include/ndbapi/NdbTransaction.hpp | 46 +++++----- ndb/src/ndbapi/NdbDictionary.cpp | 4 +- 6 files changed, 96 insertions(+), 74 deletions(-) diff --git a/ndb/include/ndbapi/Ndb.hpp b/ndb/include/ndbapi/Ndb.hpp index 666a3597fba..dcde0a66872 100644 --- a/ndb/include/ndbapi/Ndb.hpp +++ b/ndb/include/ndbapi/Ndb.hpp @@ -328,12 +328,13 @@ - 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. + - 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 @@ -343,10 +344,10 @@ 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. + 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. @@ -380,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. @@ -392,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 @@ -417,14 +419,14 @@ 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_simple.cpp ndbapi_simple.cpp @@ -458,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 not 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 @@ -514,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 @@ -563,14 +569,17 @@ The application programmer can however hint the NDB API which transaction coordinator to use - by providing a distribution key (usually the primary key). - By using the primary key as distribution key, + by providing a partition key (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 ()". @section secRecordStruct Record Structure @@ -639,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. */ diff --git a/ndb/include/ndbapi/NdbDictionary.hpp b/ndb/include/ndbapi/NdbDictionary.hpp index 75232a3cee5..f25b3a7fbfa 100644 --- a/ndb/include/ndbapi/NdbDictionary.hpp +++ b/ndb/include/ndbapi/NdbDictionary.hpp @@ -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 distribution key is a set of attributes which are used + * A partition key 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 /** @} *******************************************************************/ diff --git a/ndb/include/ndbapi/NdbIndexScanOperation.hpp b/ndb/include/ndbapi/NdbIndexScanOperation.hpp index 6fe4dc3df84..e1a646fa413 100644 --- a/ndb/include/ndbapi/NdbIndexScanOperation.hpp +++ b/ndb/include/ndbapi/NdbIndexScanOperation.hpp @@ -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. diff --git a/ndb/include/ndbapi/NdbOperation.hpp b/ndb/include/ndbapi/NdbOperation.hpp index ce556fb5b7a..58ecb57ded3 100644 --- a/ndb/include/ndbapi/NdbOperation.hpp +++ b/ndb/include/ndbapi/NdbOperation.hpp @@ -731,7 +731,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); diff --git a/ndb/include/ndbapi/NdbTransaction.hpp b/ndb/include/ndbapi/NdbTransaction.hpp index 16effcaf05f..56d87d4b6c0 100644 --- a/ndb/include/ndbapi/NdbTransaction.hpp +++ b/ndb/include/ndbapi/NdbTransaction.hpp @@ -52,7 +52,7 @@ enum AbortOption { TryCommit = 0, ///< Missing explanation #endif AbortOnError = 0, ///< Abort transaction on failed operation - AO_IgnoreError = 2 ///< Transaction continues on failed operation + AO_IgnoreError = 2 ///< Transaction continues on failed operation }; typedef AbortOption CommitType; @@ -76,33 +76,35 @@ enum ExecType { * @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 - * method sends them to the NDB kernel for execution. + * 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: + * A call to execute() uses one out of three types of execution: * -# ExecType::NoCommit Executes operations without committing them. * -# ExecType::Commit Executes remaining operation and commits the * complete transaction * -# ExecType::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). * The transaction is aborted if there are any error during the @@ -345,6 +347,8 @@ public: /** * Close transaction + * + * @note Equivalent to to calling Ndb::closeTransaction() */ #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL /** @@ -415,10 +419,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 @@ -428,6 +429,11 @@ public: NeedAbort ///< Missing explanation }; + /** + * Get the commit status of the transaction. + * + * @return The commit status of the transaction + */ CommitStatusType commitStatus(); /** @} *********************************************************************/ @@ -449,7 +455,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. diff --git a/ndb/src/ndbapi/NdbDictionary.cpp b/ndb/src/ndbapi/NdbDictionary.cpp index fe9b0681772..b7a4419a491 100644 --- a/ndb/src/ndbapi/NdbDictionary.cpp +++ b/ndb/src/ndbapi/NdbDictionary.cpp @@ -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; } From f2b25a6e7288f0e594107ebcf311a4862265be7d Mon Sep 17 00:00:00 2001 From: "tomas@poseidon.ndb.mysql.com" <> Date: Wed, 5 Jan 2005 04:13:46 +0100 Subject: [PATCH 4/8] moved AbortOption and ExecType inside NdbTransaction and provided some backwards compat functions --- ndb/include/ndbapi/NdbBlob.hpp | 4 +- ndb/include/ndbapi/NdbOperation.hpp | 13 ++- ndb/include/ndbapi/NdbTransaction.hpp | 111 +++++++++++++++++++------- ndb/src/ndbapi/NdbBlob.cpp | 45 ++++++----- 4 files changed, 115 insertions(+), 58 deletions(-) diff --git a/ndb/include/ndbapi/NdbBlob.hpp b/ndb/include/ndbapi/NdbBlob.hpp index c02e10b7b76..f9090cb91ba 100644 --- a/ndb/include/ndbapi/NdbBlob.hpp +++ b/ndb/include/ndbapi/NdbBlob.hpp @@ -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 diff --git a/ndb/include/ndbapi/NdbOperation.hpp b/ndb/include/ndbapi/NdbOperation.hpp index 58ecb57ded3..06715233726 100644 --- a/ndb/include/ndbapi/NdbOperation.hpp +++ b/ndb/include/ndbapi/NdbOperation.hpp @@ -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 }; diff --git a/ndb/include/ndbapi/NdbTransaction.hpp b/ndb/include/ndbapi/NdbTransaction.hpp index 56d87d4b6c0..cbb3ca37994 100644 --- a/ndb/include/ndbapi/NdbTransaction.hpp +++ b/ndb/include/ndbapi/NdbTransaction.hpp @@ -42,34 +42,22 @@ 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, ///< Missing explanation -#endif - AbortOnError = 0, ///< Abort transaction on failed operation - AO_IgnoreError = 2 ///< Transaction continues on failed operation +#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED +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, ///< Missing explanation - 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 @@ -99,17 +87,17 @@ enum ExecType { * before calling execute(). * * A call to execute() uses one out of three types of execution: - * -# ExecType::NoCommit Executes operations without committing them. - * -# ExecType::Commit Executes remaining operation and commits the + * -# 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. * * 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 * */ @@ -141,6 +129,7 @@ enum ExecType { * primary key since it came along from the scanned tuple. * */ + class NdbTransaction { #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL @@ -154,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, ///< Missing explanation +#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. @@ -281,9 +308,15 @@ public: * the send. * @return 0 if successful otherwise -1. */ - int execute(ExecType execType, + 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 @@ -314,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. @@ -332,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 diff --git a/ndb/src/ndbapi/NdbBlob.cpp b/ndb/src/ndbapi/NdbBlob.cpp index 86b161e3b9b..0638f6e4c51 100644 --- a/ndb/src/ndbapi/NdbBlob.cpp +++ b/ndb/src/ndbapi/NdbBlob.cpp @@ -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"); } } From 6f9e9b55da676cdc4949044a122763346ae4fb8b Mon Sep 17 00:00:00 2001 From: "jonas@mysql.com" <> Date: Wed, 5 Jan 2005 13:37:34 +0100 Subject: [PATCH 5/8] ndb - getTable retry if DICT busy --- BitKeeper/etc/logging_ok | 1 + ndb/src/ndbapi/NdbDictionaryImpl.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 2b3339e59d3..04e18ab8892 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -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 diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/ndb/src/ndbapi/NdbDictionaryImpl.cpp index 2d37c7883ec..5a4bfb77541 100644 --- a/ndb/src/ndbapi/NdbDictionaryImpl.cpp +++ b/ndb/src/ndbapi/NdbDictionaryImpl.cpp @@ -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; From 79fb236b0a1e4f8fb75044fef6e5ad4ee9512be6 Mon Sep 17 00:00:00 2001 From: "tomas@poseidon.ndb.mysql.com" <> Date: Wed, 5 Jan 2005 17:59:24 +0100 Subject: [PATCH 6/8] changed to using NdbTransaction scoped enums and removed usage of Ndb::waitUntilReady() --- .../ndbapi_async_example/ndbapi_async.cpp | 2 +- .../ndbapi_async_example1/ndbapi_async1.cpp | 3 ++- .../ndbapi_retries_example/ndbapi_retries.cpp | 4 ++-- .../ndbapi_scan_example/ndbapi_scan.cpp | 14 +++++------ .../ndbapi_simple_example/ndbapi_simple.cpp | 8 +++---- .../ndbapi_simple_index.cpp | 10 ++++---- ndb/include/ndbapi/NdbDictionary.hpp | 5 +++- ndb/include/ndbapi/NdbTransaction.hpp | 2 +- ndb/src/ndbapi/NdbDictionary.cpp | 14 +++++++++++ ndb/tools/delete_all.cpp | 18 +++++++------- ndb/tools/desc.cpp | 24 ++++++++++--------- ndb/tools/drop_index.cpp | 10 ++++---- ndb/tools/drop_tab.cpp | 11 +++++---- ndb/tools/listTables.cpp | 11 +++++---- ndb/tools/restore/consumer_restore.cpp | 7 +++--- ndb/tools/select_all.cpp | 15 ++++++------ ndb/tools/select_count.cpp | 14 ++++++----- sql/ha_ndbcluster.cc | 22 ++++++++++++----- 18 files changed, 119 insertions(+), 75 deletions(-) diff --git a/ndb/examples/ndbapi_async_example/ndbapi_async.cpp b/ndb/examples/ndbapi_async_example/ndbapi_async.cpp index 9fd37f3a670..c11b6e849e4 100644 --- a/ndb/examples/ndbapi_async_example/ndbapi_async.cpp +++ b/ndb/examples/ndbapi_async_example/ndbapi_async.cpp @@ -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); /** diff --git a/ndb/examples/ndbapi_async_example1/ndbapi_async1.cpp b/ndb/examples/ndbapi_async_example1/ndbapi_async1.cpp index 9af9c72c260..fb806a5bbb5 100644 --- a/ndb/examples/ndbapi_async_example1/ndbapi_async1.cpp +++ b/ndb/examples/ndbapi_async_example1/ndbapi_async1.cpp @@ -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 diff --git a/ndb/examples/ndbapi_retries_example/ndbapi_retries.cpp b/ndb/examples/ndbapi_retries_example/ndbapi_retries.cpp index e832964ee94..d14e0cf4553 100644 --- a/ndb/examples/ndbapi_retries_example/ndbapi_retries.cpp +++ b/ndb/examples/ndbapi_retries_example/ndbapi_retries.cpp @@ -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 diff --git a/ndb/examples/ndbapi_scan_example/ndbapi_scan.cpp b/ndb/examples/ndbapi_scan_example/ndbapi_scan.cpp index e886fc08d46..183dd69f648 100644 --- a/ndb/examples/ndbapi_scan_example/ndbapi_scan.cpp +++ b/ndb/examples/ndbapi_scan_example/ndbapi_scan.cpp @@ -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; diff --git a/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp b/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp index f97032f66ed..c8fa494345c 100644 --- a/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp +++ b/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp @@ -170,7 +170,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 +193,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 +214,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 +240,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 { diff --git a/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp b/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp index 39574fae208..7d70dc723f8 100644 --- a/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp +++ b/ndb/examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp @@ -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); @@ -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); @@ -173,7 +173,7 @@ int main() 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); @@ -193,7 +193,7 @@ int main() 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 { diff --git a/ndb/include/ndbapi/NdbDictionary.hpp b/ndb/include/ndbapi/NdbDictionary.hpp index f25b3a7fbfa..b82ba79463e 100644 --- a/ndb/include/ndbapi/NdbDictionary.hpp +++ b/ndb/include/ndbapi/NdbDictionary.hpp @@ -698,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(); } @@ -1010,6 +1010,8 @@ public: * Fetch list of all objects, optionally restricted to given type. */ int listObjects(List & list, Object::Type type = Object::TypeUndefined); + int listObjects(const List & list, + Object::Type type = Object::TypeUndefined) const; /** * Get the latest error @@ -1048,6 +1050,7 @@ public: * @return 0 if successful, otherwise -1 */ int listIndexes(List & list, const char * tableName); + int listIndexes(const List & list, const char * tableName) const; /** @} *******************************************************************/ /** diff --git a/ndb/include/ndbapi/NdbTransaction.hpp b/ndb/include/ndbapi/NdbTransaction.hpp index cbb3ca37994..78724206b4f 100644 --- a/ndb/include/ndbapi/NdbTransaction.hpp +++ b/ndb/include/ndbapi/NdbTransaction.hpp @@ -42,7 +42,7 @@ class NdbBlob; typedef void (* NdbAsynchCallback)(int, NdbTransaction*, void*); #endif -#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED +#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL enum AbortOption { CommitIfFailFree= 0, TryCommit= 0, diff --git a/ndb/src/ndbapi/NdbDictionary.cpp b/ndb/src/ndbapi/NdbDictionary.cpp index b7a4419a491..24cd48cb2a3 100644 --- a/ndb/src/ndbapi/NdbDictionary.cpp +++ b/ndb/src/ndbapi/NdbDictionary.cpp @@ -823,6 +823,13 @@ NdbDictionary::Dictionary::listObjects(List& list, Object::Type type) return m_impl.listObjects(list, type); } +int +NdbDictionary::Dictionary::listObjects(const List& list, + Object::Type type) const +{ + return m_impl.listObjects(*(List*)&list, type); +} + int NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName) { @@ -834,6 +841,13 @@ NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName) return m_impl.listIndexes(list, tab->getTableId()); } +int +NdbDictionary::Dictionary::listIndexes(const List& list, + const char * tableName) const +{ + return listIndexes(*(List *)&list, tableName); +} + const struct NdbError & NdbDictionary::Dictionary::getNdbError() const { return m_impl.getNdbError(); diff --git a/ndb/tools/delete_all.cpp b/ndb/tools/delete_all.cpp index 250fe85d546..38a9cdd9354 100644 --- a/ndb/tools/delete_all.cpp +++ b/ndb/tools/delete_all.cpp @@ -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; ireadTuplesExclusive(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(); } diff --git a/ndb/tools/desc.cpp b/ndb/tools/desc.cpp index 8c84802ef51..4129f775540 100644 --- a/ndb/tools/desc.cpp +++ b/ndb/tools/desc.cpp @@ -80,25 +80,28 @@ 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){ ndbout << (* pTab) << endl; - NdbDictionary::Dictionary::List list; + const NdbDictionary::Dictionary::List list; if (dict->listIndexes(list, argv[i]) != 0){ ndbout << argv[i] << ": " << dict->getNdbError() << endl; return NDBT_ProgramExit(NDBT_FAILED); @@ -132,6 +135,5 @@ int main(int argc, char** argv){ ndbout << argv[i] << ": " << dict->getNdbError() << endl; } - delete pMyNdb; return NDBT_ProgramExit(NDBT_OK); } diff --git a/ndb/tools/drop_index.cpp b/ndb/tools/drop_index.cpp index cc0dd9a8be6..47baee0b66f 100644 --- a/ndb/tools/drop_index.cpp +++ b/ndb/tools/drop_index.cpp @@ -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; iconnect(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); } diff --git a/ndb/tools/restore/consumer_restore.cpp b/ndb/tools/restore/consumer_restore.cpp index 2a5cda29027..d72b82569e2 100644 --- a/ndb/tools/restore/consumer_restore.cpp +++ b/ndb/tools/restore/consumer_restore.cpp @@ -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: "; diff --git a/ndb/tools/select_all.cpp b/ndb/tools/select_all.cpp index 94007d422e1..ecb7db91060 100644 --- a/ndb/tools/select_all.cpp +++ b/ndb/tools/select_all.cpp @@ -24,7 +24,6 @@ #include #include #include -#include 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(); diff --git a/ndb/tools/select_count.cpp b/ndb/tools/select_count.cpp index abba39c4d2e..f2b78de4b37 100644 --- a/ndb/tools/select_count.cpp +++ b/ndb/tools/select_count.cpp @@ -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; igetValue(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); diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 37b3e6cfa00..3cd418b776a 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -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; From fa5127e2ff6d99657ddef9bfc4640fefd93d676e Mon Sep 17 00:00:00 2001 From: "tomas@poseidon.ndb.mysql.com" <> Date: Wed, 5 Jan 2005 19:59:45 +0100 Subject: [PATCH 7/8] last go at enabling using const NdbDictionary didn't work + some docs update on events --- .../ndbapi_simple_example/ndbapi_simple.cpp | 3 +- ndb/include/ndbapi/NdbDictionary.hpp | 31 +++++++++++++------ ndb/src/ndbapi/NdbDictionary.cpp | 14 ++++++--- ndb/tools/desc.cpp | 2 +- ndb/tools/listTables.cpp | 2 +- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp b/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp index c8fa494345c..82b7abc16eb 100644 --- a/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp +++ b/ndb/examples/ndbapi_simple_example/ndbapi_simple.cpp @@ -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" diff --git a/ndb/include/ndbapi/NdbDictionary.hpp b/ndb/include/ndbapi/NdbDictionary.hpp index b82ba79463e..250942bbf82 100644 --- a/ndb/include/ndbapi/NdbDictionary.hpp +++ b/ndb/include/ndbapi/NdbDictionary.hpp @@ -901,21 +901,32 @@ 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 +#endif + ,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); @@ -1010,7 +1021,7 @@ public: * Fetch list of all objects, optionally restricted to given type. */ int listObjects(List & list, Object::Type type = Object::TypeUndefined); - int listObjects(const List & list, + int listObjects(List & list, Object::Type type = Object::TypeUndefined) const; /** @@ -1050,7 +1061,7 @@ public: * @return 0 if successful, otherwise -1 */ int listIndexes(List & list, const char * tableName); - int listIndexes(const List & list, const char * tableName) const; + int listIndexes(List & list, const char * tableName) const; /** @} *******************************************************************/ /** diff --git a/ndb/src/ndbapi/NdbDictionary.cpp b/ndb/src/ndbapi/NdbDictionary.cpp index 24cd48cb2a3..f641b8cd5a0 100644 --- a/ndb/src/ndbapi/NdbDictionary.cpp +++ b/ndb/src/ndbapi/NdbDictionary.cpp @@ -824,10 +824,9 @@ NdbDictionary::Dictionary::listObjects(List& list, Object::Type type) } int -NdbDictionary::Dictionary::listObjects(const List& list, - Object::Type type) const +NdbDictionary::Dictionary::listObjects(List& list, Object::Type type) const { - return m_impl.listObjects(*(List*)&list, type); + return m_impl.listObjects(list, type); } int @@ -842,10 +841,15 @@ NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName) } int -NdbDictionary::Dictionary::listIndexes(const List& list, +NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName) const { - return listIndexes(*(List *)&list, tableName); + const NdbDictionary::Table* tab= getTable(tableName); + if(tab == 0) + { + return -1; + } + return m_impl.listIndexes(list, tab->getTableId()); } const struct NdbError & diff --git a/ndb/tools/desc.cpp b/ndb/tools/desc.cpp index 4129f775540..b18f97a05b1 100644 --- a/ndb/tools/desc.cpp +++ b/ndb/tools/desc.cpp @@ -101,7 +101,7 @@ int main(int argc, char** argv){ if (pTab != 0){ ndbout << (* pTab) << endl; - const NdbDictionary::Dictionary::List list; + NdbDictionary::Dictionary::List list; if (dict->listIndexes(list, argv[i]) != 0){ ndbout << argv[i] << ": " << dict->getNdbError() << endl; return NDBT_ProgramExit(NDBT_FAILED); diff --git a/ndb/tools/listTables.cpp b/ndb/tools/listTables.cpp index fbad9eeba87..e018bd6d9a5 100644 --- a/ndb/tools/listTables.cpp +++ b/ndb/tools/listTables.cpp @@ -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 From 45738d53ea0d2fdddc44574a356b09f42ce7d9d2 Mon Sep 17 00:00:00 2001 From: "tomas@poseidon.ndb.mysql.com" <> Date: Wed, 5 Jan 2005 21:22:37 +0100 Subject: [PATCH 8/8] ndbapi event code cleanup + some more docs on event --- .../ndbapi_event_example/ndbapi_event.cpp | 47 +++++++++---------- ndb/include/kernel/signaldata/CreateEvnt.hpp | 13 +++-- ndb/include/ndbapi/NdbDictionary.hpp | 47 +++++++++++++++++-- ndb/src/ndbapi/NdbDictionaryImpl.cpp | 5 +- ndb/src/ndbapi/ndberror.c | 17 +++++++ 5 files changed, 90 insertions(+), 39 deletions(-) diff --git a/ndb/examples/ndbapi_event_example/ndbapi_event.cpp b/ndb/examples/ndbapi_event_example/ndbapi_event.cpp index 82e39e32d13..1c2c9ab5ac4 100644 --- a/ndb/examples/ndbapi_event_example/ndbapi_event.cpp +++ b/ndb/examples/ndbapi_event_example/ndbapi_event.cpp @@ -36,7 +36,7 @@ * * NdbDictionary::Event * setTable() - * addtableEvent() + * addTableEvent() * addEventColumn() * * NdbEventOperation @@ -63,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 * @@ -199,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 @@ -212,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++; } @@ -220,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; @@ -232,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()); @@ -245,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; } diff --git a/ndb/include/kernel/signaldata/CreateEvnt.hpp b/ndb/include/kernel/signaldata/CreateEvnt.hpp index e911fa36ce6..c381377c54f 100644 --- a/ndb/include/kernel/signaldata/CreateEvnt.hpp +++ b/ndb/include/kernel/signaldata/CreateEvnt.hpp @@ -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 }; diff --git a/ndb/include/ndbapi/NdbDictionary.hpp b/ndb/include/ndbapi/NdbDictionary.hpp index 250942bbf82..700591d6cdf 100644 --- a/ndb/include/ndbapi/NdbDictionary.hpp +++ b/ndb/include/ndbapi/NdbDictionary.hpp @@ -931,13 +931,50 @@ public: 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); /** @@ -950,7 +987,9 @@ public: */ virtual int getObjectVersion() const; +#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL void print(); +#endif private: #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/ndb/src/ndbapi/NdbDictionaryImpl.cpp index 5a4bfb77541..9be4e8ef8cf 100644 --- a/ndb/src/ndbapi/NdbDictionaryImpl.cpp +++ b/ndb/src/ndbapi/NdbDictionaryImpl.cpp @@ -2236,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; } diff --git a/ndb/src/ndbapi/ndberror.c b/ndb/src/ndbapi/ndberror.c index dd4a1cf0b9e..d1e3b5efa2e 100644 --- a/ndb/src/ndbapi/ndberror.c +++ b/ndb/src/ndbapi/ndberror.c @@ -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 */