# mco_trans_iterate
RT

> Iterate over all modifications made by a transaction.

### Prototype

        MCO_RET	mco_trans_iterate(	/*IN*/ mco_trans_h t,
                        /*IN*/ mco_trans_iterator_callback_t callback,
                        /*IN*/ void* user_ctx);

### Arguments

t | The `mco_trans_h` transaction handle returned by `mco_trans_start()`
callback | A callback function that inspects each object, and determines whether it is subject to an external transaction, etc.
ctx | Application-specific context (anything that you want to pass into the callback)

### Description

> This function provides the ability to iterate over all modifications made by a transaction, read the modified objects, and determine what kind of modifications were applied (new, update, delete). As one of the parameters, the API takes an application-defined callback function that inspects each object, and determines whether it is subject to an external transaction, etc. The callback receives a handle to the modified object, the class code of the object, the type of the modification operation and some application-specific context (anything that you want to pass into the callback). The application then has a choice of either continuing to commit the transaction, or discarding all modifications (rollback). This API can be used in concert with the two-phase commit API.

### Return Codes

MCO_S_OK | The transaction was committed successfully
MCO_S_NOTFOUND | Index not found when trying to remove object’s entries from index
MCO_E_NOMEM | Out of memory, possibly during an attempt to create an index
MCO_S_DUPLICATE | Duplicate value in a unique index (or duplicate OID)
MCO_E_TRANSACT | The transaction was in an error state

### Example

        Application snippet:

        const char * dbname = "SimpleDb";

        mco_trans_iterator_callback_t* my_iterator_callback( mco_trans_h trans,
                                        MCO_Hf* obj,
                                        MCO_CLASS_ID cid,
                                        int operation_mask,
                                        void* ctx)
        {
            printf(“\nProcess transaction contents…\n” );
        }

        int main(int argc, char* argv[])
        {
            mco_db_h db;
            MCO_RET rc;
            mco_device_t       dev;
            mco_db_params_t    db_params;
            mco_trans_h t;

            ...
            rc = mco_db_open_dev( dbname, simple_get_dictionary(), &dev, 1, &db_params );
            if ( MCO_S_OK != rc )
            {
                rc = mco_db_connect(  dbname, &db );
                ...
                rc = mco_trans_start(db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &t);
                if ( MCO_S_OK == rc )
                {
                    ...
                    if ( MCO_S_OK == mco_trans_commit_phase1( t ) )
                    {
                        rc = mco_trans_iterate(t, my_iterator_callback, (void*)0 );

                        if (rc == MCO_S_OK)
                        {
                            ...
                            if ( MCO_S_OK == rc = mco_trans_commit_phase2( t ) )
                            {
                                ...
                            }
                            else
                            {
                                mco_trans_rollback( t );
                            }
                            ...
                        }
                    }
                    else
                    {
                        mco_trans_rollback( t );
                    }
                    ...
                    rc = mco_trans_commit( t );
                    ...
                }
            }
            ...
        }

### Files

Header file:
mco.h
Source file:
mursiw.c
Library:
libmcotexcl.a
Header file:
mco.h
Source file:
mursiw.c
Library:
libmcotmursiw.a
Header file:
mco.h
Source file:
mvcc.c
Library:
libmcotmvcc.a
Header file:
mco.h
Source file:
mursiw.c
Library:
libmcotread.a