The R Project SVN R-packages

Rev

Rev 3324 | Rev 3397 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3251 mrmanese 1
#include <stdio.h>
2
#include <string.h>
3252 mrmanese 3
#include "sqlite_dataframe.h"
3251 mrmanese 4
 
3255 mrmanese 5
/****************************************************************************
6
 * UTILITY FUNCTIONS
7
 ****************************************************************************/
3251 mrmanese 8
 
3255 mrmanese 9
/* if user supplied a name, return that name. otherwise, use the 
10
 * default "data" */
3307 mrmanese 11
static int _check_sdf_name(SEXP name, char **rname, char **iname, int *file_idx) {
3255 mrmanese 12
    int namelen = 0;
13
 
3252 mrmanese 14
    /* check if arg name is supplied */
3251 mrmanese 15
    if (IS_CHARACTER(name)) {
3255 mrmanese 16
        *rname = CHAR_ELT(name,0);
17
        if (!_is_r_sym(*rname)) { 
18
            Rprintf("Error: supplied name \"%s\"is not a valid R symbol.\n", 
19
                    *rname); 
20
            return FALSE; 
21
        }
22
        namelen = strlen(*rname);
23
        *iname = (char*)R_alloc(namelen + 9, sizeof(char)); /* <name>10000.db\0 */
24
        sprintf(*iname, "%s.db", *rname);
3251 mrmanese 25
    } else if (name == R_NilValue) {
3255 mrmanese 26
        *rname = "data";
3252 mrmanese 27
        namelen = 5;
3255 mrmanese 28
        *iname = (char*)R_alloc(13, sizeof(char)); /* data10000.db\0 */
29
        *file_idx = 1;
30
        sprintf(*iname, "%s%d.db", *rname, *file_idx);
3251 mrmanese 31
    } else {
3255 mrmanese 32
        Rprintf("Error: the supplied value for arg name is not a string.\n");
3251 mrmanese 33
    }
3255 mrmanese 34
    return namelen;
35
}
3251 mrmanese 36
 
3307 mrmanese 37
static int _find_free_filename(char *rname, char **iname, int *namelen, int *file_idx) {
3251 mrmanese 38
    do {
3255 mrmanese 39
        if (!_file_exists(*iname)) break;
40
        *namelen = sprintf(*iname, "%s%d.db", rname, ++(*file_idx)) - 3;
41
    } while (*file_idx < 10000);
42
 
43
    return *file_idx;
44
}
45
 
46
/* creates an sdf attribute table */
47
static int _create_sdf_attribute2(const char *iname) {
48
    sprintf(g_sql_buf[2], "create table [%s].sdf_attributes(attr text, "
49
            "value text, primary key (attr))", iname);
3284 mrmanese 50
    int res;
51
    res = _sqlite_exec(g_sql_buf[2]);
3255 mrmanese 52
    if (res == SQLITE_OK) {
53
        sprintf(g_sql_buf[2], "insert into [%s].sdf_attributes values ('name',"
54
                "'%s');", iname, iname);
55
        res = _sqlite_exec(g_sql_buf[2]);
56
    }
57
    return res;
58
}
59
 
3358 mrmanese 60
char *_create_sdf_skeleton1(SEXP name, int *onamelen) {
3307 mrmanese 61
    char *iname, *rname;
62
    int namelen, file_idx = 0, res;
63
 
64
    namelen = _check_sdf_name(name, &rname, &iname, &file_idx);
65
 
66
    if (!namelen) return NULL;
67
 
68
    _find_free_filename(rname, &iname, &namelen, &file_idx);
69
 
70
    if (file_idx >= 10000) { 
71
        Rprintf("Error: cannot find free SDF name.\n");
72
        return NULL;
73
    }
74
 
3308 mrmanese 75
    /* add to workspace */
76
    strcpy(g_sql_buf[3], iname);
3307 mrmanese 77
    iname[namelen] = 0; /* remove ".db" */
3308 mrmanese 78
    res = _add_sdf1(g_sql_buf[3], iname);
79
    if (_sqlite_error(res)) return NULL;
3307 mrmanese 80
 
3308 mrmanese 81
    /* detach SDF's if necessary to attach this one. if file does not
82
     * exist, then a sqlite db will be created after we make our 1st table */
3358 mrmanese 83
    if (!USE_SDF1(iname, FALSE)) { /* _delete_sdf2(iname); */ return NULL; }
3308 mrmanese 84
 
85
 
3307 mrmanese 86
    /* create attributes table */
87
    res = _create_sdf_attribute2(iname);
88
    if (_sqlite_error(res)) {
89
        sprintf(g_sql_buf[2], "detach '%s'", iname);
3308 mrmanese 90
        _delete_sdf2(iname);
3307 mrmanese 91
        return NULL; 
92
    }
93
 
94
    *onamelen = namelen;
95
    return iname;
96
}
3255 mrmanese 97
/* checks if a column has a corresponding factor|ordered table */
98
static int _is_factor2(const char *iname, const char *factor_type, const char *colname) {
3281 mrmanese 99
    sqlite3_stmt *stmt;
3255 mrmanese 100
    sprintf(g_sql_buf[2], "select * from [%s].[%s %s]", iname, factor_type,
101
            colname);
3284 mrmanese 102
    int res;
103
    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
3282 mrmanese 104
    sqlite3_finalize(stmt);
3255 mrmanese 105
    return res == SQLITE_OK;
106
}
107
 
108
/* create a factor|ordered table */
109
static int _create_factor_table2(const char *iname, const char *factor_type, 
110
        const char *colname) {
111
    sqlite3_stmt *stmt;
112
    sprintf(g_sql_buf[2], "create table [%s].[%s %s] (level int, label text, "
113
            "primary key(level), unique(label));", iname, factor_type, colname);
3284 mrmanese 114
    int res;
115
    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
3282 mrmanese 116
    if (res == SQLITE_OK) sqlite3_step(stmt);
3255 mrmanese 117
    sqlite3_finalize(stmt);
118
    return res; /* error on dup name? */
119
}
120
 
121
/* copy a factor|ordered table from a sdf(db) to another sdf(db) */
3358 mrmanese 122
int _copy_factor_levels2(const char *factor_type, const char *iname_src,
3255 mrmanese 123
        const char *colname_src, const char *iname_dst, const char *colname_dst) {
124
    sqlite3_stmt *stmt;
125
    int res;
126
    res = _create_factor_table2(iname_dst, factor_type, colname_dst);
127
    if (res == SQLITE_OK) {
3281 mrmanese 128
        sprintf(g_sql_buf[2], "insert into [%s].[%s %s] select * from [%s].[%s %s]",
3255 mrmanese 129
                iname_src, factor_type, colname_src, iname_dst, factor_type,
130
                colname_dst);
131
        res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
3282 mrmanese 132
        if (res == SQLITE_OK) sqlite3_step(stmt);
3255 mrmanese 133
        sqlite3_finalize(stmt);
3281 mrmanese 134
    }
3255 mrmanese 135
    return res; /* error on dup name? */
136
}
137
 
138
 
139
/* assumes stmt has col_cnt + 1 columns, col 0 is [row name]. returned SEXP is 
140
 * not UNPROTECT-ed, user will have to do that. will create the names &
141
 * attach factor infos */
3281 mrmanese 142
static SEXP _setup_df_sexp1(sqlite3_stmt *stmt, const char *iname, 
143
        int col_cnt, int row_cnt, int *dup_indices) {
144
    SEXP ret, names, value, class = R_NilValue;
145
    int i, type;
146
    const char *colname, *coltype;
3255 mrmanese 147
 
148
    PROTECT(ret = NEW_LIST(col_cnt));
149
 
3281 mrmanese 150
    /* set up names. */
151
    PROTECT(names = NEW_CHARACTER(col_cnt));
3255 mrmanese 152
    for (i = 0; i < col_cnt; i++) {
3281 mrmanese 153
        colname = sqlite3_column_name(stmt, i+1);  /* +1 bec [row name is 0] */
154
        coltype = sqlite3_column_decltype(stmt, i+1);
155
 
3255 mrmanese 156
        if (dup_indices[i] == 0) {
157
            strcpy(g_sql_buf[1], colname);
158
        } else {
159
            sprintf(g_sql_buf[1], "%s.%d", colname, dup_indices[i]);
160
        }
161
 
3281 mrmanese 162
        SET_STRING_ELT(names, i, mkChar(g_sql_buf[1]));
163
 
164
        if (strcmp(coltype, "text") == 0) {
165
            PROTECT(value = NEW_CHARACTER(row_cnt));
166
        } else if (strcmp(coltype, "double") == 0) {
167
            PROTECT(value = NEW_NUMERIC(row_cnt));
168
        } else if (strcmp(coltype, "bit") == 0) {
169
            PROTECT(value = NEW_LOGICAL(row_cnt));
170
        } else if (strcmp(coltype, "integer") == 0 || 
171
                   strcmp(coltype, "int") == 0) {
172
            PROTECT(value = NEW_INTEGER(row_cnt));
173
            type = _get_factor_levels1(iname, colname, value);
174
            if (type == VAR_FACTOR) {
175
                PROTECT(class = mkString("factor"));
176
                SET_CLASS(value, class);
177
                UNPROTECT(1);
178
            } else if (type == VAR_ORDERED) {
179
                PROTECT(class = NEW_CHARACTER(2));
180
                SET_STRING_ELT(class, 0, mkChar("ordered"));
181
                SET_STRING_ELT(class, 1, mkChar("factor"));
182
                SET_CLASS(value, class);
183
                UNPROTECT(1);
184
            }
185
        } else {
186
            Rprintf("Error: not supported type %s for %s\n", coltype, colname);
187
            UNPROTECT(2); /* unprotect ret, names */
188
            return R_NilValue;
189
        }
190
 
191
        SET_VECTOR_ELT(ret, i, value);
192
        UNPROTECT(1); /* unprotect value */
3255 mrmanese 193
 
194
    }
3281 mrmanese 195
    SET_NAMES(ret, names);
196
    UNPROTECT(1); /* unprotect names only */
3255 mrmanese 197
    return ret;
198
}
199
 
3281 mrmanese 200
/* expected that 1st col of stmt is [row name], so we start with index 1 */
201
static int _add_row_to_df(SEXP df, sqlite3_stmt *stmt, int row, int ncols) {
202
    SEXP vec;
3282 mrmanese 203
    int type = -1, is_null, i;
3281 mrmanese 204
    for (i = 1; i <= ncols; i++) {
205
        vec = VECTOR_ELT(df, i-1);
206
        type = TYPEOF(vec);
207
 
208
        is_null = (sqlite3_column_type(stmt, row) == SQLITE_NULL);
209
 
210
        if (type == CHARSXP) {
3284 mrmanese 211
            SET_STRING_ELT(vec, row, mkChar((char *)sqlite3_column_text(stmt, i)));
3281 mrmanese 212
        } else if (type == INTSXP) {
213
            INTEGER(vec)[row] = sqlite3_column_int(stmt, i);
214
        } else if (type == REALSXP) {
215
            REAL(vec)[row] = sqlite3_column_double(stmt, i);
216
        } else if (type == LGLSXP) {
217
            LOGICAL(vec)[row] = sqlite3_column_int(stmt, i);
218
        }
219
    }
3282 mrmanese 220
    return type;
3281 mrmanese 221
}
222
 
223
static void _set_rownames2(SEXP df) {
224
    SEXP value = VECTOR_ELT(df, 0);
225
    int len = LENGTH(value), i;
226
    PROTECT(value = NEW_CHARACTER(len));
227
    for (i = 0; i < len; i++) {
228
        sprintf(g_sql_buf[2], "%d", i+1);
229
        SET_STRING_ELT(value, i, mkChar(g_sql_buf[2]));
230
    }
231
 
232
    SET_ROWNAMES(df, value);
233
    UNPROTECT(1);
234
}
235
 
236
 
3255 mrmanese 237
/****************************************************************************
238
 * SDF FUNCTIONS
239
 ****************************************************************************/
240
 
241
SEXP sdf_create_sdf(SEXP df, SEXP name) {
242
    SEXP ret;
3307 mrmanese 243
    char *iname; 
244
    int namelen, res, i, j;
3255 mrmanese 245
 
3307 mrmanese 246
    /* find free name, attach sdf, create sdf_attributes */
3358 mrmanese 247
    iname = _create_sdf_skeleton1(name, &namelen);
3251 mrmanese 248
 
3307 mrmanese 249
    if (iname != NULL) {
3255 mrmanese 250
        int sql_len, sql_len2;
3252 mrmanese 251
        sqlite3_stmt *stmt;
252
 
3255 mrmanese 253
        /* create sdf_data table */
3252 mrmanese 254
        SEXP names = GET_NAMES(df), variable, levels;
255
        int ncols = GET_LENGTH(names), type, *types;
256
        char *col_name, *class, *factor;
257
 
3324 mrmanese 258
        /* variables for adding rownames */
259
        SEXP rownames;
260
        int nrows;
261
        char *row_name;
262
 
3252 mrmanese 263
        /* TODO: put constraints on table after inserting everything? */
264
 
265
 
266
        /* 
267
         * create the create table and insert sql scripts by looping through
268
         * the columns of df
269
         */
270
        types = (int *)R_alloc(ncols, sizeof(int));
271
        sql_len = sprintf(g_sql_buf[0], "create table [%s].sdf_data ([row name] text", iname);
272
        sql_len2 = sprintf(g_sql_buf[1], "insert into [%s].sdf_data values(?", iname);
273
 
274
        for (i = 0; i < ncols; i++) {
275
            col_name = CHAR(STRING_ELT(names, i));
276
 
277
            /* add column definition to the create table sql */
278
            _expand_buf(0, sql_len+strlen(col_name)+10);
279
 
280
            variable = _getListElement(df, col_name);
281
            class = CHAR(STRING_ELT(GET_CLASS(variable), 0));
282
            type = TYPEOF(variable);
283
            types[i] = type;
284
 
285
            sql_len += sprintf(g_sql_buf[0]+sql_len, ", [%s] %s", col_name, 
286
                    _get_column_type(class, type));
287
 
288
            /* add handler to insert table sql */
289
            _expand_buf(1, sql_len+5);
290
            strcpy(g_sql_buf[1]+sql_len2, ",?");
291
            sql_len2 += 2; 
292
 
293
            /* create separate table for factors decode */
294
            if (strcmp(class, "factor") == 0 || strcmp(class, "ordered") == 0){
3255 mrmanese 295
                if (_create_factor_table2(iname, class, col_name)) 
296
                    return R_NilValue; /* dup tbl name? */
3252 mrmanese 297
 
298
                levels = GET_LEVELS(variable);
3255 mrmanese 299
                sprintf(g_sql_buf[2], "insert into [%s].[%s %s] values(?, ?);",
300
                        iname, class, col_name);
301
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, NULL);
3252 mrmanese 302
                if (_sqlite_error(res)) return R_NilValue; /* dup tbl name? */
303
 
304
                for (j = 0; j < GET_LENGTH(levels); j++) {
305
                    sqlite3_reset(stmt);
306
                    factor = CHAR(STRING_ELT(levels, j));
307
                    sqlite3_bind_int(stmt, 1, j+1);
3307 mrmanese 308
                    sqlite3_bind_text(stmt, 2, factor, -1, SQLITE_STATIC);
3252 mrmanese 309
                    sqlite3_step(stmt);
310
                }
311
                sqlite3_finalize(stmt);
312
            }
313
        }
314
 
315
        _expand_buf(0,sql_len+35);
3324 mrmanese 316
        sql_len += sprintf(g_sql_buf[0]+sql_len, ", primary key([row name]));");
317
        /* sql_len += sprintf(g_sql_buf[0]+sql_len, ");"); */
3252 mrmanese 318
        res = _sqlite_exec(g_sql_buf[0]);
319
        if (_sqlite_error(res)) return R_NilValue; /* why? */
320
 
321
        /*
322
         * add the data in df to the sdf
323
         */
3324 mrmanese 324
        rownames = getAttrib(df, R_RowNamesSymbol);
325
        nrows = GET_LENGTH(rownames);
3252 mrmanese 326
 
3255 mrmanese 327
        sprintf(g_sql_buf[1]+sql_len2, ")");
328
        res = sqlite3_prepare(g_workspace, g_sql_buf[1], -1, &stmt, NULL);
3252 mrmanese 329
 
330
        for (i = 0; i < nrows; i++) {
331
            sqlite3_reset(stmt);
332
 
3324 mrmanese 333
            /* since this is coming from a real dataframe, we're assured that
334
             * the rownames are unique */
335
            if (IS_CHARACTER(rownames)) {
336
                row_name = CHAR(STRING_ELT(rownames, i));
337
                if (*row_name) /* if not empty string */
338
                    sqlite3_bind_text(stmt, 1, row_name, strlen(row_name), SQLITE_STATIC);
339
                else sqlite3_bind_int(stmt, 1, i);
340
            } else if (IS_INTEGER(rownames)) {
341
                sqlite3_bind_int(stmt, 1, INTEGER(rownames)[i]);
342
            } else sqlite3_bind_int(stmt, 1, i);
3252 mrmanese 343
 
344
            for (j = 0; j < ncols; j++) {
345
                variable = VECTOR_ELT(df, j);
346
                switch(types[j]) {
347
                    case INTSXP : 
348
                        sqlite3_bind_int(stmt, j+2, INTEGER(variable)[i]);
349
                        break;
350
                    case REALSXP:
351
                        sqlite3_bind_double(stmt, j+2, REAL(variable)[i]);
352
                        break;
353
                    case CHARSXP:
354
                        col_name = CHAR(STRING_ELT(variable,i));
355
                        sqlite3_bind_text(stmt, j+2, col_name, strlen(col_name), SQLITE_STATIC);
356
                }
357
                /* TODO: handle NA's & NULL's */
358
            }
359
 
360
            res = sqlite3_step(stmt);
361
            if (res != SQLITE_DONE) { 
362
                sqlite3_finalize(stmt);
363
                Rprintf("ERROR: %s\n", sqlite3_errmsg(g_workspace));
364
                return R_NilValue; /* why? */
365
            }
366
        }
367
 
368
        sqlite3_finalize(stmt);
369
 
3308 mrmanese 370
        /* create a new object representing the sdf */
3252 mrmanese 371
        ret = _create_sdf_sexp(iname);
372
 
373
    } else {
3308 mrmanese 374
        Rprintf("ERROR: unable to create a sqlite data frame.\n");
3252 mrmanese 375
        ret = R_NilValue;
3251 mrmanese 376
    }
377
 
3252 mrmanese 378
    return ret;
379
}
380
 
381
SEXP sdf_get_names(SEXP sdf) {
3308 mrmanese 382
    char *iname;
383
    iname = SDF_INAME(sdf);
3358 mrmanese 384
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
3252 mrmanese 385
 
3308 mrmanese 386
    int len;
387
    len = sprintf(g_sql_buf[0], "select * from [%s].sdf_data;", iname);
388
 
3252 mrmanese 389
    sqlite3_stmt *stmt;
3284 mrmanese 390
    int res, i;
3252 mrmanese 391
 
392
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], len, &stmt, NULL);
393
    if (_sqlite_error(res)) return R_NilValue;
394
 
395
    SEXP ret;
396
 
397
    len = sqlite3_column_count(stmt)-1;
398
    PROTECT(ret = NEW_CHARACTER(len));
399
 
3284 mrmanese 400
    for (i = 0; i < len; i++) {
3252 mrmanese 401
        SET_STRING_ELT(ret, i, mkChar(sqlite3_column_name(stmt, i+1)));
402
    }
403
 
404
    sqlite3_finalize(stmt);
3251 mrmanese 405
    UNPROTECT(1);
406
    return ret;
407
}
408
 
3252 mrmanese 409
SEXP sdf_get_length(SEXP sdf) {
3308 mrmanese 410
    char *iname;
411
    iname  = CHAR(STRING_ELT(_getListElement(sdf, "iname"),0));
3358 mrmanese 412
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
3308 mrmanese 413
 
3252 mrmanese 414
    int len = sprintf(g_sql_buf[0], "select * from [%s].sdf_data;", iname);
3251 mrmanese 415
 
3252 mrmanese 416
    sqlite3_stmt *stmt;
417
    int res;
418
 
419
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], len, &stmt, NULL);
420
    if (_sqlite_error(res)) return R_NilValue;
421
 
422
    SEXP ret;
423
 
424
    len = sqlite3_column_count(stmt)-1;
425
    PROTECT(ret = NEW_INTEGER(1));
426
    INTEGER(ret)[0] = len;
427
 
428
    sqlite3_finalize(stmt);
429
    UNPROTECT(1);
430
    return ret;
431
}
432
 
3255 mrmanese 433
/* get row count */
434
SEXP sdf_get_row_count(SEXP sdf) {
3252 mrmanese 435
    char *iname = CHAR(STRING_ELT(_getListElement(sdf, "iname"),0));
3358 mrmanese 436
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
3308 mrmanese 437
 
3358 mrmanese 438
    int nrow;
3252 mrmanese 439
    SEXP ret;
440
 
3358 mrmanese 441
    nrow = _get_row_count2(iname, TRUE);
3252 mrmanese 442
 
3358 mrmanese 443
    if (nrow < 1) ret = R_NilValue;
3252 mrmanese 444
    else {
445
        PROTECT(ret = NEW_INTEGER(1));
3358 mrmanese 446
        INTEGER(ret)[0] = nrow;
3252 mrmanese 447
        UNPROTECT(1);
448
    }
449
 
450
    return ret;
451
}
452
 
453
 
3255 mrmanese 454
SEXP sdf_import_table(SEXP _filename, SEXP _name, SEXP _sep, SEXP _quote, 
455
        SEXP _rownames, SEXP _colnames) {
456
    char *filename = CHAR_ELT(_filename, 0);
457
    FILE *f = fopen(filename, "r");
3252 mrmanese 458
 
3255 mrmanese 459
    if (f == NULL) {
460
        Rprintf("Error: File %s does not exist.", filename);
461
        return R_NilValue;
462
    }
3252 mrmanese 463
 
3282 mrmanese 464
    /*char *sep = CHAR_ELT(_sep, 0), *quote = CHAR_ELT(_quote,0);
465
    char *name = CHAR_ELT(_name, 0);*/
3252 mrmanese 466
 
3255 mrmanese 467
    /* create the table */
468
    /* insert the stuffs */
469
    /* register to workspace */
470
 
471
    return R_NilValue;
472
}
473
 
474
SEXP sdf_get_index(SEXP sdf, SEXP row, SEXP col) {
3282 mrmanese 475
    SEXP ret = R_NilValue;
3255 mrmanese 476
    char *iname = SDF_INAME(sdf);
3358 mrmanese 477
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
3308 mrmanese 478
 
3282 mrmanese 479
    sqlite3_stmt *stmt;
3281 mrmanese 480
    int buflen = 0, idxlen, col_cnt, row_cnt, index;
3255 mrmanese 481
    int i, j,res;
482
    int *col_indices, col_index_len, *dup_indices;
3282 mrmanese 483
    int row_index_len = 0;
3255 mrmanese 484
 
3281 mrmanese 485
    sprintf(g_sql_buf[0], "select * from [%s].sdf_data ", iname);
3255 mrmanese 486
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
487
    if (_sqlite_error(res)) return R_NilValue;
488
 
489
    buflen = sprintf(g_sql_buf[0], "select [row name]");
490
    idxlen = LENGTH(col);
491
    col_cnt = sqlite3_column_count(stmt) - 1;
492
 
493
    /*
494
     * PROCESS COLUMN INDEX
495
     */
3281 mrmanese 496
    if (col == R_NilValue) {
3255 mrmanese 497
        for (i = 1; i < col_cnt+1; i++) {
3281 mrmanese 498
            buflen += sprintf(g_sql_buf[0]+buflen, ",[%s]", 
3255 mrmanese 499
                    sqlite3_column_name(stmt, i)); 
500
        }
3281 mrmanese 501
        _expand_buf(0, buflen+20+strlen(iname));
502
        buflen += sprintf(g_sql_buf[0]+buflen, " from [%s].sdf_data", iname);
503
        col_index_len = col_cnt;
504
        col_indices = (int *)R_alloc(idxlen, sizeof(int));
505
        dup_indices = (int *)R_alloc(idxlen, sizeof(int));
506
        for (i = 0; i < col_cnt; i++) { col_indices[i] = i; dup_indices[i] = 0; }
3255 mrmanese 507
    } else if (col == R_NilValue || idxlen < 1) {
508
        sqlite3_finalize(stmt);
509
        return R_NilValue;
510
    } else if (IS_NUMERIC(col)) {
511
        col_indices = (int *)R_alloc(idxlen, sizeof(int));
512
        dup_indices = (int *)R_alloc(idxlen, sizeof(int));
513
        col_index_len = 0;
514
 
515
        for (i = 0; i < idxlen; i++) {
516
            /* no need to correct for 0 base because col 0 is [row name] */
517
            index = ((int) REAL(col)[i]); 
518
            if (index > col_cnt) {
519
                sqlite3_finalize(stmt);
520
                Rprintf("Error: undefined columns selected\n");
521
                return R_NilValue;
522
            } else if (index > 0) {
3281 mrmanese 523
                buflen += sprintf(g_sql_buf[0]+buflen, ",[%s]", 
3255 mrmanese 524
                        sqlite3_column_name(stmt,index));
525
                dup_indices[col_index_len] = 0;
526
                for (j = 0; j < col_index_len; j++) {
527
                    if (col_indices[j] == index) dup_indices[col_index_len]++;
528
                }
529
                col_indices[col_index_len++] = index;
530
            } else if (index < 0) {
531
                sqlite3_finalize(stmt);
532
                Rprintf("Error: negative indices not supported.\n");
533
                return R_NilValue;
534
            }
535
        }
536
 
537
        if (col_index_len == 0) {
538
            sqlite3_finalize(stmt);
539
            Rprintf("Error: no indices detected??\n");
540
            return R_NilValue;
3281 mrmanese 541
        } else { 
542
            _expand_buf(0, buflen+20+strlen(iname));
543
            buflen += sprintf(g_sql_buf[0]+buflen, " from [%s].sdf_data", iname);
3255 mrmanese 544
        }
545
    } else if (IS_INTEGER(col)) {
546
        /* identical logic with IS_NUMERIC, except that we don't have to cast
547
         * stuffs from SEXP col. the alternative is doing if idxlen times. */
548
        col_indices = (int *)R_alloc(idxlen, sizeof(int));
549
        dup_indices = (int *)R_alloc(idxlen, sizeof(int));
550
        col_index_len = 0;
551
 
552
        for (i = 0; i < idxlen; i++) {
553
            /* no need to correct for 0 base because col 0 is [row name] */
554
            index = INTEGER(col)[i];
555
            if (index > col_cnt) {
556
                sqlite3_finalize(stmt);
557
                Rprintf("Error: undefined columns selected\n");
558
                return R_NilValue;
559
            } else if (index > 0) {
3281 mrmanese 560
                buflen += sprintf(g_sql_buf[0]+buflen, ",[%s]", 
3255 mrmanese 561
                        sqlite3_column_name(stmt,index));
562
                dup_indices[col_index_len] = 0;
563
                for (j = 0; j < col_index_len; j++) {
564
                    if (col_indices[j] == index) dup_indices[col_index_len]++;
565
                }
566
                col_indices[col_index_len++] = index;
567
            } else if (index < 0) {
568
                sqlite3_finalize(stmt);
569
                Rprintf("Error: negative indices not supported.\n");
570
                return R_NilValue;
571
            }
572
        }
573
 
574
        if (col_index_len == 0) {
575
            sqlite3_finalize(stmt);
576
            Rprintf("Error: no indices detected??\n");
577
            return R_NilValue;
3281 mrmanese 578
        } else { 
579
            _expand_buf(0, buflen+20+strlen(iname));
580
            buflen += sprintf(g_sql_buf[0]+buflen, " from [%s].sdf_data", iname);
3255 mrmanese 581
        }
582
    } else if (IS_LOGICAL(col)) {
583
        /* recycling stuff, so max column output is the # of cols in the df */
584
        col_indices = (int *)R_alloc(col_cnt, sizeof(int));
585
        dup_indices = (int *)R_alloc(col_cnt, sizeof(int));
586
        col_index_len = 0;
587
        for (i = 0; i < col_cnt; i++) {
588
            if (LOGICAL(col)[i%idxlen]) {
3281 mrmanese 589
                buflen += sprintf(g_sql_buf[0]+buflen, ",[%s]", 
3255 mrmanese 590
                        sqlite3_column_name(stmt,i+1));
591
                dup_indices[col_index_len] = 0;
592
                col_indices[col_index_len++] = i;
593
            }
594
        }
595
 
596
        if (col_index_len == 0) {
597
            sqlite3_finalize(stmt);
598
            Rprintf("Warning: no column selected.\n");
599
            return R_NilValue;
3281 mrmanese 600
        } else { 
601
            _expand_buf(0, buflen+20+strlen(iname));
602
            buflen += sprintf(g_sql_buf[0]+buflen, " from [%s].sdf_data", iname);
3255 mrmanese 603
        }
604
    } else {
605
        sqlite3_finalize(stmt);
606
        Rprintf("Error: don't know how to handle column index.\n");
607
        return R_NilValue;
608
    }
609
 
610
    /* 
611
     * PROCESS ROW INDEX
612
     */
613
    idxlen = LENGTH(row);
3281 mrmanese 614
    if (row == R_NilValue) {
615
        if (col_index_len == 1) {
616
            ret = sdf_get_variable(sdf, mkString(sqlite3_column_name(stmt,col_indices[0])));
617
            sqlite3_finalize(stmt);
618
            return ret;
619
        } if (col_index_len > 1) {
3255 mrmanese 620
            /* create a new SDF, logic similar to sdf_create_sdf */
621
 
622
            /* find a new name. data<n> ? */
3307 mrmanese 623
            char *iname2;
3281 mrmanese 624
            const char *colname;
3307 mrmanese 625
            int namelen, sql_len, sql_len2;
3255 mrmanese 626
 
3358 mrmanese 627
            iname2 = _create_sdf_skeleton1(R_NilValue, &namelen);
3255 mrmanese 628
 
629
            /* create sdf_data table */
3281 mrmanese 630
            sql_len = sprintf(g_sql_buf[1], "create table [%s].sdf_data ([row name] text", iname2);
631
            sql_len2 = 0;
3255 mrmanese 632
 
633
            for (i = 0; i < col_index_len; i++) {
634
                colname = sqlite3_column_name(stmt, col_indices[i]);
635
                if (dup_indices[i] == 0) {
3281 mrmanese 636
                    sql_len += sprintf(g_sql_buf[1]+sql_len, ", [%s] %s", colname,
3255 mrmanese 637
                            sqlite3_column_decltype(stmt, col_indices[i]));
638
                } else {
639
                    /* un-duplicate col names by appending num, just like R */
3281 mrmanese 640
                    sql_len += sprintf(g_sql_buf[1]+sql_len, ", [%s.%d] %s", colname,
3255 mrmanese 641
                            dup_indices[i], 
642
                            sqlite3_column_decltype(stmt, col_indices[i]));
643
                }
644
 
645
                /* deal with possibly factor columns */
646
                if (_is_factor2(iname, "factor", colname)) {
647
                    /* found a factor column */
3281 mrmanese 648
 
3255 mrmanese 649
                    if (dup_indices[i] == 0)  {
650
                        _copy_factor_levels2("factor", iname, colname, iname2, colname);
651
                    } else {
652
                        sprintf(g_sql_buf[3], "%s.%d", colname, dup_indices[i]);
653
                        _copy_factor_levels2("factor", iname, colname, iname2, 
654
                                g_sql_buf[3]);
655
                    }
656
                }
657
 
658
                /* and deal with ordered factors too... life is hard, then you die */
659
                if (_is_factor2(iname, "ordered", colname)) {
3281 mrmanese 660
 
3255 mrmanese 661
                    if (dup_indices[i] == 0)  {
662
                        _copy_factor_levels2("ordered", iname, colname, iname2, 
663
                                colname);
664
                    } else {
665
                        sprintf(g_sql_buf[3], "%s.%d", colname, dup_indices[i]);
666
                        _copy_factor_levels2("ordered", iname, colname, iname2, 
667
                                g_sql_buf[3]);
668
                    }
669
                }
670
 
671
            }
672
 
673
            /* don't need it anymore */
674
            sqlite3_finalize(stmt);
675
 
676
            /* no table index created, that's for v2 I hope*/
677
            sql_len += sprintf(g_sql_buf[1]+sql_len, ");");
678
            res = _sqlite_exec(g_sql_buf[1]);
3281 mrmanese 679
            if (_sqlite_error(res)) { Rprintf("here? %s\n", g_sql_buf[1]); return R_NilValue; }
3255 mrmanese 680
 
681
            /* insert data (with row names). buf[0] contains a select */
682
            sprintf(g_sql_buf[1], "insert into [%s].sdf_data %s", iname2,
683
                    g_sql_buf[0]);
684
            res = _sqlite_exec(g_sql_buf[1]);
685
            if (_sqlite_error(res)) return R_NilValue;
686
 
687
            /* add new sdf to workspace */
688
            sprintf(g_sql_buf[0], "%s.db", iname2);
3281 mrmanese 689
            res = _add_sdf1(g_sql_buf[0], iname2);
3255 mrmanese 690
            if (_sqlite_error(res)) return R_NilValue;
691
 
692
            /* create SEXP for the SDF */
693
            ret = _create_sdf_sexp(iname2);
3281 mrmanese 694
            return ret;
3255 mrmanese 695
        } else { sqlite3_finalize(stmt); return R_NilValue; }
696
    } else if (row == R_NilValue || idxlen < 1) {
697
        sqlite3_finalize(stmt);
698
        return R_NilValue;
699
    } else if (IS_NUMERIC(row)) {
700
        sqlite3_finalize(stmt);
701
 
3281 mrmanese 702
        sprintf(g_sql_buf[1], "[%s].sdf_data", iname);
3358 mrmanese 703
        row_cnt = _get_row_count2(g_sql_buf[1], 0);
3281 mrmanese 704
 
3255 mrmanese 705
        /* append " limit ?,1" to the formed select statement */
706
        _expand_buf(0, buflen+10);
3281 mrmanese 707
        buflen += sprintf(g_sql_buf[0]+buflen, " limit ?,1");
708
        /*Rprintf("sql [%d]: %s\n", buflen, g_sql_buf[0]); */
3255 mrmanese 709
 
3281 mrmanese 710
        index = ((int) REAL(row)[0]) - 1;
3255 mrmanese 711
        if (idxlen < 0 && idxlen == 1) return R_NilValue;
712
 
713
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
714
        if (_sqlite_error(res)) return R_NilValue;
715
 
716
        sqlite3_bind_int(stmt, 1, index);
717
        res = sqlite3_step(stmt);
718
 
719
        /* create data frame */
3281 mrmanese 720
        ret = _setup_df_sexp1(stmt, iname, col_index_len, idxlen, dup_indices);
721
        if (ret == R_NilValue) { sqlite3_finalize(stmt); return R_NilValue; }
3255 mrmanese 722
 
3281 mrmanese 723
        /* put data in it */
724
        if (index >= 0 && index < row_cnt) {
725
            _add_row_to_df(ret, stmt, row_index_len++, col_index_len);
726
        }
3255 mrmanese 727
 
3281 mrmanese 728
        for (i = 1; i < idxlen; i++) {
729
            sqlite3_reset(stmt);
730
            index = ((int) REAL(row)[i]) - 1;
731
            if (index >= 0 && index < row_cnt) {
732
                sqlite3_bind_int(stmt, 1, index);
733
                res = sqlite3_step(stmt);
734
                _add_row_to_df(ret, stmt, row_index_len++, col_index_len);
735
            }
736
        }
737
        sqlite3_finalize(stmt);
738
 
739
        /* shrink vectors */
740
        if (row_index_len < idxlen) {
741
            for (i = 0; i < col_index_len; i++) {
742
                SET_VECTOR_ELT(ret, i, 
743
                        _shrink_vector(VECTOR_ELT(ret, i), row_index_len));
744
            }
745
        }
746
 
747
        UNPROTECT(1); /* for the ret from _setup_df_sexp1 */
748
    } else if (IS_INTEGER(row)) {
749
        /* same stuff as with IS_INTEGER, except for setting of var index*/
750
        sqlite3_finalize(stmt);
751
 
752
        sprintf(g_sql_buf[1], "[%s].sdf_data", iname);
3358 mrmanese 753
        row_cnt = _get_row_count2(g_sql_buf[1], 0);
3281 mrmanese 754
 
755
        /* append " limit ?,1" to the formed select statement */
756
        _expand_buf(0, buflen+10);
757
        buflen += sprintf(g_sql_buf[0]+buflen, " limit ?,1");
758
 
759
        index = INTEGER(row)[0] - 1;
760
        if (idxlen < 0 && idxlen == 1) return R_NilValue;
761
 
762
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
763
        if (_sqlite_error(res)) return R_NilValue;
764
 
765
        sqlite3_bind_int(stmt, 1, index);
766
        res = sqlite3_step(stmt);
767
 
768
        /* create data frame */
769
        ret = _setup_df_sexp1(stmt, iname, col_index_len, idxlen, dup_indices);
770
        if (ret == R_NilValue) { sqlite3_finalize(stmt); return R_NilValue; }
771
 
3255 mrmanese 772
        /* put data in it */
3281 mrmanese 773
        if (index >= 0 && index < row_cnt) {
774
            _add_row_to_df(ret, stmt, row_index_len++, col_index_len);
775
        }
776
 
777
        for (i = 1; i < idxlen; i++) {
778
            sqlite3_reset(stmt);
779
            index = INTEGER(row)[i] - 1;
780
            if (index >= 0 && index < row_cnt) {
781
                sqlite3_bind_int(stmt, 1, index);
782
                res = sqlite3_step(stmt); 
783
                _add_row_to_df(ret, stmt, row_index_len++, col_index_len);
784
            }
785
        }
786
        sqlite3_finalize(stmt);
787
 
788
        /* shrink vectors */
789
        if (row_index_len < idxlen) {
790
            for (i = 0; i < col_index_len; i++) {
791
                SET_VECTOR_ELT(ret, i, 
792
                        _shrink_vector(VECTOR_ELT(ret, i), row_index_len));
793
            }
794
        }
795
        UNPROTECT(1); /* for the ret from _setup_df_sexp1 */
3255 mrmanese 796
    } else if (IS_LOGICAL(row)) {
797
        /* */
3281 mrmanese 798
        sqlite3_finalize(stmt);
799
        int est_row_cnt = 0;
800
 
801
        sprintf(g_sql_buf[1], "[%s].sdf_data", iname);
3358 mrmanese 802
        row_cnt = _get_row_count2(g_sql_buf[1], 0);
3281 mrmanese 803
 
804
        /* append " limit ?,1" to the formed select statement */
805
        _expand_buf(0, buflen+10);
806
        buflen += sprintf(g_sql_buf[0]+buflen, " limit ?,1");
807
 
808
        /* find if there is any TRUE element in the vector */
3282 mrmanese 809
        for (i = 0; i < idxlen && i < row_cnt; i++) {
3281 mrmanese 810
            if (LOGICAL(row)[i]) break;
811
        }
812
 
3282 mrmanese 813
        if (i < idxlen && i < row_cnt) {
3281 mrmanese 814
            est_row_cnt = (idxlen-i) * (row_cnt/idxlen);
815
            if (row_cnt%idxlen > i) est_row_cnt += (row_cnt%idxlen - i);
816
 
817
            res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
818
            if (_sqlite_error(res)) return R_NilValue;
819
 
820
            sqlite3_bind_int(stmt, 1, i);
821
            sqlite3_step(stmt);
822
            ret = _setup_df_sexp1(stmt, iname, col_index_len, est_row_cnt, dup_indices);
823
            _add_row_to_df(ret, stmt, row_index_len++, col_index_len);
824
 
825
            for (i++ ; i < row_cnt; i++) {
826
                if (LOGICAL(row)[i%idxlen]) {
827
                    sqlite3_reset(stmt);
828
                    sqlite3_bind_int(stmt, 1, i);
829
                    sqlite3_step(stmt);
830
                    _add_row_to_df(ret, stmt, row_index_len++, col_index_len);
831
                }
832
            }
833
        }
834
 
835
        sqlite3_finalize(stmt);
836
 
837
        /* shrink vectors */
838
        if (est_row_cnt > 0 && row_index_len < est_row_cnt) {
839
            for (i = 0; i < col_index_len; i++) {
840
                SET_VECTOR_ELT(ret, i, 
841
                        _shrink_vector(VECTOR_ELT(ret, i), row_index_len));
842
            }
843
        }
844
 
845
        UNPROTECT(1); /* for the ret from _setup_df_sexp1 */
3255 mrmanese 846
    }
847
 
3281 mrmanese 848
    if (ret != R_NilValue && col_index_len > 1) {
849
        SEXP class = mkString("data.frame");
850
        SET_CLASS(ret, class);
851
        _set_rownames2(ret);
852
    } else if (ret != R_NilValue && col_index_len == 1) {
853
        ret = VECTOR_ELT(ret, 0);
854
    }
3255 mrmanese 855
 
856
    return ret;
857
}
858
 
3324 mrmanese 859
SEXP sdf_rbind(SEXP sdf, SEXP data) {
3358 mrmanese 860
    char *class = CHAR_ELT(GET_CLASS(data), 0);
861
    char *iname = SDF_INAME(sdf), *colname, *rowname;
862
    SEXP ret = R_NilValue, col, names, levels, rownames;
863
    int ncols, buflen, buflen2, i, j, res, nrows, *types;
3324 mrmanese 864
    sqlite3_stmt *stmt;
3358 mrmanese 865
    const char *type;
3281 mrmanese 866
 
3324 mrmanese 867
    if (strcmp(class,"data.frame") == 0) {
868
        /* check table names, types. variables may not be in same order, as
869
         * long as names and types are identical. */
870
        names = GET_NAMES(data);
3358 mrmanese 871
        ncols = GET_LENGTH(names);
3324 mrmanese 872
 
873
        buflen = sprintf(g_sql_buf[0], "select 1");
3358 mrmanese 874
        for (i = 0; i < ncols; i++) {
3324 mrmanese 875
            _expand_buf(0, buflen + 100);
876
            buflen += sprintf(g_sql_buf[0]+buflen, ",[%s]", CHAR_ELT(names, i));
877
        }
878
        _expand_buf(0, buflen + 100);
3358 mrmanese 879
        sprintf(g_sql_buf[0]+buflen, " from [%s].sdf_data", iname);
3324 mrmanese 880
 
881
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, NULL);
882
        if (res != SQLITE_OK) { /* column name mismatch */
883
            Rprintf("Error: column names should exactly match the names of the SDF.\n");
884
            return ret;
885
        }
886
 
887
        /* now check the type */
3358 mrmanese 888
        types = (int *)R_alloc(ncols, sizeof(int));
889
        for (i = 0; i< ncols; i++) {
890
            type = sqlite3_column_decltype(stmt, i+1); /* +1 bec 1st col is "1" */
3324 mrmanese 891
 
892
            col = VECTOR_ELT(data, i);
893
            class = CHAR_ELT(GET_CLASS(col),0);
894
 
3358 mrmanese 895
            if (strcmp(type, "double") == 0 && IS_NUMERIC(col)) types[i] = SQLITE_FLOAT;
896
            else if (strcmp(type, "text") == 0 && IS_CHARACTER(col)) types[i] = SQLITE_TEXT;
897
            else if (strcmp(type, "int") == 0) { 
898
                types[i] = SQLITE_INTEGER;
899
                if (isUnordered(col)) {  /* test if factor */
900
                    colname = CHAR_ELT(names, i);
3324 mrmanese 901
                    sqlite3_stmt *stmt2;
902
                    if (!_is_factor2(iname, "factor", colname)) break;
903
                    sprintf(g_sql_buf[1], "[%s].[factor %s]", iname, colname);
3358 mrmanese 904
                    nrows = _get_row_count2(g_sql_buf[1], 0);
3324 mrmanese 905
 
3358 mrmanese 906
                    /* levels in sdf must be >= levels in df */
3324 mrmanese 907
                    levels = GET_LEVELS(col);
908
                    if (nrows < GET_LENGTH(levels)) {
909
                        Rprintf("Error: The data frame variable %s has more levels than"
910
                                " its SDF counterpart.\n", colname);
911
                        break;
912
                    }
913
 
3358 mrmanese 914
                    sprintf(g_sql_buf[2], "select label from %s order by level", g_sql_buf[1]);
915
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, NULL);
916
                    _sqlite_error(res);
3324 mrmanese 917
 
3358 mrmanese 918
                    for (j = 0; j < GET_LENGTH(levels); j++)  {
3324 mrmanese 919
                        sqlite3_step(stmt2);
3358 mrmanese 920
                        if (strcmp((char *)sqlite3_column_text(stmt2, 0), CHAR_ELT(levels, j)) != 0) {
3324 mrmanese 921
                            Rprintf("Error: Level label mismatch in variable %s, [%s] in data frame"
922
                                    " vs [%s] in SDF.\n", colname, (char *)sqlite3_column_text(stmt2, 0),
923
                                    CHAR_ELT(levels, j));
3358 mrmanese 924
                            sqlite3_finalize(stmt2);
3324 mrmanese 925
                            break;
926
                        }
927
                    }
3358 mrmanese 928
                    sqlite3_finalize(stmt2);
929
                } else if (isOrdered(col)) { /* same with ordered */
930
                    colname = CHAR_ELT(names, i);
3324 mrmanese 931
                    sqlite3_stmt *stmt2;
932
                    if (!_is_factor2(iname, "ordered", colname)) break;
933
                    sprintf(g_sql_buf[1], "[%s].[ordered %s]", iname, colname);
3358 mrmanese 934
                    nrows = _get_row_count2(g_sql_buf[1], 0);
3324 mrmanese 935
 
3358 mrmanese 936
                    /* levels in sdf must be >= levels in df */
3324 mrmanese 937
                    levels = GET_LEVELS(col);
938
                    if (nrows < GET_LENGTH(levels)) {
939
                        Rprintf("Error: The data frame variable %s has more levels than"
940
                                " its SDF counterpart.\n", colname);
941
                        break;
942
                    }
943
 
3358 mrmanese 944
                    sprintf(g_sql_buf[2], "select label from %s order by level", g_sql_buf[1]);
3324 mrmanese 945
                    sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, NULL);
946
 
3358 mrmanese 947
                    for (j = 0; j < GET_LENGTH(levels); j++)  {
3324 mrmanese 948
                        sqlite3_step(stmt2);
3358 mrmanese 949
                        if (strcmp((char *)sqlite3_column_text(stmt2, 0), CHAR_ELT(levels, j)) != 0) {
3324 mrmanese 950
                            Rprintf("Error: Level label mismatch in variable %s, [%s] in data frame"
951
                                    " vs [%s] in SDF.\n", colname, (char *)sqlite3_column_text(stmt2, 0),
952
                                    CHAR_ELT(levels, j));
3358 mrmanese 953
                            sqlite3_finalize(stmt2);
3324 mrmanese 954
                            break;
955
                        }
956
                    }
3358 mrmanese 957
                    sqlite3_finalize(stmt2);
3324 mrmanese 958
                }  /* else if class == "ordered" */
959
            } /* if integer */
960
        } /* for loop for column type checking */
961
 
3358 mrmanese 962
        sqlite3_finalize(stmt);
963
        if (i < ncols) {
3324 mrmanese 964
            Rprintf("Error: type mismatch at variable %s\n", CHAR_ELT(names, i));
965
            return ret;
966
        }
967
 
968
        /* create the insert statement */
969
        buflen = sprintf(g_sql_buf[0], "insert into [%s].sdf_data([row name]", iname);
970
        buflen2 = sprintf(g_sql_buf[1], "values(?");
3358 mrmanese 971
        for (i = 0; i < ncols; i++) {
3324 mrmanese 972
            _expand_buf(0, buflen+100);
973
            buflen += sprintf(g_sql_buf[0]+buflen, ",[%s]", CHAR_ELT(names, i));
974
            _expand_buf(1, buflen2+5);
975
            buflen2 += sprintf(g_sql_buf[1]+buflen2, ",?");
976
        }
977
 
978
        _expand_buf(2, buflen + buflen2 + 10);
3358 mrmanese 979
        sprintf(g_sql_buf[2], "%s) %s)", g_sql_buf[0], g_sql_buf[1]);
980
        Rprintf("%s\n", g_sql_buf[2]);
3324 mrmanese 981
        res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, NULL);
982
        if (_sqlite_error(res)) return ret;
983
 
984
        /* finally, add rows */
985
        nrows = LENGTH(GET_ROWNAMES(data));
3358 mrmanese 986
        rownames = GET_ROWNAMES(data);
3324 mrmanese 987
 
988
        for (i = 0; i < nrows; i++) {
3358 mrmanese 989
            sqlite3_bind_text(stmt, 1, CHAR_ELT(rownames, i), -1, SQLITE_STATIC);
990
            for (j = 0; j < ncols; j++) {
991
                col = VECTOR_ELT(data, j);
992
                switch(types[j]) {
993
                    case SQLITE_FLOAT:
994
                        sqlite3_bind_double(stmt, j+2, REAL(col)[i]); break;
995
                    case SQLITE_TEXT:
996
                        sqlite3_bind_text(stmt, j+2, CHAR_ELT(col, i), -1, SQLITE_STATIC); break;
997
                    case SQLITE_INTEGER:
998
                    default:  /* runtime error if we're wrong */
999
                        sqlite3_bind_int(stmt, j+2, INTEGER(col)[i]); break;
1000
                }
1001
            }
1002
 
1003
            res = sqlite3_step(stmt);
1004
            if (res != SQLITE_DONE) { /* row name pk conflict */
1005
                rowname = CHAR_ELT(rownames, i);
1006
                for (j = 1; res != SQLITE_DONE; j++) { /* _normally_, j shouldn't overflow */
1007
                    sqlite3_reset(stmt);
1008
                    sprintf(g_sql_buf[2], "%s-%d", rowname, j);
1009
                    sqlite3_bind_text(stmt, 1, g_sql_buf[2], -1, SQLITE_STATIC);
1010
                    res = sqlite3_step(stmt);
1011
                }
1012
            }
1013
            sqlite3_reset(stmt);
3324 mrmanese 1014
        }
1015
 
3358 mrmanese 1016
        sqlite3_finalize(stmt);
1017
        ret = sdf;
3324 mrmanese 1018
    } else if (strcmp(class,"sqlite.data.frame") == 0) {
1019
    }
1020
 
1021
    return ret;
1022
}
1023
 
1024
 
3358 mrmanese 1025
SEXP sdf_get_iname(SEXP sdf) {
1026
    return _getListElement(sdf, "iname");
1027
}
1028
 
3251 mrmanese 1029
SEXP sopen(SEXP name) {
1030
    char *filename;
1031
 
1032
    if (IS_CHARACTER(name)) {
1033
        filename = CHAR(STRING_ELT(name,0));
1034
        Rprintf("%s\n", filename);
1035
    }
1036
    /* sqlite3 *db;
1037
    int res = sqlite3_open(filename, &db); */
1038
    SEXP ret;
1039
    PROTECT(ret = NEW_LOGICAL(1));
1040
    LOGICAL(ret)[0] = IS_CHARACTER(name);
1041
    /* sqlite3_close(db); */ 
1042
    UNPROTECT(1);
1043
    return ret;
1044
}