Figure 5: Handles the SQLDA structure

class DbSQLDA {
public :
    Bool hasRecord;
    Dump sqlda;
    DbRecord record;
    DbSQLDA() { hasRecord = TRUE; }

    SQLDA* getSQLDA() { return (SQLDA*)sqlda.data; }
    operator SQLDA*() { return (SQLDA*)sqlda.data; }
    SQLVAR& operator[](int i) { return getSQLDA()->sqlvar[i]; }
    void create(SQLDA* s, Bool withData = FALSE);

    // Creates copy of SQLDA <s> with record buffer if desired
    DbSQLDA& operator<<(SQLVAR* var);

    // Adds SQLVAR <var> (and data in record buffer too)
    void synchronize();
    void clear();
    void extend(int delta);
};

void DbSQLDA::extend(int delta) {
    int used;
    if (sqlda.size > 0)
        used = SQLDA_LENGTH(getSQLDA()->sqld) + 
               delta*sizeof(SQLVAR);
    else
        used = SQLDA_LENGTH(delta);
    if (used > sqlda.size)
        if (sqlda.size > 0) {
            Dump swap(sqlda);
            sqlda.create(used + FIELD_GRAN*sizeof(SQLVAR));
            memcpy(sqlda.data, swap.data, swap.size);
            getSQLDA()->sqln += delta;
        }
        else {
            sqlda.create(used + FIELD_GRAN*sizeof(SQLVAR));
            getSQLDA()->sqln = delta;
        }
    else
        getSQLDA()->sqln += delta;
}

DbSQLDA& DbSQLDA::operator<<(SQLVAR* var) {
    extend(1);
    if (hasRecord)
        record << var;
    (*this)[getSQLDA()->sqld++] = *var;
    return *this;
}

void DbSQLDA::synchronize() {
    if (!hasRecord)
        return;

    SQLDA* s = getSQLDA();
    for (int i = 0; i < s->sqld; i++) {
        DbRecordField* field = record.get(i);
        s->sqlvar[i].sqldata = field->text;
        s->sqlvar[i].sqlind = &field->nullind;
    }
}

void DbSQLDA::create(SQLDA* s, Bool withData) {
    sqlda.create(SQLDA_LENGTH(s->sqld));
    memcpy(sqlda.data,s,sqlda.size);
    getSQLDA()->sqln = s->sqld;
    if (withData) {
        hasRecord = TRUE;
        record.create(s);
        synchronize();
    }
    else
        hasRecord = FALSE;
}

void DbSQLDA::clear() {
    sqlda.destroy();
    record.clear();
    hasRecord = TRUE;
}

/* End of File */