static int hs_delete(lua_State *L) { if (lua_gettop(L)!= 2){ return luaL_error(L, "wrong args length in hstore.delete(hstore, text)"); } if (hstore_oid >0){ bool isnull; Datum a; Datum b; if ((lua_type(L, 2) != LUA_TSTRING)|| (lua_type(L, 1) != LUA_TUSERDATA) ){ return luaL_error(L, "wrong args types for hstore.delete(hstore, text)"); } lua_getmetatable (L, 1); luaP_getfield(L, hstore_type_name); if (lua_equal (L, -1, -2)!= 1){ return luaL_error(L, "hstore.delete(hstore, text) first arg is not hstore"); } a = luaP_todatum(L, hstore_oid, 0, &isnull, 1); b = luaP_todatum(L, TEXTOID, 0, &isnull, 2); luaP_pushdatum(L, call_delete_hstore_text(a,b), hstore_oid); return 1; } return luaL_error(L, "hstore is not registered //hstore.delete"); }
static int pg_callable_func(lua_State *L) { MemoryContext m; int i; FunctionCallInfoData fcinfo; Lua_pgfunc *fi; fi = (Lua_pgfunc *) lua_touserdata(L, lua_upvalueindex(1)); InitFunctionCallInfoData(fcinfo, &fi->fi, fi->numargs, InvalidOid, NULL, NULL); if(tmpcontext_usage> RESET_CONTEXT_AFTER ){ MemoryContextReset(tmpcontext); tmpcontext_usage = 0; } ++tmpcontext_usage; m = MemoryContextSwitchTo(tmpcontext); for (i=0; i<fi->numargs; ++i){ fcinfo.arg[i] = luaP_todatum(L, fi->argtypes[i], 0, &fcinfo.argnull[i], i+1); } if(!fi->options.only_internal && fi->options.throwable){ SPI_push(); PG_TRY(); { Datum d = FunctionCallInvoke(&fcinfo); MemoryContextSwitchTo(m); if (fcinfo.isnull) { lua_pushnil(L); } else { luaP_pushdatum(L, d, fi->prorettype); } SPI_pop(); } PG_CATCH(); { lua_pop(L, lua_gettop(L)); push_spi_error(L, m); /*context switch to m inside push_spi_error*/ SPI_pop(); return lua_error(L); }PG_END_TRY(); }else{ Datum d = FunctionCallInvoke(&fcinfo); MemoryContextSwitchTo(m); if (fcinfo.isnull) { lua_pushnil(L); } else { luaP_pushdatum(L, d, fi->prorettype); } } return 1; }
static int pgfunc_rows (lua_State *L) { int i; Lua_pgfunc *fi; ReturnSetInfo *rsinfo; ExprContext *econtext; FunctionCallInfoData *fcinfo; Lua_pgfunc_srf *srfi; int argc; BEGINLUA; argc = lua_gettop(L); fi = (Lua_pgfunc *) lua_touserdata(L, lua_upvalueindex(1)); srfi = (Lua_pgfunc_srf *)lua_newuserdata(L, sizeof(Lua_pgfunc_srf)); econtext = &srfi->econtext; rsinfo = &srfi->rsinfo; fcinfo = &srfi->fcinfo; srfi->prorettype = fi->prorettype; fmgr_info(fi->funcid, &srfi->fi); memset(econtext, 0, sizeof(ExprContext)); econtext->ecxt_per_query_memory = CurrentMemoryContext; rsinfo->type = T_ReturnSetInfo; rsinfo->econtext = econtext; rsinfo->allowedModes = (int)(SFRM_ValuePerCall /*| SFRM_Materialize*/); rsinfo->returnMode = SFRM_ValuePerCall;//SFRM_Materialize; rsinfo->setResult = NULL; rsinfo->setDesc = NULL; InitFunctionCallInfoData((*fcinfo), &srfi->fi, fi->numargs, InvalidOid, NULL, (fmNodePtr)rsinfo); for (i=0; i<fi->numargs; ++i){ if(i>=argc){ for (i = argc; i<fi->numargs; ++i){ fcinfo->arg[i] = 0 ;//Datum; fcinfo->argnull[i] = true; } break; } fcinfo->arg[i] = luaP_todatum(L, fi->argtypes[i], 0, &fcinfo->argnull[i], i+1); } lua_pushcclosure(L, pgfunc_rowsaux, 1); ENDLUAV(1); return 1; }
static void luaP_fillbuffer (lua_State *L, int pos, Oid *type, luaP_Buffer *b) { lua_pushnil(L); while (lua_next(L, pos)) { int k = lua_tointeger(L, -2); if (k > 0) { bool isnull; k--; /* zero based */ b->value[k] = luaP_todatum(L, type[k], 0, &isnull); b->null[k] = (isnull) ? 'n' : ' '; } lua_pop(L, 1); } }
static int luaP_tuplenewindex (lua_State *L) { luaP_Tuple *t = (luaP_Tuple *) lua_touserdata(L, 1); const char *name = luaL_checkstring(L, 2); int i; if (t->changed == -1) /* read-only? */ return luaL_error(L, "tuple is read-only"); lua_pushinteger(L, (int) t->relid); lua_rawget(L, LUA_REGISTRYINDEX); lua_getfield(L, -1, name); i = luaL_optinteger(L, -1, -1); lua_settop(L, 3); if (i >= 0) { /* found? */ bool isnull; t->value[i] = luaP_todatum(L, t->desc->attrs[i]->atttypid, t->desc->attrs[i]->atttypmod, &isnull); t->null[i] = isnull; t->changed = 1; } else return luaL_error(L, "column not found in relation: '%s'", name); return 0; }