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; }
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; }
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); }
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; }
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; }
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; }