/* Copyright (C) 2003 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef NdbConnection_H #define NdbConnection_H #include #include "NdbError.hpp" #include "NdbDictionary.hpp" #include "Ndb.hpp" class NdbConnection; class NdbOperation; class NdbScanOperation; class NdbIndexScanOperation; class NdbIndexOperation; class NdbApiSignal; class Ndb; class NdbBlob; /** * NdbAsynchCallback functions are used when executing asynchronous * transactions (using NdbConnection::executeAsynchPrepare, or * NdbConnection::executeAsynch). * The functions are called when the execute has finished. * See @ref secAsync for more information. */ typedef void (* NdbAsynchCallback)(int, NdbConnection*, void*); /** * 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 }; 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 }; /** * @class NdbConnection * @brief Represents a transaction. * * A transaction (represented by an NdbConnection object) * belongs to an Ndb object and is typically created using * Ndb::startTransaction. * A transaction consists of a list of operations * (represented by NdbOperation objects). * Each operation access exactly one table. * * After getting the NdbConnection object, * the first step is to get (allocate) an operation given the table name. * Then the operation is defined. * Several operations can be defined in parallel on the same * NdbConnection object. * When all operations are defined, the NdbConnection::execute * method sends them to the NDB kernel for execution. * * The NdbConnection::execute method returns when the NDB kernel has * completed execution of all operations defined before the call to * NdbConnection::execute. * All allocated operations should be properly defined * before calling NdbConnection::execute. * * A call to NdbConnection::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. * * NdbConnection::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 * execution * -# AbortOption::IgnoreError * Continue execution of transaction even if operation fails * * NdbConnection::execute can sometimes indicate an error * (return with -1) while the error code on the NdbConnection is 0. * This is an indication that one of the operations found a record * problem. The transaction is still ok and can continue as usual. * The NdbConnection::execute returns -1 together with error code * on NdbConnection object equal to 0 always means that an * operation was not successful but that the total transaction was OK. * By checking error codes on the individual operations it is possible * to find out which operation was not successful. * * NdbConnection::executeScan is used to setup a scan in the NDB kernel * after it has been defined. * NdbConnection::nextScanResult is used to iterate through the * scanned tuples. * After each call to NdbConnection::nextScanResult, the pointers * of NdbRecAttr objects defined in the NdbOperation::getValue * operations are updated with the values of the new the scanned tuple. */ /* FUTURE IMPLEMENTATION: * Later a prepare mode will be added when Ndb supports Prepare-To-Commit * The NdbConnection can deliver the Transaction Id of the transaction. * After committing a transaction it is also possible to retrieve the * global transaction checkpoint which the transaction was put in. * * FUTURE IMPLEMENTATION: * There are three methods for acquiring the NdbOperation. * -# The first method is the normal where a table name is * provided. In this case the primary key must be supplied through * the use of the NdbOperation::equal methods on the NdbOperation object. * -# The second method provides the tuple identity of the tuple to be * read. The tuple identity contains a table identifier and will * thus be possible to use to ensure the attribute names provided * are correct. If an object-oriented layer is put on top of NDB * Cluster it is essential that all tables derived from a base * class has the same attributes with the same type and the same * name. Thus the application can use the tuple identity and need * not known the table of the tuple. As long as the table is * derived from the known base class everything is ok. * It is not possible to provide any primary key since it is * already supplied with the call to NdbConnection::getNdbOperation. * -# The third method is used when a scanned tuple is to be transferred to * another transaction. In this case it is not possible to define the * primary key since it came along from the scanned tuple. * */ class NdbConnection { friend class Ndb; friend class NdbOperation; friend class NdbScanOperation; friend class NdbIndexOperation; friend class NdbIndexScanOperation; friend class NdbBlob; public: /** * Get an NdbOperation for a table. * Note that the operation has to be defined before it is executed. * * @note All operations within the same transaction need to * be initialized with this method. * * @param aTableName The table name. * @return Pointer to an NdbOperation object if successful, otherwise NULL. */ NdbOperation* getNdbOperation(const char* aTableName); /** * Get an operation from NdbScanOperation idlelist and * get the NdbConnection object which * was fetched by startTransaction pointing to this operation. * * @param aTableName a table name. * @return pointer to an NdbOperation object if successful, otherwise NULL */ NdbScanOperation* getNdbScanOperation(const char* aTableName); /** * Get an operation from NdbScanOperation idlelist and * get the NdbConnection object which * was fetched by startTransaction pointing to this operation. * * @param anIndexName The index name. * @param aTableName a table name. * @return pointer to an NdbOperation object if successful, otherwise NULL */ NdbIndexScanOperation* getNdbIndexScanOperation(const char* anIndexName, const char* aTableName); /** * Get an operation from NdbIndexOperation idlelist and * get the NdbConnection object that * was fetched by startTransaction pointing to this operation. * * @param indexName An index name (as created by createIndex). * @param tableName A table name. * @return Pointer to an NdbIndexOperation object if * successful, otherwise NULL */ NdbIndexOperation* getNdbIndexOperation(const char* indexName, const char* tableName); /** * @name Execute Transaction * @{ */ /** * Executes transaction. * * @param execType Execution type:
* ExecType::NoCommit executes operations without * committing them.
* ExecType::Commit executes remaining operations and * commits the complete transaction.
* ExecType::Rollback rollbacks the entire transaction. * @param abortOption Handling of error while excuting * AbortOnError - Abort transaction if an operation fail * IgnoreError - Accept failing operations * @param force When operations should be sent to NDB Kernel. * (See @ref secAdapt.) * - 0: non-force, adaptive algorithm notices it * (default); * - 1: force send, adaptive algorithm notices it; * - 2: non-force, adaptive algorithm do not notice * the send. * @return 0 if successful otherwise -1. */ int execute(ExecType execType, AbortOption abortOption = AbortOnError, int force = 0 ); /** * Prepare an asynchronous transaction. * * See @ref secAsync for more information on * how to use this method. * * @param execType Execution type:
* ExecType::NoCommit executes operations without committing them.
* ExecType::Commit executes remaining operations and commits the * complete transaction.
* 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 * for an example on how to specify and use * a callback method. * @param anyObject A void pointer. This pointer is forwarded to the * callback method and can be used to give * the callback method some data to work on. * It is up to the application programmer * to decide on the use of this pointer. * @param abortOption see @ref execute */ void executeAsynchPrepare(ExecType execType, NdbAsynchCallback callback, void* anyObject, AbortOption abortOption = AbortOnError); /** * Prepare and send an asynchronous transaction. * * This method perform the same action as * NdbConnection::executeAsynchPrepare * but also sends the operations to the NDB kernel. * * See NdbConnection::executeAsynchPrepare for information * about the parameters of this method. * * See @ref secAsync for more information on * how to use this method. */ void executeAsynch(ExecType aTypeOfExec, NdbAsynchCallback aCallback, void* anyObject, AbortOption abortOption = AbortOnError); /** * Refresh * Update timeout counter of this transaction * in the database. If you want to keep the transaction * active in the database longer than the * transaction abort timeout. * @note It's not advised to take a lock on a record and keep it * for a extended time since this can impact other transactions. * */ int refresh(); /** * Close transaction * @note It is not allowed to call NdbConnection::close after sending the * transaction asynchronously before the callback method has * been called. * (The application should keep track of the number of * outstanding transactions and wait until all of them * has completed before calling NdbConnection::close). * If the transaction is not committed it will be aborted. */ void close(); /** * Restart transaction * * Once a transaction has been completed successfully * it can be started again wo/ calling closeTransaction/startTransaction * * Note this method also releases completed operations */ int restart(); /** @} *********************************************************************/ /** * @name Meta Information * @{ */ /** * Get global checkpoint identity (GCI) of transaction. * * Each committed transaction belong to a GCI. * The log for the committed transaction is saved on * disk when a global checkpoint occurs. * * Whether or not the global checkpoint with this GCI has been * saved on disk or not cannot be determined by this method. * * By comparing the GCI of a transaction with the value * last GCI restored in a restarted NDB Cluster one can determine * whether the transaction was restored or not. * * @note Global Checkpoint Identity is undefined for scan transactions * (This is because no updates are performed in scan transactions.) * * @return GCI of transaction or -1 if GCI is not available. * (Note that there has to be an NdbConnection::execute call * with Ndb::Commit for the GCI to be available.) */ int getGCI(); /** * Get transaction identity. * * @return Transaction id. */ 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 } */ enum CommitStatusType { NotStarted, ///< Transaction not yet started Started, ///< Missing explanation Committed, ///< Transaction has been committed Aborted, ///< Transaction has been aborted NeedAbort ///< Missing explanation }; CommitStatusType commitStatus(); /** @} *********************************************************************/ /** * @name Error Handling * @{ */ /** * Get error object with information about the latest error. * * @return An error object with information about the latest error. */ const NdbError & getNdbError() const; /** * Get the latest NdbOperation which had an error. * This method is used on the NdbConnection object to find the * NdbOperation causing an error. * To find more information about the * actual error, use method NdbOperation::getNdbError * on the returned NdbOperation object. * * @return The NdbOperation causing the latest error. */ NdbOperation* getNdbErrorOperation(); /** * Get the method number where the latest error occured. * * @return Line number where latest error occured. */ int getNdbErrorLine(); /** * Get completed (i.e. executed) operations of a transaction * * This method should only be used after a transaction * has been executed. * - NdbConnection::getNextCompletedOperation(NULL) returns the * first NdbOperation object. * - NdbConnection::getNextCompletedOperation(op) returns the * NdbOperation object defined after the NdbOperation "op". * * This method is typically used to fetch all NdbOperation:s of * a transaction to check for errors (use NdbOperation::getNdbError * to fetch the NdbError object of an NdbOperation). * * @note This method should only be used after the transaction has been * executed and before the transaction has been closed. * * @param op Operation, NULL means get first operation * @return Operation "after" op */ const NdbOperation * getNextCompletedOperation(const NdbOperation * op)const; /** @} *********************************************************************/ /** * Execute the transaction in NoCommit mode if there are any not-yet * executed blob part operations of given types. Otherwise do * nothing. The flags argument is bitwise OR of (1 << optype) where * optype comes from NdbOperation::OperationType. Only the basic PK * ops are used (read, insert, update, delete). */ int executePendingBlobOps(Uint8 flags = 0xFF); // Fast path calls for MySQL ha_ndbcluster NdbOperation* getNdbOperation(const NdbDictionary::Table * table); NdbIndexOperation* getNdbIndexOperation(const NdbDictionary::Index *, const NdbDictionary::Table * table); NdbScanOperation* getNdbScanOperation(const NdbDictionary::Table * table); NdbIndexScanOperation* getNdbIndexScanOperation(const NdbDictionary::Index * index, const NdbDictionary::Table * table); Uint32 getConnectedNodeId(); // Get Connected node id private: /** * Release completed operations */ void releaseCompletedOperations(); typedef Uint64 TimeMillis_t; /************************************************************************** * These methods are service methods to other classes in the NDBAPI. * **************************************************************************/ /************************************************************************** * These are the create and delete methods of this class. * **************************************************************************/ NdbConnection(Ndb* aNdb); ~NdbConnection(); NdbConnection* next(); // Returns the next pointer void next(NdbConnection*); // Sets the next pointer void init(); // Initialize connection object for new transaction int executeNoBlobs(ExecType execType, AbortOption abortOption = AbortOnError, int force = 0 ); /** * Set Connected node id * and sequence no */ void setConnectedNodeId( Uint32 nodeId, Uint32 sequence); void setMyBlockReference( int ); // Set my block refrerence void setTC_ConnectPtr( Uint32 ); // Sets TC Connect pointer int getTC_ConnectPtr(); // Gets TC Connect pointer void setBuddyConPtr(Uint32); // Sets Buddy Con Ptr Uint32 getBuddyConPtr(); // Gets Buddy Con Ptr enum ConStatusType { NotConnected, Connecting, Connected, DisConnecting, ConnectFailure }; ConStatusType Status(); // Read the status information void Status(ConStatusType); // Set the status information Uint32 get_send_size(); // Get size to send void set_send_size(Uint32); // Set size to send; int receiveDIHNDBTAMPER(NdbApiSignal* anApiSignal); int receiveTCSEIZECONF(NdbApiSignal* anApiSignal); int receiveTCSEIZEREF(NdbApiSignal* anApiSignal); int receiveTCRELEASECONF(NdbApiSignal* anApiSignal); int receiveTCRELEASEREF(NdbApiSignal* anApiSignal); int receiveTC_COMMITCONF(const class TcCommitConf *); int receiveTCKEYCONF(const class TcKeyConf *, Uint32 aDataLength); int receiveTCKEY_FAILCONF(const class TcKeyFailConf *); int receiveTCKEY_FAILREF(NdbApiSignal* anApiSignal); int receiveTC_COMMITREF(NdbApiSignal* anApiSignal); int receiveTCROLLBACKCONF(NdbApiSignal* anApiSignal); // Rec TCPREPARECONF ? int receiveTCROLLBACKREF(NdbApiSignal* anApiSignal); // Rec TCPREPAREREF ? int receiveTCROLLBACKREP(NdbApiSignal* anApiSignal); int receiveTCINDXCONF(const class TcIndxConf *, Uint32 aDataLength); int receiveTCINDXREF(NdbApiSignal*); int receiveSCAN_TABREF(NdbApiSignal*); int receiveSCAN_TABCONF(NdbApiSignal*, const Uint32*, Uint32 len); int doSend(); // Send all operations int sendROLLBACK(); // Send of an ROLLBACK int sendTC_HBREP(); // Send a TCHBREP signal; int sendCOMMIT(); // Send a TC_COMMITREQ signal; void setGCI(int GCI); // Set the global checkpoint identity int OpCompleteFailure(Uint8 abortoption, bool setFailure = true); int OpCompleteSuccess(); void CompletedOperations(); // Move active ops to list of completed void OpSent(); // Operation Sent with success // Free connection related resources and close transaction void release(); // Release all operations in connection void releaseOperations(); // Release all cursor operations in connection void releaseOps(NdbOperation*); void releaseScanOperations(NdbIndexScanOperation*); void releaseExecutedScanOperation(NdbIndexScanOperation*); // Set the transaction identity of the transaction void setTransactionId(Uint64 aTransactionId); // Indicate something went wrong in the definition phase void setErrorCode(int anErrorCode); // Indicate something went wrong in the definition phase void setOperationErrorCode(int anErrorCode); // Indicate something went wrong in the definition phase void setOperationErrorCodeAbort(int anErrorCode, int abortOption = -1); int checkMagicNumber(); // Verify correct object NdbOperation* getNdbOperation(const class NdbTableImpl* aTable, NdbOperation* aNextOp = 0); NdbIndexScanOperation* getNdbScanOperation(const class NdbTableImpl* aTable); NdbIndexOperation* getNdbIndexOperation(const class NdbIndexImpl* anIndex, const class NdbTableImpl* aTable, NdbOperation* aNextOp = 0); NdbIndexScanOperation* getNdbIndexScanOperation(const NdbIndexImpl* index, const NdbTableImpl* table); void handleExecuteCompletion(); /**************************************************************************** * These are the private variables of this class. ****************************************************************************/ Uint32 ptr2int(); Uint32 theId; // Keeps track of what the send method should do. enum SendStatusType { NotInit, InitState, sendOperations, sendCompleted, sendCOMMITstate, sendABORT, sendABORTfail, sendTC_ROLLBACK, sendTC_COMMIT, sendTC_OP }; SendStatusType theSendStatus; NdbAsynchCallback theCallbackFunction; // Pointer to the callback function void* theCallbackObject; // The callback object pointer Uint32 theTransArrayIndex; // Current index in a transaction // array for this object TimeMillis_t theStartTransTime; // Start time of the transaction NdbError theError; // Errorcode on transaction int theErrorLine; // Method number of last error in NdbOperation NdbOperation* theErrorOperation; // The NdbOperation where the error occurred Ndb* theNdb; // Pointer to Ndb object NdbConnection* theNext; // Next pointer. Used in idle list. NdbOperation* theFirstOpInList; // First operation in defining list. NdbOperation* theLastOpInList; // Last operation in defining list. NdbOperation* theFirstExecOpInList; // First executing operation in list NdbOperation* theLastExecOpInList; // Last executing operation in list. NdbOperation* theCompletedFirstOp; // First & last operation in completed NdbOperation* theCompletedLastOp; // operation list. Uint32 theNoOfOpSent; // How many operations have been sent Uint32 theNoOfOpCompleted; // How many operations have completed Uint32 theNoOfOpFetched; // How many operations was actually fetched Uint32 theMyRef; // Our block reference Uint32 theTCConPtr; // Transaction Co-ordinator connection pointer. Uint64 theTransactionId; // theTransactionId of the transaction Uint32 theGlobalCheckpointId; // The gloabl checkpoint identity of the transaction ConStatusType theStatus; // The status of the connection enum CompletionStatus { NotCompleted, CompletedSuccess, CompletedFailure, DefinitionFailure } theCompletionStatus; // The Completion status of the transaction CommitStatusType theCommitStatus; // The commit status of the transaction Uint32 theMagicNumber; // Magic Number to verify correct object Uint32 thePriority; // Transaction Priority enum ReturnType { ReturnSuccess, ReturnFailure }; ReturnType theReturnStatus; // Did we have any read/update/delete failing // to find the tuple. bool theTransactionIsStarted; bool theInUseState; bool theSimpleState; Uint8 m_abortOption; // Type of commit enum ListState { NotInList, InPreparedList, InSendList, InCompletedList } theListState; Uint32 theDBnode; // The database node we are connected to Uint32 theNodeSequence; // The sequence no of the db node bool theReleaseOnClose; /** * handle transaction spanning * multiple TC/db nodes * * 1) Bitmask with used nodes * 2) Bitmask with nodes failed during op */ Uint32 m_db_nodes[2]; Uint32 m_failed_db_nodes[2]; int report_node_failure(Uint32 id); // Scan operations bool m_waitForReply; NdbIndexScanOperation* m_theFirstScanOperation; NdbIndexScanOperation* m_theLastScanOperation; NdbIndexScanOperation* m_firstExecutedScanOp; // Scan operations // The operation actually performing the scan NdbScanOperation* theScanningOp; Uint32 theBuddyConPtr; // optim: any blobs bool theBlobFlag; Uint8 thePendingBlobOps; static void sendTC_COMMIT_ACK(NdbApiSignal *, Uint32 transId1, Uint32 transId2, Uint32 aBlockRef); void completedFail(const char * s); #ifdef VM_TRACE void printState(); #endif bool checkState_TransId(const Uint32 * transId) const; void remove_list(NdbOperation*& head, NdbOperation*); void define_scan_op(NdbIndexScanOperation*); friend class HugoOperations; friend struct Ndb_free_list_t; }; inline Uint32 NdbConnection::get_send_size() { return 0; } inline void NdbConnection::set_send_size(Uint32 send_size) { return; } #ifdef NDB_NO_DROPPED_SIGNAL #include #endif inline int NdbConnection::checkMagicNumber() { if (theMagicNumber == 0x37412619) return 0; else { #ifdef NDB_NO_DROPPED_SIGNAL abort(); #endif return -1; } } inline bool NdbConnection::checkState_TransId(const Uint32 * transId) const { const Uint32 tTmp1 = transId[0]; const Uint32 tTmp2 = transId[1]; Uint64 tRecTransId = (Uint64)tTmp1 + ((Uint64)tTmp2 << 32); bool b = theStatus == Connected && theTransactionId == tRecTransId; return b; } /************************************************************************************************ void setTransactionId(Uint64 aTransactionId); Remark: Set the transaction identity. ************************************************************************************************/ inline void NdbConnection::setTransactionId(Uint64 aTransactionId) { theTransactionId = aTransactionId; } inline void NdbConnection::setConnectedNodeId(Uint32 aNode, Uint32 aSequenceNo) { theDBnode = aNode; theNodeSequence = aSequenceNo; } /****************************************************************************** int getConnectedNodeId(); Return Value: Return theDBnode. Remark: Get Connected node id. ******************************************************************************/ inline Uint32 NdbConnection::getConnectedNodeId() { return theDBnode; } /****************************************************************************** void setMyBlockReference(int aBlockRef); Parameters: aBlockRef: The block refrerence. Remark: Set my block refrerence. ******************************************************************************/ inline void NdbConnection::setMyBlockReference(int aBlockRef) { theMyRef = aBlockRef; } /****************************************************************************** void setTC_ConnectPtr(Uint32 aTCConPtr); Parameters: aTCConPtr: The connection pointer. Remark: Sets TC Connect pointer. ******************************************************************************/ inline void NdbConnection::setTC_ConnectPtr(Uint32 aTCConPtr) { theTCConPtr = aTCConPtr; } /****************************************************************************** int getTC_ConnectPtr(); Return Value: Return theTCConPtr. Remark: Gets TC Connect pointer. ******************************************************************************/ inline int NdbConnection::getTC_ConnectPtr() { return theTCConPtr; } inline void NdbConnection::setBuddyConPtr(Uint32 aBuddyConPtr) { theBuddyConPtr = aBuddyConPtr; } inline Uint32 NdbConnection::getBuddyConPtr() { return theBuddyConPtr; } /****************************************************************************** NdbConnection* next(); inline void NdbConnection::setBuddyConPtr(Uint32 aBuddyConPtr) { theBuddyConPtr = aBuddyConPtr; } inline Uint32 NdbConnection::getBuddyConPtr() { return theBuddyConPtr; } Return Value: Return next pointer to NdbConnection object. Remark: Get the next pointer. ******************************************************************************/ inline NdbConnection* NdbConnection::next() { return theNext; } /****************************************************************************** void next(NdbConnection aConnection); Parameters: aConnection: The connection object. Remark: Sets the next pointer. ******************************************************************************/ inline void NdbConnection::next(NdbConnection* aConnection) { theNext = aConnection; } /****************************************************************************** ConStatusType Status(); Return Value Return the ConStatusType. Parameters: aStatus: The status. Remark: Sets Connect status. ******************************************************************************/ inline NdbConnection::ConStatusType NdbConnection::Status() { return theStatus; } /****************************************************************************** void Status(ConStatusType aStatus); Parameters: aStatus: The status. Remark: Sets Connect status. ******************************************************************************/ inline void NdbConnection::Status( ConStatusType aStatus ) { theStatus = aStatus; } /****************************************************************************** void setGCI(); Remark: Set global checkpoint identity of the transaction ******************************************************************************/ inline void NdbConnection::setGCI(int aGlobalCheckpointId) { theGlobalCheckpointId = aGlobalCheckpointId; } /****************************************************************************** void OpSent(); Remark: An operation was sent with success that expects a response. ******************************************************************************/ inline void NdbConnection::OpSent() { theNoOfOpSent++; } /****************************************************************************** void executePendingBlobOps(); ******************************************************************************/ #include inline int NdbConnection::executePendingBlobOps(Uint8 flags) { if (thePendingBlobOps & flags) { // not executeNoBlobs because there can be new ops with blobs return execute(NoCommit); } return 0; } inline Uint32 NdbConnection::ptr2int(){ return theId; } #endif