Как выполнить асинхронный запрос с помощью libpq - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу выполнить SQL-запрос с libpq неблокирующим способом.Таким образом, я хочу получать уведомления о завершении выполнения моего запроса.

Насколько я понимаю, это поддерживается libpq, если я использую асинхронный API.

С помощью функции PQsendQuery я могу отправитьзапрос к бэкэнду и с помощью функции PQgetResult я могу получить результат.

Я вызываю функцию PQsendQuery несколько раз, не дожидаясь завершения предыдущего.

Теперь у меня естьследующие вопросы:

  • Как связать результаты, которые я собираюсь получить позже с PQgetResult, с соответствующим запросом?
  • Есть ли метод использования обратного вызова вместоPQgetResult?
  • Есть ли способ запустить это в цикле событий (например, libevent)?

1 Ответ

0 голосов
/ 06 февраля 2019

Вы что-то не так поняли: PQsendQuery() отправляет асинхронный запрос, означающий, что команда не блокируется, пока не станут доступны результаты.Тем не менее, вы можете не вызывать PQsendQuery() еще раз, прежде чем все результаты будут прочитаны!

С man-страницы:

После успешного вызова PQsendQuery вызовите PQgetResult один илибольше раз, чтобы получить результаты. PQsendQuery не может быть вызван снова (для того же соединения), пока PQgetResult не вернет нулевой указатель, указывающий, что команда выполнена.

Как указывает man-страница, вы могли быоткрыть несколько соединений для запуска нескольких одновременных запросов.Затем разные результаты ассоциируются с разными дескрипторами базы данных.

PostgreSQLc async io api не предоставляет механизмов обратного вызова;Тем не менее, это не так сложно построить себяМожно использовать libevent, поскольку вы можете получить дескриптор файла сокета с помощью PQsocket().Тем не менее, чтобы заставить его работать, нужно немного клея.

...