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_setautoclosecnn(lua_State *L) { lodbc_env *env = lodbc_getenv(L); int val = lua_toboolean(L, 2); if(val && (env->conn_list_ref == LUA_NOREF)) { env->conn_list_ref = create_cnn_list(L); return lodbc_pass(L); } if((!val) && (env->conn_list_ref != LUA_NOREF)) { luaL_unref(L, LODBC_LUA_REGISTRY, env->conn_list_ref); env->conn_list_ref = LUA_NOREF; return lodbc_pass(L); } return lodbc_pass(L); }
int lodbc_set_str_attr_(lua_State*L, SQLSMALLINT HandleType, SQLHANDLE Handle, SQLINTEGER optnum, const char* value, size_t len) { SQLRETURN ret; #if (LODBC_ODBCVER >= 0x0300) ret = select_set_attr_v3(HandleType)(Handle,optnum,(SQLPOINTER)value,len); #else if(HandleType == hENV) return lodbc_faildirect(L, "not supported."); ret = select_set_attr (HandleType)(Handle,optnum,(SQLUINTEGER)value); #endif if(lodbc_iserror(ret)) return lodbc_fail(L, HandleType, Handle); 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); }