The R Project SVN R-packages

Rev

Rev 3473 | Rev 3821 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3473 Rev 3509
Line 46... Line 46...
46
    char *tmp = iname;
46
    char *tmp = iname;
47
    while ((tmp = strpbrk(tmp, ".!@#$%^&*()-+=")) == NULL) *tmp = '_';
47
    while ((tmp = strpbrk(tmp, ".!@#$%^&*()-+=")) == NULL) *tmp = '_';
48
    return iname;
48
    return iname;
49
}
49
}
50
 
50
 
51
/*
-
 
52
int _sql_exec_noret(char *sql, ...) {
-
 
53
    int len;
-
 
54
    _check_sql_buf();
-
 
55
 
-
 
56
    len = sprintf(g_sql_buf, sql);
-
 
57
}*/
-
 
58
 
-
 
59
int _check_sql_buf(int i) {
51
int _check_sql_buf(int i) {
60
    if (i >= NBUFS) return FALSE;
-
 
61
    int ret = strlen(g_sql_buf[i]);
52
    int ret = strlen(g_sql_buf[i]);
-
 
53
    if (i >= NBUFS) return FALSE;
62
    if ((ret*1.0/g_sql_buf_sz[i]) > 0.6) {
54
    if ((ret*1.0/g_sql_buf_sz[i]) > 0.6) {
63
        g_sql_buf_sz[i] *= 2;
55
        g_sql_buf_sz[i] *= 2;
64
        g_sql_buf[i] = Realloc(g_sql_buf[i], g_sql_buf_sz[i], char);
56
        g_sql_buf[i] = Realloc(g_sql_buf[i], g_sql_buf_sz[i], char);
65
    } else ret = 0;
57
    } else ret = 0;
66
    return ret;
58
    return ret;
Line 98... Line 90...
98
 
90
 
99
const char *_get_r_class(const char *db, const char *type) {
91
const char *_get_r_class(const char *db, const char *type) {
100
    return NULL;
92
    return NULL;
101
}
93
}
102
 
94
 
103
int __count_callback(void *data, int ncols, char **rows, char **cols) {
-
 
104
    *((int*) data) = atoi(rows[0]);
-
 
105
    return 0;
-
 
106
}
-
 
107
 
-
 
108
int _get_row_count2(const char *table, int quote) {
95
int _get_row_count2(const char *table, int quote) {
-
 
96
    int ret, res;
-
 
97
    sqlite3_stmt *stmt;
-
 
98
 
109
    if (quote) sprintf(g_sql_buf[2], "select count(*) from [%s].sdf_data", table);
99
    if (quote) sprintf(g_sql_buf[2], "select count(*) from [%s].sdf_data", table);
110
    else sprintf(g_sql_buf[2], "select count(*) from %s", table);
100
    else sprintf(g_sql_buf[2], "select count(*) from %s", table);
111
   
101
   
112
    int ret, res;
-
 
113
    res = sqlite3_exec(g_workspace, g_sql_buf[2], __count_callback, &ret, NULL);
102
    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, NULL);
114
    if (res != SQLITE_OK) return -1;
103
    if (res != SQLITE_OK) return -1;
-
 
104
    sqlite3_step(stmt);
-
 
105
    ret = sqlite3_column_int(stmt, 0);
-
 
106
    sqlite3_finalize(stmt);
115
    return ret;
107
    return ret;
116
}
108
}
117
 
109
 
118
/* TODO: windows version */
110
/* TODO: windows version */
119
char *_get_full_pathname2(char *relpath) {
111
char *_get_full_pathname2(char *relpath) {
Line 188... Line 180...
188
    return ret;
180
    return ret;
189
}
181
}
190
 
182
 
191
/* return the row names of an sdf as a sqlite.vector */
183
/* return the row names of an sdf as a sqlite.vector */
192
SEXP _get_rownames2(const char *sdf_iname) {
184
SEXP _get_rownames2(const char *sdf_iname) {
-
 
185
    int res;
193
    sqlite3_stmt *stmt;
186
    sqlite3_stmt *stmt;
-
 
187
    SEXP ret, value;
-
 
188
    int nprotected = 1;
-
 
189
 
194
    sprintf(g_sql_buf[2], "select [row name] from [%s].sdf_data", sdf_iname);
190
    sprintf(g_sql_buf[2], "select [row name] from [%s].sdf_data", sdf_iname);
195
    int res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
191
    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
196
 
192
 
197
    sqlite3_finalize(stmt);
193
    sqlite3_finalize(stmt);
198
    if (_sqlite_error(res)) return R_NilValue; 
194
    if (_sqlite_error(res)) return R_NilValue; 
199
 
195
 
200
    SEXP ret, value;
-
 
201
    int nprotected = 1;
-
 
202
    PROTECT(ret = NEW_LIST(2)); 
196
    PROTECT(ret = NEW_LIST(2)); 
203
 
197
 
204
    /* set list names */
198
    /* set list names */
205
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
199
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
206
    SET_STRING_ELT(value, 0, mkChar("iname"));
200
    SET_STRING_ELT(value, 0, mkChar("iname"));
Line 257... Line 251...
257
    SET_LEVELS(var, levels);
251
    SET_LEVELS(var, levels);
258
    UNPROTECT(1);
252
    UNPROTECT(1);
259
}
253
}
260
    
254
    
261
int _get_factor_levels1(const char *iname, const char *varname, SEXP var) {
255
int _get_factor_levels1(const char *iname, const char *varname, SEXP var) {
262
    int ret = VAR_INTEGER;
256
    int res;
263
    
257
    
264
    sprintf(g_sql_buf[1], "[%s].[factor %s]", iname, varname);
258
    sprintf(g_sql_buf[1], "[%s].[factor %s]", iname, varname);
265
    int res = _get_row_count2(g_sql_buf[1], 0);
259
    res = _get_row_count2(g_sql_buf[1], 0);
266
    if (res > 0) { /* res is exptected to be {-1} \union I+ */
260
    if (res > 0) { /* res is exptected to be {-1} \union I+ */
267
        __attach_levels2(g_sql_buf[1], var, res);
261
        __attach_levels2(g_sql_buf[1], var, res);
268
        ret = VAR_FACTOR;
262
        return VAR_FACTOR;
269
    }
263
    }
270
 
264
 
271
    sprintf(g_sql_buf[1], "[%s].[ordered %s]", iname, varname);
265
    sprintf(g_sql_buf[1], "[%s].[ordered %s]", iname, varname);
272
    res = _get_row_count2(g_sql_buf[1], 0);
266
    res = _get_row_count2(g_sql_buf[1], 0);
273
    if (res > 0) {
267
    if (res > 0) {
274
        __attach_levels2(g_sql_buf[1], var, res);
268
        __attach_levels2(g_sql_buf[1], var, res);
275
        ret = VAR_ORDERED;
269
        return VAR_ORDERED;
276
    }
270
    }
277
 
271
 
278
    return ret;
272
    return VAR_INTEGER;
279
}
273
}
280
 
274
 
281
SEXP _shrink_vector(SEXP vec, int len) {
275
SEXP _shrink_vector(SEXP vec, int len) {
282
    int origlen = LENGTH(vec);
276
    int origlen = LENGTH(vec);
283
    SEXP ret = vec;
277
    SEXP ret = vec;
Line 319... Line 313...
319
    sqlite3_finalize(stmt);
313
    sqlite3_finalize(stmt);
320
 
314
 
321
    /* test if we have to detach somebody */
315
    /* test if we have to detach somebody */
322
    if (nloaded == MAX_ATTACHED) {
316
    if (nloaded == MAX_ATTACHED) {
323
        /* have to evict */
317
        /* have to evict */
-
 
318
        char *iname2;
324
        sqlite3_prepare(g_workspace, "select internal_name from workspace "
319
        sqlite3_prepare(g_workspace, "select internal_name from workspace "
325
                "where loaded=1 and used=0 order by uses", -1, &stmt, NULL);
320
                "where loaded=1 and used=0 order by uses", -1, &stmt, NULL);
326
        sqlite3_step(stmt);
321
        sqlite3_step(stmt);
327
        char *iname2;
-
 
328
        iname2 = (char *)sqlite3_column_text(stmt, 0);
322
        iname2 = (char *)sqlite3_column_text(stmt, 0);
329
        sprintf(g_sql_buf[2], "detach [%s]", iname2);
323
        sprintf(g_sql_buf[2], "detach [%s]", iname2);
330
        _sqlite_error(_sqlite_exec(g_sql_buf[2]));
324
        _sqlite_error(_sqlite_exec(g_sql_buf[2]));
331
        sprintf(g_sql_buf[2], "update workspace set loaded=0 where internal_name='%s'", iname2);
325
        sprintf(g_sql_buf[2], "update workspace set loaded=0 where internal_name='%s'", iname2);
332
        sqlite3_finalize(stmt); 
326
        sqlite3_finalize(stmt); 
Line 340... Line 334...
340
    int i;
334
    int i;
341
    for (i = 0; ref[i]; i++) out[i] = tolower(ref[i]);
335
    for (i = 0; ref[i]; i++) out[i] = tolower(ref[i]);
342
    out[i] = 0;
336
    out[i] = 0;
343
    return out;
337
    return out;
344
}
338
}
345
 
-
 
346
/* see equivalent: inherits() */
-
 
347
/* int _sexp_instance_of(SEXP obj, const char *class) {
-
 
348
    SEXP obj_class = GET_CLASS(obj);
-
 
349
    int ret = 0, len = LENGTH(obj_class), i;
-
 
350
 
-
 
351
    for (i = 0; i < len; i++) {
-
 
352
        if (strcmp(CHAR_ELT(obj_class, i), class) == 0) {
-
 
353
            ret = 1; break;
-
 
354
        }
-
 
355
    }
-
 
356
    return ret;
-
 
357
} */
-
 
358
 
-