The R Project SVN R-packages

Rev

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

Rev 3419 Rev 3446
Line 174... Line 174...
174
            g_sql_buf_sz[i] = 1024;
174
            g_sql_buf_sz[i] = 1024;
175
            g_sql_buf[i] = Calloc(g_sql_buf_sz[i], char);
175
            g_sql_buf[i] = Calloc(g_sql_buf_sz[i], char);
176
        }
176
        }
177
    }
177
    }
178
 
178
 
-
 
179
    /* create symbols used for object attributes */
-
 
180
    SDF_RowNamesSymbol = install("sdf.row.names");
-
 
181
    SDF_DimSymbol = install("sdf.dim");
-
 
182
    SDF_DimNamesSymbol = install("sdf.dimnames");
-
 
183
 
179
    /*
184
    /*
180
     * check for workspace.db, workspace1.db, ..., workspace9999.db if they
185
     * check for workspace.db, workspace1.db, ..., workspace9999.db if they
181
     * are valid workspace file. if one is found, use that as the workspace.
186
     * are valid workspace file. if one is found, use that as the workspace.
182
     */
187
     */
183
    filename = R_alloc(18, sizeof(char)); /* workspace10000.db\0 */
188
    filename = R_alloc(18, sizeof(char)); /* workspace10000.db\0 */
Line 186... Line 191...
186
        if ((g_workspace = _is_workspace(filename)) != NULL) break;
191
        if ((g_workspace = _is_workspace(filename)) != NULL) break;
187
        Rprintf("%s is not a workspace\n", filename);
192
        Rprintf("%s is not a workspace\n", filename);
188
        sprintf(filename, "%s%d.db", basename, ++file_idx);
193
        sprintf(filename, "%s%d.db", basename, ++file_idx);
189
    }
194
    }
190
 
195
 
191
    PROTECT(ret = NEW_LOGICAL(1));
-
 
192
    if ((g_workspace == NULL) && (file_idx < 10000)) {
196
    if ((g_workspace == NULL) && (file_idx < 10000)) {
193
        /* no workspace found but there are still "available" file name */
197
        /* no workspace found but there are still "available" file name */
194
        /* if (file_idx) warn("workspace will be stored at #{filename}") */
198
        /* if (file_idx) warn("workspace will be stored at #{filename}") */
195
        sqlite3_open(filename, &g_workspace);
199
        sqlite3_open(filename, &g_workspace);
196
        _sqlite_exec("create table workspace(rel_filename text, full_filename text,"
200
        _sqlite_exec("create table workspace(rel_filename text, full_filename text,"
197
               "internal_name text, loaded bit, uses int, used bit)");
201
               "internal_name text, loaded bit, uses int, used bit)");
198
        LOGICAL(ret)[0] = TRUE;
202
        ret = ScalarLogical(TRUE);
199
    } else if (g_workspace != NULL) {
203
    } else if (g_workspace != NULL) {
200
        /* a valid workspace has been found, load each of the tables */
204
        /* a valid workspace has been found, load each of the tables */
201
        int res, nrows, ncols; 
205
        int res, nrows, ncols; 
202
        char **result_set, *fname, *iname;
206
        char **result_set, *fname, *iname;
203
        
207
        
Line 226... Line 230...
226
                _sqlite_exec(g_sql_buf[0]);
230
                _sqlite_exec(g_sql_buf[0]);
227
            }
231
            }
228
        }
232
        }
229
        sqlite3_free_table(result_set);
233
        sqlite3_free_table(result_set);
230
 
234
 
231
        LOGICAL(ret)[0] = TRUE;
235
        ret = ScalarLogical(TRUE);
232
    } else { /* can't find nor create workspace */
236
    } else { /* can't find nor create workspace */
233
        LOGICAL(ret)[0] = FALSE;
237
        ret = ScalarLogical(FALSE);
234
    }
238
    }
235
 
239
 
236
    UNPROTECT(1);
-
 
237
 
-
 
238
    /* register sqlite math functions */
240
    /* register sqlite math functions */
239
    __register_vector_math();
241
    __register_vector_math();
240
    return ret;
242
    return ret;
241
}
243
}
242
        
244
        
Line 304... Line 306...
304
        
306
        
305
    
307
    
306
SEXP sdf_finalize_workspace() {
308
SEXP sdf_finalize_workspace() {
307
    SEXP ret;
309
    SEXP ret;
308
    int i;
310
    int i;
309
    PROTECT(ret = NEW_LOGICAL(1)); 
-
 
310
    LOGICAL(ret)[0] = (sqlite3_close(g_workspace) == SQLITE_OK);
311
    ret = ScalarLogical(sqlite3_close(g_workspace) == SQLITE_OK);
311
    for (i = 0; i < NBUFS; i++) Free(g_sql_buf[i]);
312
    for (i = 0; i < NBUFS; i++) Free(g_sql_buf[i]);
312
    UNPROTECT(1);
-
 
313
    return ret;
313
    return ret;
314
} 
314
} 
315
 
315
 
316
 
316
 
317
SEXP sdf_list_sdfs(SEXP pattern) {
317
SEXP sdf_list_sdfs(SEXP pattern) {
Line 340... Line 340...
340
    UNPROTECT(1);
340
    UNPROTECT(1);
341
    return ret;
341
    return ret;
342
}
342
}
343
 
343
 
344
SEXP sdf_get_sdf(SEXP name) {    
344
SEXP sdf_get_sdf(SEXP name) {    
-
 
345
    char *iname;
-
 
346
    SEXP ret;
-
 
347
 
345
    if (TYPEOF(name) != STRSXP) {
348
    if (TYPEOF(name) != STRSXP) {
346
        Rprintf("Error: Argument must be a string containing the SDF name.\n");
349
        Rprintf("Error: Argument must be a string containing the SDF name.\n");
347
        return R_NilValue;
350
        return R_NilValue;
348
    }
351
    }
349
 
-
 
350
    char *iname = CHAR(STRING_ELT(name, 0));
352
    iname = CHAR(STRING_ELT(name, 0));
351
    SEXP ret;
-
 
352
 
353
 
353
    if (!USE_SDF1(iname, TRUE, FALSE)) return R_NilValue;
354
    if (!USE_SDF1(iname, TRUE, FALSE)) return R_NilValue;
354
 
355
 
355
    ret = _create_sdf_sexp(iname);
356
    ret = _create_sdf_sexp(iname);
356
    return ret;
357
    return ret;
Line 457... Line 458...
457
}
458
}
458
 
459
 
459
/* not necessary anymore, since stuffs will eventually be detached
460
/* not necessary anymore, since stuffs will eventually be detached
460
 * if we keep on adding new sdfs */
461
 * if we keep on adding new sdfs */
461
SEXP sdf_detach_sdf(SEXP internal_name) {
462
SEXP sdf_detach_sdf(SEXP internal_name) {
-
 
463
    char *iname;
-
 
464
    int res;
-
 
465
 
462
    if (!IS_CHARACTER(internal_name)) {
466
    if (!IS_CHARACTER(internal_name)) {
463
        Rprintf("Error: iname argument is not a string.\n");
467
        Rprintf("Error: iname argument is not a string.\n");
464
        return R_NilValue;
468
        return R_NilValue;
465
    }
469
    }
466
 
470
 
467
    char *iname = CHAR_ELT(internal_name, 0);
471
    iname = CHAR_ELT(internal_name, 0);
468
    sprintf(g_sql_buf[0], "detach [%s]", iname);
472
    sprintf(g_sql_buf[0], "detach [%s]", iname);
469
 
473
 
470
    SEXP ret; int res;
-
 
471
    res = _sqlite_exec(g_sql_buf[0]);
474
    res = _sqlite_exec(g_sql_buf[0]);
472
    res = !_sqlite_error(res);
475
    res = !_sqlite_error(res);
473
 
476
 
474
    if (res) _delete_sdf2(iname);
477
    if (res) _delete_sdf2(iname);
475
 
-
 
476
    PROTECT(ret = NEW_LOGICAL(1));
-
 
477
    LOGICAL(ret)[0] = res;
-
 
478
    UNPROTECT(1);
-
 
479
 
478
    
480
    return ret;
479
    return ScalarLogical(res);
481
}
480
}
482
 
481
 
483
SEXP sdf_rename_sdf(SEXP sdf, SEXP name) {
482
SEXP sdf_rename_sdf(SEXP sdf, SEXP name) {
484
    char *iname, *path, *newname;
483
    char *iname, *path, *newname;
485
    SEXP ret;
-
 
486
    int res, ret_tmp;
484
    int res, ret_tmp;
487
 
485
 
488
    iname = SDF_INAME(sdf);
486
    iname = SDF_INAME(sdf);
489
    newname = CHAR_ELT(name, 0);
487
    newname = CHAR_ELT(name, 0);
490
    
488
    
Line 530... Line 528...
530
        
528
        
531
        /* TODO: make path relative! */
529
        /* TODO: make path relative! */
532
        _add_sdf1(iname, path);
530
        _add_sdf1(iname, path);
533
    }
531
    }
534
 
532
 
535
    PROTECT(ret = NEW_LOGICAL(1));
-
 
536
    LOGICAL(ret)[0] = ret_tmp;
533
    return ScalarLogical(ret_tmp);
537
    UNPROTECT(1);
-
 
538
 
-
 
539
    return ret;
-
 
540
}
534
}
541
 
535