Exemplo n.º 1
0
static int cursor_bind(Value *vret, Value *v, RefNode *node)
{
    RefCursor *rc = Value_vp(*v);

    Value v1 = v[1];
    Value v2 = v[2];

    int idx;
    const RefNode *type = fs->Value_type(v1);
    if (type == fs->cls_int) {
        idx = fs->Value_int64(v1, NULL);
    } else if (type == fs->cls_str) {
        RefStr *rs = Value_vp(v1);
        if (!str_has0(rs->c, rs->size)) {
            idx = sqlite3_bind_parameter_index(rc->stmt, rs->c);
        } else {
            idx = 0;
        }
        if (idx == 0) {
            fs->throw_errorf(mod_sqlite, "SQLiteError", "No parameters names %r", rs);
            return FALSE;
        }
    } else {
        fs->throw_error_select(THROW_ARGMENT_TYPE2__NODE_NODE_NODE_INT, fs->cls_int, fs->cls_str, type, 1);
        return FALSE;
    }
    if (!sqlite_bind(rc->stmt, idx, v2)) {
        return FALSE;
    }

    return TRUE;
}
Exemplo n.º 2
0
static int net_getaddrinfo(Value *vret, Value *v, RefNode *node)
{
    struct addrinfo *res = NULL;
    struct addrinfo *ai;
    RefArray *ra;
    RefStr *rs = Value_vp(v[1]);
    int err;

    if (str_has0(rs->c, rs->size)) {
        fs->throw_errorf(fs->mod_io, "SocketError", "No address found");
        return FALSE;
    }

    err = getaddrinfo_sub(&res, rs->c, NULL, 0);
    if (err != 0) {
        throw_socket_error(err);
        return FALSE;
    }
    ra = fs->refarray_new(0);
    *vret = vp_Value(ra);

    for (ai = res; ai != NULL; ai = ai->ai_next) {
        Value *vt = fs->refarray_push(ra);
        *vt = vp_Value(new_refsockaddr(ai->ai_addr, FALSE));
    }
    freeaddrinfo(res);

    return TRUE;
}
Exemplo n.º 3
0
Arquivo: exio.c Projeto: x768/fox-lang
static GFile *filename_to_gfile(RefStr *rs)
{
    // NULを含む場合エラー
    if (str_has0(rs->c, rs->size)) {
        fs->throw_errorf(fs->mod_io, "FileOpenError", "File path contains '\\0'");
        return NULL;
    }
    return g_file_new_for_path(rs->c);
}
Exemplo n.º 4
0
static int ipaddrrange_new(Value *vret, Value *v, RefNode *node)
{
    RefStr *rs = Value_vp(v[1]);
    char *ipaddr = NULL;
    const char *mask = NULL;
    int ret;

    if (str_has0(rs->c, rs->size)) {
        fs->throw_errorf(fs->mod_io, "SocketError", "No address found");
        return FALSE;
    }
    
    if (fg->stk_top > v + 2) {
        char bits_str[8];
        RefNode *v2_type = fs->Value_type(v[2]);
        if (v2_type == fs->cls_str) {
            mask = Value_cstr(v[2]);
        } else if (v2_type == fs->cls_int) {
            int64_t imask = fs->Value_int64(v[2], NULL);
            if (imask < 0) {
                imask = 0;
            } else if (imask > 128) {
                imask = 128;
            }
            sprintf(bits_str, "%d", (int)imask);
            mask = bits_str;
        } else {
            fs->throw_error_select(THROW_ARGMENT_TYPE2__NODE_NODE_NODE_INT, fs->cls_str, fs->cls_int, v2_type, 2);
            return FALSE;
        }
        ipaddr = Value_cstr(v[1]);
        ret = ipaddrrange_new_sub(vret, ipaddr, mask);
    } else {
        // "/"で分割する
        int i;
        for (i = 0; i < rs->size; i++) {
            if (rs->c[i] == '/') {
                ipaddr = fs->str_dup_p(rs->c, i, NULL);
                mask = rs->c + i + 1;
                break;
            }
        }
        if (ipaddr == NULL) {
            ipaddr = fs->str_dup_p(rs->c, rs->size, NULL);
            mask = NULL;
        }
        ret = ipaddrrange_new_sub(vret, ipaddr, mask);
        free(ipaddr);
    }
 
    return ret;
}
Exemplo n.º 5
0
static int ipaddr_new(Value *vret, Value *v, RefNode *node)
{
    RefStr *rs = Value_vp(v[1]);
    RefSockAddr *rsa;
    if (str_has0(rs->c, rs->size)) {
        fs->throw_errorf(fs->mod_io, "SocketError", "No address found");
        return FALSE;
    }
    rsa = cstr_to_ipaddr(rs->c, FALSE);
    if (rsa == NULL) {
        return FALSE;
    }
    *vret = vp_Value(rsa);
    return TRUE;
}
Exemplo n.º 6
0
static int conn_prepare_sub(sqlite3_stmt **stmt, sqlite3 *conn, Value *v)
{
    Value *v1 = v + 1;
    int argc = fg->stk_top - v1;
    RefStr *sql;
    int result;

    if (conn == NULL) {
        fs->throw_errorf(mod_sqlite, "SQLiteError", "Connection is not opened");
        return FALSE;
    }

    sql = Value_vp(*v1);
    result = sqlite3_prepare_v2(conn, sql->c, -1, stmt, NULL);
    if (result != SQLITE_OK){
        if (result != SQLITE_ERROR_USER) {
            fs->throw_errorf(mod_sqlite, "SQLiteError", "%s", sqlite3_errmsg(conn));
        }
        return FALSE;
    }
    if (*stmt == NULL) {
        fs->throw_errorf(mod_sqlite, "SQLiteError", "SQL string is empty");
        return FALSE;
    }

    if (argc > 1) {
        int i;
        if (argc == 2) {
            const RefNode *type = fs->Value_type(v[2]);
            if (type == fs->cls_list) {
                RefArray *ra = Value_vp(v[2]);
                for (i = 0; i < ra->size; i++) {
                    if (!sqlite_bind(*stmt, i + 1, ra->p[i])) {
                        return FALSE;
                    }
                }
                return TRUE;
            } else if (type == fs->cls_map) {
                RefMap *rm = Value_vp(v[2]);
                for (i = 0; i < rm->entry_num; i++) {
                    HashValueEntry *ep = rm->entry[i];
                    for (; ep != NULL; ep = ep->next) {
                        RefStr *rs;
                        int idx;
                        if (fs->Value_type(ep->key) != fs->cls_str) {
                            fs->throw_errorf(fs->mod_lang, "TypeError", "Map {Str:*, Str:* ...} required");
                            return FALSE;
                        }
                        rs = Value_vp(ep->key);
                        if (rs->size > 0 && !str_has0(rs->c, rs->size)) {
                            // 先頭が記号で始まらない場合は、:を補う
                            char ch = rs->c[0];
                            if (isdigit_fox(ch) || isupper_fox(ch) || islower_fox(ch)) {
                                char *ptr = malloc(rs->size + 2);
                                sprintf(ptr, ":%.*s", rs->size, rs->c);
                                idx = sqlite3_bind_parameter_index(*stmt, ptr);
                                free(ptr);
                            } else {
                                idx = sqlite3_bind_parameter_index(*stmt, rs->c);
                            }
                        } else {
                            idx = 0;
                        }
                        if (idx == 0) {
                            fs->throw_errorf(mod_sqlite, "SQLiteError", "No parameters names %r", rs);
                            return FALSE;
                        }
                        if (!sqlite_bind(*stmt, idx, ep->val)) {
                            return FALSE;
                        }
                    }
                }
                return TRUE;
            }
        }
        for (i = 1; i < argc; i++) {
            if (!sqlite_bind(*stmt, i, v1[i])) {
                return FALSE;
            }
        }
    }

    return TRUE;
}