classname_checkpoint

This function creates index nodes with the object’s new or updated values.

Prototype

    MCO_RET    classname_checkpoint(    /*IN*/ classname * handle  );

Arguments

handle
The address of a variable of type class handle.

Description

This function completes one or more put methods by creating index nodes and/or other tasks necessary to incorporate the object’s new or updated values into the database.

Return Codes

MCO_S_OK
The object was updated successfully.
MCO_E_ACCESS
The transaction handle is MCO_READ_ONLY.
MCO_E_TRANSACT
Transaction is in error state.
MCO_E_DELETED
This object has been deleted.
MCO_E_NOMEM
Database memory allocation error.
MCO_S_DUPLICATE
Attempt to insert a duplicate value into a unique index.
MCO_ERR_OBJECT_HANDLE
Invalid object handle.
MCO_ERR_TRN
Error in the enclosing transaction.
MCO_ERR_INDEX
Error inserting into the index structure.

Example

The following code snippets demonstrate how classname_checkpoint() can be used to update indexes to be able to lookup newly created or updated database objects within a transaction; i.e. before the transaction is committed.

    Snippet from schema file:

    class A {
        uint4 id;
        char<256> name;

        tree <id> idx;
    };

    Application snippet:

    int main(int argc, char* argv[])
    {
        MCO_RET         rc;
        ...
        mco_db_h        db = 0;
        mco_trans_h     t;
        mco_cursor_t    csr;
        A a1, a2;
        A a_out;
        char * name = "Test #N";
        uint4 id = 999;
        uint4 id_out = 0;
        char name_out[64] = "";
        ...
        rc = mco_trans_start(connection, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
        if ( MCO_S_OK == rc )
        {
            // Insert two instances of A
            A_new(t, &a1);
            A_id_put(&a1, id);
            name[6] = '1';
            A_name_put(&a1, name, strlen(name));
            A_new(t, &a2);
            A_id_put(&a2, id + 1);
            name[6] = '2';
            A_name_put(&a2, name, strlen(name));

            // Checkpoint to create index entries
            A_checkpoint(&a1);
            A_checkpoint(&a2);

            // Lookup inserted objects by index
            rc = A_idx_index_cursor(t, &csr);
            if (MCO_S_OK == rc)
            {
                printf("\nInside transaction; objects inserted into index: \n");
                for (rc = mco_cursor_first(t, &csr); rc == MCO_S_OK; rc = mco_cursor_next(t, &csr))
                {
                    A_from_cursor(t, &csr, &a_out);
                    A_id_get(&a_out, &id_out);
                    A_name_get(&a_out, name_out, sizeof(name_out));
                    printf("\tid=%d, name {%s} \n", id_out, name_out);
                }
            }
            // Rollback the transaction so no inserts are committed
            mco_trans_rollback(t);
        }

        // Start a new transaction to check for inserted items
        rc = mco_trans_start(db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &t);
        if (MCO_S_OK == rc)
        {
            // Lookup to verify that no objects were inserted - transaction rolled back
            rc = A_idx_index_cursor(t, &csr);
            if (MCO_S_OK == rc)
            {
                printf("\nObjects inserted: \n");
                for (rc = mco_cursor_first(t, &csr); rc == MCO_S_OK; rc = mco_cursor_next(t, &csr))
                {
                    A_from_cursor(t, &csr, &a_out);
                    A_id_get(&a_out, &id_out);
                    A_name_get(&a_out, name_out, sizeof(name_out));
                    printf("\tid=%d, name {%s} \n", id_out, name_out);
                }
            }
            else
            {
                sample_rc_check("\n Attempt to open a cursor after rollback:", rc);
            }
        }
        mco_trans_rollback(t);
        ...
    }

Related Topics Link IconRelated Topics