The R Project SVN R-packages

Rev

Rev 3419 | Rev 3435 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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