The R Project SVN R-packages

Rev

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

Rev 3473 Rev 3684
1
#include "R.h"
1
#include "R.h"
2
#include "Rdefines.h"
2
#include "Rdefines.h"
3
#include "Rinternals.h"
3
#include "Rinternals.h"
4
#include "sqlite3.h"
4
#include "sqlite3.h"
5
 
5
 
6
#ifndef __SQLITE_DATAFRAME__
6
#ifndef __SQLITE_DATAFRAME__
7
#define __SQLITE_DATAFRAME__
7
#define __SQLITE_DATAFRAME__
8
 
8
 
9
/* # of sql buffers */
9
/* # of sql buffers */
10
#define NBUFS 4
10
#define NBUFS 4
11
 
11
 
12
#ifdef __SQLITE_WORKSPACE__
12
#ifdef __SQLITE_WORKSPACE__
13
SEXP SDF_RowNamesSymbol;
13
SEXP SDF_RowNamesSymbol;
14
SEXP SDF_VectorTypeSymbol;
14
SEXP SDF_VectorTypeSymbol;
15
SEXP SDF_DimSymbol;
15
SEXP SDF_DimSymbol;
16
SEXP SDF_DimNamesSymbol;
16
SEXP SDF_DimNamesSymbol;
17
#else 
17
#else 
18
extern SEXP SDF_RowNamesSymbol;
18
extern SEXP SDF_RowNamesSymbol;
19
extern SEXP SDF_VectorTypeSymbol;
19
extern SEXP SDF_VectorTypeSymbol;
20
extern SEXP SDF_DimSymbol;
20
extern SEXP SDF_DimSymbol;
21
extern SEXP SDF_DimNamesSymbol;
21
extern SEXP SDF_DimNamesSymbol;
22
 
22
 
23
extern sqlite3 *g_workspace;
23
extern sqlite3 *g_workspace;
24
extern char *g_sql_buf[NBUFS];
24
extern char *g_sql_buf[NBUFS];
25
extern int g_sql_buf_sz[NBUFS];
25
extern int g_sql_buf_sz[NBUFS];
26
#endif
26
#endif
27
 
27
 
28
/* sdf type attributes */
28
/* sdf type attributes */
29
#define GET_SDFVECTORTYPE(x) getAttrib(x, SDF_VectorTypeSymbol) 
29
#define GET_SDFVECTORTYPE(x) getAttrib(x, SDF_VectorTypeSymbol) 
30
#define SET_SDFVECTORTYPE(x,t) setAttrib(x, SDF_VectorTypeSymbol, t) 
30
#define SET_SDFVECTORTYPE(x,t) setAttrib(x, SDF_VectorTypeSymbol, t) 
31
#define TEST_SDFVECTORTYPE(x, t) (strcmp(CHAR(asChar(GET_SDFVECTORTYPE(x))), t) == 0)
31
#define TEST_SDFVECTORTYPE(x, t) (strcmp(CHAR(asChar(GET_SDFVECTORTYPE(x))), t) == 0)
32
#define GET_SDFROWNAMES(x) getAttrib(x, SDF_RowNamesSymbol)
32
#define GET_SDFROWNAMES(x) getAttrib(x, SDF_RowNamesSymbol)
33
#define SET_SDFROWNAMES(x, r) setAttrib(x, SDF_RowNamesSymbol, r)
33
#define SET_SDFROWNAMES(x, r) setAttrib(x, SDF_RowNamesSymbol, r)
34
 
34
 
35
#ifndef SET_ROWNAMES
35
#ifndef SET_ROWNAMES
36
#define SET_ROWNAMES(x, r) setAttrib(x, R_RowNamesSymbol, r)
36
#define SET_ROWNAMES(x, r) setAttrib(x, R_RowNamesSymbol, r)
37
#endif
37
#endif
38
 
38
 
39
#define WORKSPACE_COLUMNS 6
39
#define WORKSPACE_COLUMNS 6
40
#define MAX_ATTACHED 30     /* 31 including workspace.db */
40
#define MAX_ATTACHED 30     /* 31 including workspace.db */
41
 
41
 
42
/* utilities for checking characteristics of arg */
42
/* utilities for checking characteristics of arg */
43
int _is_r_sym(char *sym);
43
int _is_r_sym(char *sym);
44
int _file_exists(char *filename);
44
int _file_exists(char *filename);
45
int _sdf_exists2(char *iname);
45
int _sdf_exists2(char *iname);
46
 
46
 
47
/* sdf utilities */
47
/* sdf utilities */
48
int USE_SDF1(const char *iname, int exists, int protect);  /* call this before doing anything on an SDF */
48
int USE_SDF1(const char *iname, int exists, int protect);  /* call this before doing anything on an SDF */
49
int UNUSE_SDF2(const char *iname); /* somewhat like UNPROTECT */
49
int UNUSE_SDF2(const char *iname); /* somewhat like UNPROTECT */
50
SEXP _create_sdf_sexp(const char *iname);  /* create a SEXP for an SDF */
50
SEXP _create_sdf_sexp(const char *iname);  /* create a SEXP for an SDF */
51
int _add_sdf1(char *filename, char *internal_name); /* add SDF to workspace */
51
int _add_sdf1(char *filename, char *internal_name); /* add SDF to workspace */
52
void _delete_sdf2(const char *iname); /* remove SDF from workspace */
52
void _delete_sdf2(const char *iname); /* remove SDF from workspace */
53
int _get_factor_levels1(const char *iname, const char *varname, SEXP var);
53
int _get_factor_levels1(const char *iname, const char *varname, SEXP var);
54
int _get_row_count2(const char *table, int quote);
54
int _get_row_count2(const char *table, int quote);
55
SEXP _get_rownames(const char *sdf_iname);
55
SEXP _get_rownames(const char *sdf_iname);
56
char *_get_full_pathname2(char *relpath); /* get full path given relpath, used in workspace mgmt */
56
char *_get_full_pathname2(char *relpath); /* get full path given relpath, used in workspace mgmt */
57
int _is_factor2(const char *iname, const char *factor_type, const char *colname);
57
int _is_factor2(const char *iname, const char *factor_type, const char *colname);
58
SEXP _get_rownames2(const char *sdf_iname);
58
SEXP _get_rownames2(const char *sdf_iname);
59
 
59
 
60
/* utilities for creating SDF's */
60
/* utilities for creating SDF's */
61
char *_create_sdf_skeleton1(SEXP name, int *o_namelen, int protect);
61
char *_create_sdf_skeleton1(SEXP name, int *o_namelen, int protect);
62
int _copy_factor_levels2(const char *factor_type, const char *iname_src,
62
int _copy_factor_levels2(const char *factor_type, const char *iname_src,
63
        const char *colname_src, const char *iname_dst, const char *colname_dst);
63
        const char *colname_src, const char *iname_dst, const char *colname_dst);
64
int _create_factor_table2(const char *iname, const char *factor_type, 
64
int _create_factor_table2(const char *iname, const char *factor_type, 
65
        const char *colname);
65
        const char *colname);
66
char *_create_svector1(SEXP name, const char *type, int * _namelen, int protect);
66
char *_create_svector1(SEXP name, const char *type, int * _namelen, int protect);
67
 
67
 
68
/* R utilities */
68
/* R utilities */
69
SEXP _getListElement(SEXP list, char *varname);
69
SEXP _getListElement(SEXP list, char *varname);
70
SEXP _shrink_vector(SEXP vec, int len); /* shrink vector size */
70
SEXP _shrink_vector(SEXP vec, int len); /* shrink vector size */
71
 
71
 
72
/* sqlite utilities */
72
/* sqlite utilities */
73
int _empty_callback(void *data, int ncols, char **row, char **cols);
73
int _empty_callback(void *data, int ncols, char **row, char **cols);
74
int _sqlite_error_check(int res, const char *file, int line);
74
int _sqlite_error_check(int res, const char *file, int line);
75
const char *_get_column_type(const char *class, int type); /* get sqlite type corresponding to R class & type */
75
const char *_get_column_type(const char *class, int type); /* get sqlite type corresponding to R class & type */
76
sqlite3* _is_sqlitedb(char *filename);
76
sqlite3* _is_sqlitedb(char *filename);
77
void _init_sqlite_function_accumulator();
77
void _init_sqlite_function_accumulator();
78
 
78
 
79
/* global buffer (g_sql_buf) utilities */
79
/* global buffer (g_sql_buf) utilities */
80
int _expand_buf(int i, int size);  /* expand ith buf if size > buf[i].size */
80
int _expand_buf(int i, int size);  /* expand ith buf if size > buf[i].size */
81
 
81
 
82
 
82
 
83
/* workspace utilities */
83
/* workspace utilities */
84
int _prepare_attach2();  /* prepare workspace before attaching a sqlite db */
84
int _prepare_attach2();  /* prepare workspace before attaching a sqlite db */
85
 
85
 
-
 
86
/* sqlite vector utilities */
-
 
87
SEXP _create_svector_sexp(const char *iname, const char *tblname, const char *varname, const char *type);
-
 
88
 
86
/* misc utilities */
89
/* misc utilities */
87
char *_r2iname(char *internal_name, char *filename);
90
char *_r2iname(char *internal_name, char *filename);
88
char *_fixname(char *rname);
91
char *_fixname(char *rname);
89
char *_str_tolower(char *out, const char *ref);
92
char *_str_tolower(char *out, const char *ref);
90
 
93
 
91
/* register functions to sqlite */
94
/* register functions to sqlite */
92
void __register_vector_math();
95
void __register_vector_math();
93
 
96
 
94
#define _sqlite_exec(sql) sqlite3_exec(g_workspace, sql, _empty_callback, NULL, NULL)
97
#define _sqlite_exec(sql) sqlite3_exec(g_workspace, sql, _empty_callback, NULL, NULL)
95
#define _sqlite_error(res) _sqlite_error_check((res), __FILE__, __LINE__)
98
#define _sqlite_error(res) _sqlite_error_check((res), __FILE__, __LINE__)
96
 
99
 
97
#ifdef __SQLITE_DEBUG__
100
#ifdef __SQLITE_DEBUG__
98
#define _sqlite_begin  { _sqlite_error(_sqlite_exec("begin")); Rprintf("begin at "  __FILE__  " line %d\n",  __LINE__); }
101
#define _sqlite_begin  { _sqlite_error(_sqlite_exec("begin")); Rprintf("begin at "  __FILE__  " line %d\n",  __LINE__); }
99
#define _sqlite_commit  { _sqlite_error(_sqlite_exec("commit")); Rprintf("commit at "  __FILE__  " line %d\n",  __LINE__); }
102
#define _sqlite_commit  { _sqlite_error(_sqlite_exec("commit")); Rprintf("commit at "  __FILE__  " line %d\n",  __LINE__); }
100
#else
103
#else
101
#define _sqlite_begin  _sqlite_error(_sqlite_exec("begin")) 
104
#define _sqlite_begin  _sqlite_error(_sqlite_exec("begin")) 
102
#define _sqlite_commit _sqlite_error(_sqlite_exec("commit"))
105
#define _sqlite_commit _sqlite_error(_sqlite_exec("commit"))
103
#endif
106
#endif
104
 
107
 
105
/* R object accessors shortcuts */
108
/* R object accessors shortcuts */
106
#define CHAR_ELT(str, i) CHAR(STRING_ELT(str,i))
109
#define CHAR_ELT(str, i) CHAR(STRING_ELT(str,i))
107
 
110
 
108
/* SDF object accessors shortcuts */
111
/* SDF object accessors shortcuts */
109
#define SDF_INAME(sdf) CHAR(STRING_ELT(_getListElement(sdf, "iname"),0))
112
#define SDF_INAME(sdf) CHAR(STRING_ELT(_getListElement(sdf, "iname"),0))
-
 
113
#define SVEC_TBLNAME(sdf) CHAR(STRING_ELT(_getListElement(sdf, "tblname"),0))
110
#define SVEC_VARNAME(sdf) CHAR(STRING_ELT(_getListElement(sdf, "varname"),0))
114
#define SVEC_VARNAME(sdf) CHAR(STRING_ELT(_getListElement(sdf, "varname"),0))
111
 
115
 
112
/* possible var types when stored in sqlite as integer */
116
/* possible var types when stored in sqlite as integer */
113
#define VAR_INTEGER 0
117
#define VAR_INTEGER 0
114
#define VAR_FACTOR  1
118
#define VAR_FACTOR  1
115
#define VAR_ORDERED 2
119
#define VAR_ORDERED 2
116
 
120
 
117
/* detail constants (see _get_sdf_detail2 in sqlite_workspace.c) */
121
/* detail constants (see _get_sdf_detail2 in sqlite_workspace.c) */
118
#define SDF_DETAIL_EXISTS 0
122
#define SDF_DETAIL_EXISTS 0
119
#define SDF_DETAIL_FULLFILENAME 1
123
#define SDF_DETAIL_FULLFILENAME 1
120
 
124
 
121
/* R SXP type constants */
125
/* R SXP type constants */
122
#define FACTORSXP 11
126
#define FACTORSXP 11
123
#define ORDEREDSXP 12
127
#define ORDEREDSXP 12
124
 
128
 
125
 
129
 
126
 
130
 
127
/* top level functions */
131
/* top level functions */
128
/* sqlite_workspace.c */
132
/* sqlite_workspace.c */
129
SEXP sdf_init_workspace();
133
SEXP sdf_init_workspace();
130
SEXP sdf_finalize_workspace();
134
SEXP sdf_finalize_workspace();
131
SEXP sdf_list_sdfs(SEXP pattern);
135
SEXP sdf_list_sdfs(SEXP pattern);
132
SEXP sdf_get_sdf(SEXP name);
136
SEXP sdf_get_sdf(SEXP name);
133
SEXP sdf_attach_sdf(SEXP filename, SEXP internal_name);
137
SEXP sdf_attach_sdf(SEXP filename, SEXP internal_name);
134
SEXP sdf_detach_sdf(SEXP internal_name);
138
SEXP sdf_detach_sdf(SEXP internal_name);
135
SEXP sdf_rename_sdf(SEXP sdf, SEXP name);
139
SEXP sdf_rename_sdf(SEXP sdf, SEXP name);
136
 
140
 
137
/* sqlite_dataframe.c */
141
/* sqlite_dataframe.c */
138
SEXP sdf_create_sdf(SEXP df, SEXP name);
142
SEXP sdf_create_sdf(SEXP df, SEXP name);
139
SEXP sdf_get_names(SEXP sdf);
143
SEXP sdf_get_names(SEXP sdf);
140
SEXP sdf_get_length(SEXP sdf);
144
SEXP sdf_get_length(SEXP sdf);
141
SEXP sdf_get_row_count(SEXP sdf);
145
SEXP sdf_get_row_count(SEXP sdf);
142
SEXP sdf_import_table(SEXP _filename, SEXP _name, SEXP _sep, SEXP _quote, 
146
SEXP sdf_import_table(SEXP _filename, SEXP _name, SEXP _sep, SEXP _quote, 
143
        SEXP _rownames, SEXP _colnames);
147
        SEXP _rownames, SEXP _colnames);
144
SEXP sdf_get_index(SEXP sdf, SEXP row, SEXP col, SEXP new_sdf);
148
SEXP sdf_get_index(SEXP sdf, SEXP row, SEXP col, SEXP new_sdf);
145
SEXP sdf_rbind(SEXP sdf, SEXP data);
149
SEXP sdf_rbind(SEXP sdf, SEXP data);
146
SEXP sdf_get_iname(SEXP sdf);
150
SEXP sdf_get_iname(SEXP sdf);
147
 
151
 
148
/* sqlite_vector.c */
152
/* sqlite_vector.c */
149
SEXP sdf_get_variable(SEXP sdf, SEXP name);
153
SEXP sdf_get_variable(SEXP sdf, SEXP name);
150
SEXP sdf_get_variable_length(SEXP svec);
154
SEXP sdf_get_variable_length(SEXP svec);
151
SEXP sdf_get_variable_index(SEXP svec, SEXP idx);
155
SEXP sdf_get_variable_index(SEXP svec, SEXP idx);
152
/* SEXP sdf_set_variable_index(SEXP svec, SEXP idx, SEXP value); */
156
/* SEXP sdf_set_variable_index(SEXP svec, SEXP idx, SEXP value); */
153
SEXP sdf_variable_summary(SEXP svec, SEXP maxsum);
157
SEXP sdf_variable_summary(SEXP svec, SEXP maxsum);
154
SEXP sdf_do_variable_math(SEXP func, SEXP vector, SEXP other_args);
158
SEXP sdf_do_variable_math(SEXP func, SEXP vector, SEXP other_args);
155
SEXP sdf_do_variable_op(SEXP func, SEXP vector, SEXP op2, SEXP arg_reversed);
159
SEXP sdf_do_variable_op(SEXP func, SEXP vector, SEXP op2, SEXP arg_reversed);
156
SEXP sdf_do_variable_summary(SEXP func, SEXP vector, SEXP na_rm);
160
SEXP sdf_do_variable_summary(SEXP func, SEXP vector, SEXP na_rm);
157
SEXP sdf_sort_variable(SEXP svec, SEXP decreasing);
161
SEXP sdf_sort_variable(SEXP svec, SEXP decreasing);
158
 
162
 
159
/* sqlite_external.c */
163
/* sqlite_external.c */
160
SEXP sdf_import_sqlite_table(SEXP _dbfilename, SEXP _tblname, SEXP _sdfiname);
164
SEXP sdf_import_sqlite_table(SEXP _dbfilename, SEXP _tblname, SEXP _sdfiname);
161
 
165
 
162
/* sqlite_matrix.c */
166
/* sqlite_matrix.c */
163
SEXP sdf_as_matrix(SEXP sdf, SEXP name);
167
SEXP sdf_as_matrix(SEXP sdf, SEXP name);
164
#endif
168
#endif