The R Project SVN R-packages

Rev

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

Rev 3255 Rev 3281
Line 8... Line 8...
8
 
8
 
9
#define __UTIL__
9
#define __UTIL__
10
#include "sqlite_dataframe.h"
10
#include "sqlite_dataframe.h"
11
 
11
 
12
int _is_r_sym(char *sym) {
12
int _is_r_sym(char *sym) {
13
    int ret = 0, i, len = strlen(sym);
13
    int i, len = strlen(sym);
14
 
14
 
15
    if (isalpha(sym[0]) || sym[0] == '_') i = 1;
15
    if (isalpha(sym[0]) || sym[0] == '_') i = 1;
16
    else if (sym[0] == '.') { if (isdigit(sym[1])) return FALSE; i = 2; }
16
    else if (sym[0] == '.') { if (isdigit(sym[1])) return FALSE; i = 2; }
17
    else return FALSE;
17
    else return FALSE;
18
 
18
 
Line 33... Line 33...
33
    return 0;
33
    return 0;
34
}
34
}
35
 
35
 
36
char *_fixname(char *rname) {
36
char *_fixname(char *rname) {
37
    char *tmp = rname;
37
    char *tmp = rname;
38
    while (*tmp) { if (*tmp = '.') *tmp = '_'; tmp++; }
38
    while (*tmp) { if (*tmp == '.') *tmp = '_'; tmp++; }
39
    return rname;
39
    return rname;
40
}
40
}
41
 
41
 
42
 
42
 
43
char *_r2iname(char *rname, char *iname) {
43
char *_r2iname(char *rname, char *iname) {
Line 65... Line 65...
65
    } else ret = 0;
65
    } else ret = 0;
66
    return ret;
66
    return ret;
67
} 
67
} 
68
 
68
 
69
int _expand_buf(int i, int size) {
69
int _expand_buf(int i, int size) {
-
 
70
    int expanded = FALSE;
70
    if (size >= g_sql_buf_sz[i]) {
71
    if (size >= g_sql_buf_sz[i]) {
71
        g_sql_buf_sz[i] *= 2;
72
        g_sql_buf_sz[i] *= 2;
72
        g_sql_buf[i] = Realloc(g_sql_buf[i], g_sql_buf_sz[i], char);
73
        g_sql_buf[i] = Realloc(g_sql_buf[i], g_sql_buf_sz[i], char);
-
 
74
        expanded = TRUE;
73
    }
75
    }
-
 
76
    return expanded;
74
}
77
}
75
 
78
 
76
int _sqlite_error(int res) {
79
int _sqlite_error(int res) {
77
    int ret = FALSE;
80
    int ret = FALSE;
78
    if (res != SQLITE_OK) { 
81
    if (res != SQLITE_OK) { 
Line 112... Line 115...
112
}
115
}
113
 
116
 
114
/* TODO: windows version */
117
/* TODO: windows version */
115
char *_get_full_pathname2(char *relpath) {
118
char *_get_full_pathname2(char *relpath) {
116
    char *tmp1, *tmp2, tmp3, tmp4;
119
    char *tmp1, *tmp2, tmp3, tmp4;
117
    int buflen, relpathlen, tokenlen;
120
    int buflen, relpathlen;
118
 
121
 
119
    relpathlen = strlen(relpath);
122
    relpathlen = strlen(relpath);
120
    if (relpath[0] == '/') {
123
    if (relpath[0] == '/') {
121
        _expand_buf(2, relpathlen);
124
        _expand_buf(2, relpathlen);
122
        strcpy(g_sql_buf[2], "/");
125
        strcpy(g_sql_buf[2], "/");
Line 152... Line 155...
152
                while (g_sql_buf[2][buflen] != '/' && buflen > 1);
155
                while (g_sql_buf[2][buflen] != '/' && buflen > 1);
153
                g_sql_buf[2][++buflen] = 0;
156
                g_sql_buf[2][++buflen] = 0;
154
            }
157
            }
155
        } else { 
158
        } else { 
156
            /* non-relative path part, append to buf */
159
            /* non-relative path part, append to buf */
-
 
160
            tmp4 = 0;
157
            if (tmp3 == '/') { *tmp2 = '/'; tmp4 = *(tmp2+1); *(tmp2+1) = 0; }
161
            if (tmp3 == '/') { *tmp2 = '/'; tmp4 = *(tmp2+1); *(tmp2+1) = 0; }
158
            _expand_buf(2, buflen+strlen(tmp1));
162
            _expand_buf(2, buflen+strlen(tmp1));
159
            strcpy(g_sql_buf[2] + buflen, tmp1);
163
            strcpy(g_sql_buf[2] + buflen, tmp1);
160
            buflen += strlen(tmp1);
164
            buflen += strlen(tmp1);
161
            if (tmp3 == '/') { *(tmp2+1) = tmp4; }
165
            if (tmp3 == '/') { *(tmp2+1) = tmp4; }
Line 181... Line 185...
181
    }
185
    }
182
 
186
 
183
    return ret;
187
    return ret;
184
}
188
}
185
 
189
 
-
 
190
SEXP _get_rownames(const char *sdf_iname) {
-
 
191
    sqlite3_stmt *stmt;
-
 
192
    sprintf(g_sql_buf[0], "select [row name] from [%s].sdf_data", sdf_iname);
-
 
193
    int res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
-
 
194
 
-
 
195
    if (_sqlite_error(res)) return R_NilValue; 
-
 
196
 
-
 
197
    SEXP ret, value;
-
 
198
    int nprotected = 1;
-
 
199
    PROTECT(ret = NEW_LIST(2)); 
-
 
200
 
-
 
201
    /* set list names */
-
 
202
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
-
 
203
    SET_STRING_ELT(value, 0, mkChar("iname"));
-
 
204
    SET_STRING_ELT(value, 1, mkChar("varname"));
-
 
205
    SET_NAMES(ret, value);
-
 
206
 
-
 
207
    /* set list values */
-
 
208
    SET_VECTOR_ELT(ret, 0, mkString(sdf_iname));
-
 
209
    SET_VECTOR_ELT(ret, 1, mkString("row name"));
-
 
210
 
-
 
211
    /* set class */
-
 
212
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
-
 
213
    SET_STRING_ELT(value, 0, mkChar("sqlite.vector"));
-
 
214
    SET_STRING_ELT(value, 1, mkChar("character"));
-
 
215
    SET_CLASS(ret, value);
-
 
216
 
-
 
217
    UNPROTECT(nprotected);
-
 
218
    return ret;
-
 
219
}
186
SEXP _create_sdf_sexp(char *iname) {
220
SEXP _create_sdf_sexp(const char *iname) {
187
    SEXP names, variable, ret;
221
    SEXP names, class, variable, ret;
188
    int nprotected = 0;
222
    int nprotected = 0;
189
    PROTECT(ret = NEW_LIST(1)); nprotected++;
223
    PROTECT(ret = NEW_LIST(1)); nprotected++;
190
    PROTECT(names = mkString("iname")); nprotected++;
224
    PROTECT(names = mkString("iname")); nprotected++;
191
    SET_NAMES(ret, names);
225
    SET_NAMES(ret, names);
192
 
226
 
193
    PROTECT(variable = mkString(iname)); nprotected++;
227
    PROTECT(variable = mkString(iname)); nprotected++;
194
    SET_VECTOR_ELT(ret, 0, variable);
228
    SET_VECTOR_ELT(ret, 0, variable);
195
 
229
 
196
    /* set class */
230
    /* set class */
197
    PROTECT(names = NEW_CHARACTER(2)); nprotected++;
231
    PROTECT(class = NEW_CHARACTER(2)); nprotected++;
198
    SET_STRING_ELT(names, 0, mkChar("sqlite.data.frame"));
232
    SET_STRING_ELT(class, 0, mkChar("sqlite.data.frame"));
199
    SET_STRING_ELT(names, 1, mkChar("data.frame"));
233
    SET_STRING_ELT(class, 1, mkChar("data.frame"));
200
    SET_CLASS(ret, names);
234
    SET_CLASS(ret, class);
-
 
235
    SET_ROWNAMES(ret, _get_rownames(iname));
201
    
236
    
202
    UNPROTECT(nprotected);
237
    UNPROTECT(nprotected);
203
    return ret;
238
    return ret;
204
}
239
}
205
 
240
 
Line 220... Line 255...
220
    SET_LEVELS(var, levels);
255
    SET_LEVELS(var, levels);
221
    UNPROTECT(1);
256
    UNPROTECT(1);
222
}
257
}
223
    
258
    
224
int _get_factor_levels1(const char *iname, const char *varname, SEXP var) {
259
int _get_factor_levels1(const char *iname, const char *varname, SEXP var) {
225
    SEXP levels;
-
 
226
    int ret = VAR_INTEGER;
260
    int ret = VAR_INTEGER;
227
    
261
    
228
    sprintf(g_sql_buf[1], "[%s].[factor %s]", iname, varname);
262
    sprintf(g_sql_buf[1], "[%s].[factor %s]", iname, varname);
229
    int res = _get_row_count2(g_sql_buf[1]), idx;
263
    int res = _get_row_count2(g_sql_buf[1]);
230
    if (res > 0) { /* res is exptected to be {-1} \union I+ */
264
    if (res > 0) { /* res is exptected to be {-1} \union I+ */
231
        __attach_levels2(g_sql_buf[1], var, res);
265
        __attach_levels2(g_sql_buf[1], var, res);
232
        ret = VAR_FACTOR;
266
        ret = VAR_FACTOR;
233
    }
267
    }
234
 
268