static int env_destroy (lua_State *L) { lodbc_env *env = (lodbc_env *)lutil_checkudatap (L, 1, LODBC_ENV); luaL_argcheck (L, env != NULL, 1, LODBC_PREFIX "environment expected"); if(!(env->flags & LODBC_FLAG_DESTROYED)){ //! @todo autoclose connections if (env->conn_counter > 0) return luaL_error (L, LODBC_PREFIX"there are open connections"); if(!(env->flags & LODBC_FLAG_DONT_DESTROY)){ #ifdef LODBC_CHECK_ERROR_ON_DESTROY SQLRETURN ret = #endif SQLFreeHandle (hENV, env->handle); #ifdef LODBC_CHECK_ERROR_ON_DESTROY if (lodbc_iserror(ret)) return lodbc_fail(L, hENV, env->handle); #endif env->handle = SQL_NULL_HANDLE; } env->flags |= LODBC_FLAG_DESTROYED; } lua_pushnil(L); lodbc_set_user_value(L, 1); return lodbc_pass(L); }
static int env_destroy (lua_State *L) { lodbc_env *env = (lodbc_env *)lutil_checkudatap (L, 1, LODBC_ENV); luaL_argcheck (L, env != NULL, 1, LODBC_PREFIX "environment expected"); if(!(env->flags & LODBC_FLAG_DESTROYED)) { if(LUA_NOREF != env->conn_list_ref) { lua_rawgeti(L, LODBC_LUA_REGISTRY, env->conn_list_ref); assert(lua_istable(L, -1)); lua_pushnil(L); while(lua_next(L, -2)) { lua_pop(L, 1); // we do not need value call_cnn_destroy(L); } } if (env->conn_counter > 0) return luaL_error (L, LODBC_PREFIX"there are open connections"); if(!(env->flags & LODBC_FLAG_DONT_DESTROY)) { #ifdef LODBC_CHECK_ERROR_ON_DESTROY SQLRETURN ret = #endif SQLFreeHandle (hENV, env->handle); #ifdef LODBC_CHECK_ERROR_ON_DESTROY if (lodbc_iserror(ret)) return lodbc_fail(L, hENV, env->handle); #endif env->handle = SQL_NULL_HANDLE; } luaL_unref(L, LODBC_LUA_REGISTRY, env->conn_list_ref); env->conn_list_ref = LUA_NOREF; env->flags |= LODBC_FLAG_DESTROYED; } lua_pushnil(L); lodbc_set_user_value(L, 1); return lodbc_pass(L); }
static int env_setuservalue(lua_State *L) { lodbc_getenv(L); lua_settop(L, 2); lodbc_set_user_value(L, 1); return 1; }