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