Using Sequences in C

As explained in the User's Guide page, a sequence is an unbounded array of eXtremeDB-supported scalar data elements. The generated C API classname_fieldname_*() functions are used by C applications to manage database fields of type sequence. As sequences are effectively vectors of values, they are accessed through iterators. The C type mco_seq_iterator_h is used in classname_fieldname_*() for basic sequence operations. A powerful set of Analytics Methods are also provided for performing mathematical and statistical operations on sequences.

Inserting and Updating Sequences in C

Normally sequence data is inserted using the generated C API <classname>_<fieldname>_append(). For example consider the following schema definition:

 
    #define uint4 unsigned<4>
     
    class Quote {
        char<16>            symbol;
        sequence<uint4 asc> day;
        sequence<float>     price;
         
        tree<symbol> by_symbol;
    };
     

With this class definition, the Quote sequence fields day and price can be populated with code like the following:

 
    #define  N_ITEMS                4
    uint4 days[N_ITEMS] = { 1, 2, 4, 5 };
    float prices[N_ITEMS] = { 10, 20, 40 ,50 };
    ...
    Quote q;
    Quote_new(t, &q);
    Quote_symbol_put(&q, "IBM", (uint2)(strlen("IBM")));
    Quote_day_append(&q, days, N_ITEMS);
    Quote_price_append(&q, prices, N_ITEMS);
     

It may sometimes be necessary to insert values into an ordered time series. Values can be inserted into an existing sequence using the generated C API <classname>_<fieldname>_insert(). For example, the following code snippet searches for the Quote object with symbol "IBM", then inserts day and price values:

 
    #define  DAY_THREE              3
    #define  DAY_THREE_PRICE        30
    uint4 day_to_insert[1] = { DAY_THREE };
    float price_to_insert[1] = { DAY_THREE_PRICE };
    ...
    mco_trans_h     t;
    mco_cursor_t    cur;
    ...
    mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
    rc = Quote_by_symbol_index_cursor(t, &cur);
    if (MCO_S_OK == rc)
    {
        rc = Quote_by_symbol_search(t, &cur, MCO_GE, "IBM", 
                        (uint2)(sizeof("IBM")));
        if (MCO_S_OK == rc)
        {
            //insert here
            Quote q;
            Quote_new(t, &q);
 
            rc = Quote_from_cursor(t, &cur, &q);
            rc = Quote_day_iterator(&q, &it);
            if (MCO_S_OK == rc)
            {
                rc = Quote_day_search(&q, &it, 
                            DAY_THREE, MCO_SEQ_BOUNDARY_EXCLUSIVE, 
                            0, MCO_SEQ_BOUNDARY_OPEN);
                mco_seq_no_t pos = it.first_seq_no;
                rc = Quote_day_insert(&q, pos, day_to_insert, 1);
                rc = Quote_price_insert(&q, pos, price_to_insert, 1);
                rc = mco_trans_commit(t);
            }
        }
    }