Notificação de conclusão da função assíncrona
No SDK do Windows 8, o ODBC adicionou um mecanismo para notificar os aplicativos quando uma operação assíncrona é concluída, que chamaremos de "notificação na conclusão". (Consulte Execução Assíncrona (Método de Notificação) para obter mais informações.) Este tópico discute alguns dos problemas para desenvolvedores de drivers.
A interface entre o Gerenciador de Driver e o driver
O Gerenciador de Driver fornece internamente uma função de retorno de chamada Função. SQLAsyncNotificationCallback só pode ser chamado pelo driver; um aplicativo não pode chamá-lo diretamente. O driver chama SQLAsyncNotificationCallback sempre que novos dados são recebidos do servidor após o último retorno de SQL_STILL_EXECUTING.
O Gerenciador de Driver fornece um mecanismo de retorno de chamada para que um driver possa notificar o Gerenciador de Driver quando tiver sido feito progresso na execução de uma operação assíncrona, após a função correspondente retornar SQL_STILL_EXECUTING
O Gerenciador de Driver define o atributo SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK em um identificador de conexão do driver com um ponteiro de função não NULL, que é do tipo SQL_ASYNC_NOTIFICATION_CALLBACK, para que o driver funcione no modo de notificação para quaisquer operações assíncronas nesse identificador. Da mesma forma, o Gerenciador de Driver define o atributo SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK em um identificador de instrução de driver com um ponteiro de função não NULL, que também é do tipo SQL_ASYNC_NOTIFICATION_CALLBACK, para que o driver funcione no modo de notificação para quaisquer operações assíncronas nesse identificador.
Se uma operação assíncrona for executada em um identificador de driver, as funções do driver assíncrono deverão funcionar em um estilo sem bloqueio. Se a operação não puder ser concluída imediatamente, a função do driver deverá retornar SQL_STILL_EXECUTING. Esse requisito é válido tanto para o modo de pesquisa quanto para o modo de notificação.
Se um identificador estiver no modo assíncrono de notificação, o driver deverá chamar a função de retorno de chamada de notificação, cujo endereço é o valor do atributo SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK ou SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK, uma vez após retornar SQL_STILL_EXECUTING. Em outras palavras, um SQL_STILL_EXECUTING retornado deve ser emparelhado com uma invocação da função de retorno de chamada de notificação. O driver deve usar o valor atual do atributo de identificador SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXT ou SQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXT como o valor para o parâmetro de função de retorno de chamada pContext.
O driver não deve retornar a chamada no thread que chama a função do driver; não há razão para notificar o progresso antes que a função retorne. O driver deve usar seu próprio thread para retorno de chamada. O Gerenciador de Driver não usará o thread de retorno de chamada do driver para executar lógica de processamento extensa.
O Gerenciador de Driver chamará a função original novamente após o driver realizar o retorno de chamada. O Gerenciador de Driver pode usar um thread que não seja um thread de aplicativo nem de driver. Se o driver usar algumas informações associadas ao thread (por exemplo, token de segurança ou identificador de usuário), o driver deverá salvar as informações necessárias na chamada assíncrona inicial e usar o valor salvo antes que toda a operação assíncrona seja concluída. Normalmente, apenas SQLDriverConnect, SQLConnect ou SQLBrowseConnect precisam usar esse tipo de informação.