Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}
Exemple #4
0
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);
}