AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-1747834

Mikhail T.'s questions

Martin Hope
Mikhail T.
Asked: 2024-09-10 04:09:34 +0800 CST

As anotações @Order parecem ignoradas

  • 5

Estou testando nossa própria biblioteca, que usa JDBC. Para o nome do banco de dados especificado, o código precisa encontrar o valor javax.sql.DataSource, conectar usando o DataSource.getConnection(), e então executar algumas instruções SQL.

Gostaria que todos os testes fossem pulados, se houver mp $TESTDBno ambiente. Eu também gostaria de testar essas etapas iniciais separadamente -- pulando o resto se, por exemplo, encontrar o dataSourceque falhou.

O código de teste até agora é:

    public static final String DBNAME = System.getenv("TESTDB");

    private static DataSource DS = null;
    private static Connection CONN = null;

    @BeforeAll
    public static void checkEnvironment() {
        assumeTrue(DBNAME != null, "Environment variable DBNAME");
        logger.info("DBNAME is {}", DBNAME);
    }

    @Test
    @Order(20)
    public void getDataSource() {
        DS = DatasourceFactory.getDataSourceByKey(DBNAME);
        assertNotNull(DS, "Failed to find details for datasource " +
            DBNAME);

        logger.info("Datasource for {}: {}", DBNAME, DS);
    }

    @Test
    @Order(30)
    public void getConnection() {
        try {
            CONN = DS.getConnection();
        } catch (SQLException e) {
            fail("Connetion to " + DBNAME + " failed", e);
        }
    }

A @BeforeAllanotação parece funcionar bem -- o método é invocado primeiro e registra o DBNAME obtido da variável de ambiente. Se a variável de ambiente não estiver definida, todos os testes serão ignorados, como eu quero.

Meu problema é que, apesar das @Orderanotações explícitas, o getConnection()teste é tentado antes que o getDataSource()teste tenha a chance de definir o static DS. O getDataSource()próprio é bem-sucedido -- depois, registrando algo como:

Datasource for SQL_DEV4: org.apache.commons.dbcp.BasicDataSource@4a3668

mas getConnection()falha devido a uma exceção de ponteiro nulo, porque DSainda é null, quando é tentado.

Por que meu pedido não está funcionando?

java
  • 1 respostas
  • 24 Views
Martin Hope
Mikhail T.
Asked: 2024-09-05 02:51:03 +0800 CST

Qual é a diferença entre passar NULL e nullptr para um parâmetro de modelo?

  • 14

Estou lidando com uma API razoavelmente uniforme fornecida por um fornecedor e gostaria de verificar -- e lidar -- com quaisquer falhas de forma unificada também. Para esse fim, escrevi o seguinte wrapper:

template <typename Func, typename... Args>
auto awrap(Func &func, Args&&... args)
{
    auto code = func(args...);

    if (code >= 0)
        return code;

    ... handle the error ...
};
...
awrap(handlepath, handle, path, NULL, 0, coll, NULL);

O comando acima compila bem com clang, mas o g++13 e o Microsoft VC++ reclamam dos dois argumentos NULL:

... error: invalid conversion from 'int' to 'const char*' [-fpermissive]
   87 |                 auto code = func(args...

Substituir os dois NULLs por nullptrresolve o problema, mas por que isso importa?

Provavelmente, o NULLé transformado em 0x0ou mesmo 0em algum lugar pelo pré-processador, mas a chamada original nunca levantou uma "sobrancelha". Usar NULL era perfeitamente adequado em:

handlepath(handle, path, NULL, 0, coll, NULL);

Por que isso é um problema (para alguns compiladores) quando usado em um wrapper?


ATUALIZAÇÃO : /usr/include/sys/_null.hno meu sistema FreeBSD tem o seguinte código:

#ifndef NULL

#if !defined(__cplusplus)
#define NULL    ((void *)0)
#else
#if __cplusplus >= 201103L
#define NULL    nullptr
#elif defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4
#define NULL    __null
#else
#if defined(__LP64__)
#define NULL    (0L)
#else
#define NULL    0
#endif  /* __LP64__ */
#endif  /* __GNUG__ */
#endif  /* !__cplusplus */

#endif

Então:

  1. para C, NULLé (void *)0;

  2. para clang++ NULLe nullptrsão a mesma coisa, enquanto para GNU pode não ser...

c++
  • 2 respostas
  • 761 Views
Martin Hope
Mikhail T.
Asked: 2024-08-30 05:48:15 +0800 CST

Como passar o método de um objeto para uma função lambda?

  • 7

Uma "calculadora" complexa é atualmente invocada assim:

result = calculator.calc(a, b, extra);

Infelizmente, às vezes pode falhar devido a mudanças não relacionadas acontecendo no servidor. Sincronizar com diferentes departamentos é difícil -- tentar novamente é mais fácil.

Para isso, implementei uma retryfunção lambda:

auto retry = [](const auto& func, auto... args) {
    int attempts = 5;
    for (;;) try {
        return func(args...);
    }
    catch (const std::system_error& e) {
        /* Don't retry in case of a system_error */
        throw;
    }
    catch (const exception& e) {
        if (attempts-- == 0)
            throw; /* Give up and rethrow */
        Logging::log(Logging::Level::Warning,
            "%s. Retrying %d more times.", e.what(), attempts);
        sleep(2);
    }
};

O acima compila, mas, conforme tento usá-lo:

result = retry(calculator.calc, a, b, extra);

Recebo um erro do clang:

referência à função membro não estática deve ser chamada

GNU c++ sinaliza a mesma linha com:

uso inválido de função de membro não estático

De fato, este calc()é um método não estático da Calculatorclasse.

Como eu usaria meu novo lambda?

c++
  • 2 respostas
  • 92 Views
Martin Hope
Mikhail T.
Asked: 2023-08-25 23:47:05 +0800 CST

Como um construtor pode sinalizar ao chamador se uma exceção que está lançando é fatal?

  • 5

Estou lidando com um aplicativo que precisa ler mais de 10 arquivos CSV (de tipos diferentes) como entrada. Os dados são lidos em um contêiner – std::mapou vector.

Anteriormente, cada tipo tinha sua própria função de análise, e estou trabalhando para unificá-la em uma única função padronizada: economizar na manutenção futura do código e fornecer relatórios de erros uniformes para arquivos corrompidos.

Esta função lê cada linha, discerne se o tipo de contêiner tem o conceito de a key(like map) e usa emplacepara essas e emplace_backpara as outras (like vector).

A única expectativa da classe de valor do contêiner é que seu construtor possa instanciar a partir de uma linha CSV. Qualquer exceção do construtor é um erro fatal - o nome do arquivo de entrada e o número da linha são relatados e o programa é encerrado:

try {
        if constexpr (is_associative_container<Container>(NULL)) {
                result->emplace(typename Container::key_type(
                    key, keylen), value);
        } else {
                result->emplace_back(value);
        }
} catch (const std::exception &e) {
        fprintf(stderr, "%s:%zd: %s\n", path, line, e.what());
        goto failure;
}

Tudo isso funciona e estou feliz - cerca de 75% da análise de CSV agora é feita por esta função.

Agora estou enfrentando o quarto restante dos arquivos CSV, que são menos simples: porque certas linhas neles requerem tratamento especial e seu conteúdo não deve ser armazenado no contêiner.

Como o value_typeconstrutor do sinaliza para a função que a exceção que ela está lançando não deve ser considerada fatal? Uma maneira é escolher uma das exceções padrão ( std::bad_function_call?) como sinal, mas isso significaria que a exceção escolhida não deve ocorrer inesperadamente - o que não é confiável...

Algo mais?

c++
  • 3 respostas
  • 74 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve