32.7. ÐÑмена запÑоÑов в пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ #
32.7.1. ФÑнкÑии Ð´Ð»Ñ Ð¾ÑпÑавки запÑоÑов оÑÐ¼ÐµÐ½Ñ #
PQcancelCreate#ÐоÑÐ¾Ð²Ð¸Ñ Ñоединение Ð´Ð»Ñ Ð¾ÑпÑавки запÑоÑов оÑменÑ.
PGcancelConn *PQcancelCreate(PGconn *conn);
ФÑнкÑиÑ
PQcancelCreateÑоздаÑÑ Ð¾Ð±ÑекÑPGcancelConn, однако оÑпÑавка запÑоÑов оÑÐ¼ÐµÐ½Ñ Ð½Ðµ наÑинаеÑÑÑ ÑÑазÑ. ÐапÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ оÑпÑавиÑÑ ÑеÑез ÑÑо Ñоединение блокиÑÑÑÑим ÑпоÑобом, иÑполÑзÑÑPQcancelBlocking, и неблокиÑÑÑÑим, иÑполÑзÑÑPQcancelStart. ÐолÑÑенное знаÑение можно пеÑедаÑÑ ÑеÑезPQcancelStatusÐ´Ð»Ñ Ð¿ÑовеÑки, ÑÑо обÑекÑPGcancelConnÑоздан ÑÑпеÑно. ÐбÑекÑPGcancelConnÑвлÑеÑÑÑ Ð½ÐµÐ¿ÑозÑаÑной ÑÑÑÑкÑÑÑой, коÑоÑÐ°Ñ Ð½Ðµ пÑÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÑ Ð´Ð¾ÑÑÑп напÑÑмÑÑ ÑеÑез пÑиложение. ÐÑÐ¾Ñ Ð¾Ð±ÑекÑPGcancelConnможно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑокобезопаÑной оÑÐ¼ÐµÐ½Ñ Ð·Ð°Ð¿ÑоÑа, коÑоÑÑй вÑполнÑеÑÑÑ Ð½Ð° иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ Ñоединении.ÐÑи наÑÑÑойке ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾ÑпÑавки запÑоÑа оÑÐ¼ÐµÐ½Ñ Ð¿ÐµÑеиÑполÑзÑÑÑÑÑ Ð¼Ð½Ð¾Ð³Ð¸Ðµ паÑамеÑÑÑ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ клиенÑа. Ðажно помниÑÑ, ÑÑо еÑли иÑÑ Ð¾Ð´Ð½Ð¾Ðµ Ñоединение ÑÑебÑÐµÑ ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸/или пÑовеÑки Ñелевого Ñзла (ÑеÑез
sslmodeилиgssencmode), Ñо Ñоединение Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа оÑÐ¼ÐµÐ½Ñ ÑоздаÑÑÑÑ Ñ Ñакими же ÑÑебованиÑми. ÐÑбÑе паÑамеÑÑÑ ÑоединениÑ, иÑполÑзÑемÑе ÑолÑко во вÑÐµÐ¼Ñ Ð¸Ð»Ð¸ ÑÑÐ°Ð·Ñ Ð¶Ðµ поÑле аÑÑенÑиÑикаÑии клиенÑа, игноÑиÑÑÑÑÑÑ, поÑколÑÐºÑ Ð·Ð°Ð¿ÑоÑÑ Ð¾ÑÐ¼ÐµÐ½Ñ Ð½Ðµ ÑÑебÑÑÑ Ð°ÑÑенÑиÑикаÑии, а Ñоединение закÑÑваеÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле оÑпÑавки запÑоÑа оÑменÑ.ÐамеÑÑÑе, ÑÑо еÑли ÑÑнкÑиÑ
PQconnectStartвозвÑаÑÐ°ÐµÑ Ð½ÐµÐ½Ñлевой ÑказаÑелÑ, Ñо, законÑив его иÑполÑзование, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑзваÑÑPQcancelFinish, ÑÑÐ¾Ð±Ñ Ð¾ÑвободиÑÑ Ð¿Ð¾Ð»ÑÑеннÑÑ ÑÑÑÑкÑÑÑÑ Ð¸ вÑе ÑвÑзаннÑе Ñ Ð½ÐµÐ¹ блоки памÑÑи. ÐÑо нÑжно ÑделаÑÑ, даже еÑли попÑÑка подклÑÑÐµÐ½Ð¸Ñ Ð½Ðµ поÑледÑÐµÑ Ð¸Ð»Ð¸ окажеÑÑÑ Ð½ÐµÑÑпеÑной.PQcancelBlocking#ТÑебÑеÑ, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð¿ÑекÑаÑил обÑабоÑÐºÑ ÑекÑÑей ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÑÑÑим ÑпоÑобом.
int PQcancelBlocking(PGcancelConn *cancelConn);
ÐапÑÐ¾Ñ Ð¾ÑпÑавлÑеÑÑÑ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑоединениÑ
PGcancelConn, коÑоÑое Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑоздаÑÑ ÑÑнкÑиейPQcancelCreate.PQcancelBlockingвозвÑаÑÐ°ÐµÑ 1, еÑли запÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ ÑÑпеÑно оÑпÑавлен, и 0 в пÑоÑивном ÑлÑÑае. Ð ÑлÑÑае неÑдаÑи ÑообÑение об оÑибке можно полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑииPQcancelErrorMessage.УÑпеÑÐ½Ð°Ñ Ð¾ÑпÑавка оÑÐ¼ÐµÐ½Ñ ÐµÑÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð³Ð°ÑанÑией Ñого, ÑÑо запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо ÑÑÑекÑ. ÐÑли оÑмена ÑÑабоÑала, ÑекÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° завеÑÑиÑÑÑ Ð´Ð¾ÑÑоÑно и возвÑаÑÐ¸Ñ Ð² каÑеÑÑве ÑезÑлÑÑаÑа оÑибкÑ. ÐÑли же оÑмена не полÑÑиÑÑÑ (напÑимеÑ, поÑомÑ, ÑÑо ÑеÑÐ²ÐµÑ Ñже завеÑÑил обÑабоÑÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ), Ñогда видимого ÑезÑлÑÑаÑа не бÑÐ´ÐµÑ Ð²Ð¾Ð²Ñе.
PQcancelStartPQcancelPoll#ÐÑдаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° Ñо, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð¿ÑеÑÑвал вÑполнение ÑекÑÑей ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½ÐµÐ±Ð»Ð¾ÐºÐ¸ÑÑÑÑим ÑпоÑобом.
int PQcancelStart(PGcancelConn *cancelConn); PostgresPollingStatusType PQcancelPoll(PGcancelConn *cancelConn);
ÐапÑÐ¾Ñ Ð¾ÑпÑавлÑеÑÑÑ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑоединениÑ
PGcancelConn, коÑоÑое Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑоздаÑÑ ÑÑнкÑиейPQcancelCreate.PQcancelStartвозвÑаÑÐ°ÐµÑ 1, еÑли запÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑпÑавлен, и 0 в пÑоÑивном ÑлÑÑае. Ð ÑлÑÑае неÑдаÑи ÑообÑение об оÑибке можно полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑииPQcancelErrorMessage.ÐÑли вÑзов
PQcancelStartоказалÑÑ ÑÑпеÑнÑм, нÑжно опÑоÑиÑÑ libpq Ð´Ð»Ñ Ð¿ÑÐ¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑоÑедÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ. ÐÑзовиÑеPQcancelSocketÐ´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´ÐµÑкÑипÑоÑа нижележаÑего ÑокеÑа, ÑеÑез коÑоÑÑй ÑÑÑанавливаеÑÑÑ Ñоединение Ñ Ð±Ð°Ð·Ð¾Ð¹ даннÑÑ . (Ðнимание: ÑÑÐ¾Ñ ÑÐ¾ÐºÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¾Ñ Ð²Ñзова к вÑзовÑPQcancelPoll.) ÐÑганизÑйÑе Ñикл Ñаким обÑазом: еÑлиPQcancelPoll(cancelConn)пÑи поÑледнем вÑзове возвÑаÑаеÑPGRES_POLLING_READING, ожидайÑе, пока ÑÐ¾ÐºÐµÑ Ð½Ðµ окажеÑÑÑ Ð³Ð¾ÑовÑм Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ (ÑÑо Ð¿Ð¾ÐºÐ°Ð¶ÐµÑ ÑÑнкÑиÑselect(),poll()или Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ ÑиÑÑÐµÐ¼Ð½Ð°Ñ ÑÑнкÑиÑ). ÐаÑем Ñнова вÑзовиÑеPQcancelPoll(cancelConn). ÐÑли жеPQcancelPoll(cancelConn)пÑи поÑледнем вÑзове возвÑаÑилаPGRES_POLLING_WRITING, дождиÑеÑÑ Ð³Ð¾ÑовноÑÑи ÑокеÑа к запиÑи, а заÑем Ñнова вÑзовиÑеPQcancelPoll(cancelConn). Ðа пеÑвой иÑеÑаÑии, Ñо еÑÑÑ ÐºÐ¾Ð³Ð´Ð° Ð²Ñ ÐµÑÑ Ð½Ðµ вÑзÑвалиPQcancelPoll(cancelConn), ÑеализÑйÑе Ñо же поведение, ÑÑо и поÑле полÑÑениÑPGRES_POLLING_WRITING. ÐÑодолжайÑе ÑÑÐ¾Ñ Ñикл, покаPQcancelPoll(cancelConn)не вÑдаÑÑ Ð·Ð½Ð°ÑениеPGRES_POLLING_FAILED, ÑигнализиÑÑÑÑее об оÑибке пÑи ÑÑÑановлении ÑоединениÑ, илиPGRES_POLLING_OK, показÑваÑÑее, ÑÑо Ñоединение ÑÑÑановлено ÑÑпеÑно.УÑпеÑÐ½Ð°Ñ Ð¾ÑпÑавка оÑÐ¼ÐµÐ½Ñ ÐµÑÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð³Ð°ÑанÑией Ñого, ÑÑо запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо ÑÑÑекÑ. ÐÑли оÑмена ÑÑабоÑала, ÑекÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° завеÑÑиÑÑÑ Ð´Ð¾ÑÑоÑно и возвÑаÑÐ¸Ñ Ð² каÑеÑÑве ÑезÑлÑÑаÑа оÑибкÑ. ÐÑли же оÑмена не полÑÑиÑÑÑ (напÑимеÑ, поÑомÑ, ÑÑо ÑеÑÐ²ÐµÑ Ñже завеÑÑил обÑабоÑÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ), Ñогда видимого ÑезÑлÑÑаÑа не бÑÐ´ÐµÑ Ð²Ð¾Ð²Ñе.
РлÑбое вÑÐµÐ¼Ñ Ð² пÑоÑеÑÑе подклÑÑÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ ÑоÑÑоÑние можно пÑовеÑиÑÑ, вÑзвав
PQcancelStatus. ÐÑли ÑÑÐ¾Ñ Ð²Ñзов возвÑаÑиÑCONNECTION_BAD, знаÑиÑ, пÑоÑедÑÑа оÑÐ¼ÐµÐ½Ñ Ð·Ð°Ð²ÐµÑÑилаÑÑ Ñбоем; еÑли вÑзов возвÑаÑиÑCONNECTION_OK, знаÑиÑ, запÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ ÑÑпеÑно оÑпÑавлен. Ðба ÑÑи ÑоÑÑоÑÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ опÑеделиÑÑ Ð½Ð° оÑнове возвÑаÑаемого знаÑÐµÐ½Ð¸Ñ ÑÑнкÑииPQcancelPoll, опиÑанной вÑÑе. ÐÑÑгие ÑоÑÑоÑÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ñакже имеÑÑ Ð¼ÐµÑÑо в ÑеÑение (и ÑолÑко в ÑеÑение) аÑÐ¸Ð½Ñ Ñонной пÑоÑедÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ. Ðни показÑваÑÑ ÑекÑÑÑÑ ÑÑÐ°Ð´Ð¸Ñ Ð¿ÑоÑедÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð¸ могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ, напÑимеÑ, Ð´Ð»Ñ Ð¿ÑедоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑаÑной ÑвÑзи полÑзоваÑелÑ. ÐÐ¾Ñ ÑÑи ÑоÑÑоÑниÑ:CONNECTION_ALLOCATED#Ðжидание, когда вÑзов ÑÑнкÑии
PQcancelStartилиPQcancelBlockingÑакÑиÑеÑки оÑкÑÐ¾ÐµÑ ÑокеÑ. ÐÑо ÑÑап ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле вÑзоваPQcancelCreateилиPQcancelReset, на коÑоÑом Ñоединение Ñ ÑеÑвеÑом еÑÑ Ð½Ðµ иниÑиализиÑовано. ЧÑÐ¾Ð±Ñ ÑакÑиÑеÑки наÑаÑÑ Ð¾ÑпÑÐ°Ð²ÐºÑ Ð·Ð°Ð¿ÑоÑа оÑменÑ, иÑполÑзÑйÑеPQcancelStartилиPQcancelBlocking.CONNECTION_STARTED#Ðжидание, пока Ñоединение бÑÐ´ÐµÑ ÑÑÑановлено.
CONNECTION_MADE#Соединение ÑÑÑановлено; ожидание оÑпÑавки.
CONNECTION_AWAITING_RESPONSE#Ðжидание оÑвеÑа Ð¾Ñ ÑеÑвеÑа.
CONNECTION_SSL_STARTUP#СоглаÑование SSL-ÑиÑÑованиÑ.
CONNECTION_GSS_STARTUP#СоглаÑование GSS-ÑиÑÑованиÑ.
ÐамеÑÑÑе, ÑÑо, Ñ Ð¾ÑÑ ÑÑи конÑÑанÑÑ Ð¸ ÑÐ¾Ñ ÑанÑÑÑÑ (Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð°Ð½Ð¸Ñ ÑовмеÑÑимоÑÑи), пÑиложение никогда не должно полагаÑÑÑÑ Ð½Ð° Ñо, ÑÑо они поÑвÑÑÑÑ Ð² каком-Ñо конкÑеÑном поÑÑдке или вообÑе поÑвÑÑÑÑ, а Ñакже на Ñо, ÑÑо ÑоÑÑоÑние вÑегда пÑÐ¸Ð¼ÐµÑ Ð¾Ð´Ð½Ð¾ из ÑÑÐ¸Ñ Ð´Ð¾ÐºÑменÑиÑованнÑÑ Ð·Ð½Ð°Ñений. ÐÑиложение Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ ÑÑо-Ñо наподобие:
switch(PQcancelStatus(conn)) { case CONNECTION_STARTED: feedback = "ÐодклÑÑение..."; break; case CONNECTION_MADE: feedback = "ÐодклÑÑÑн к ÑеÑвеÑÑ..."; break; . . . default: feedback = "ÐодклÑÑение..."; }ÐаÑамеÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ
connect_timeoutигноÑиÑÑеÑÑÑ, когда иÑполÑзÑеÑÑÑPQcancelPoll; именно пÑиложение оÑвеÑÐ°ÐµÑ Ð·Ð° пÑинÑÑие ÑеÑÐµÐ½Ð¸Ñ Ð¾ Ñом, ÑвлÑеÑÑÑ Ð»Ð¸ иÑÑекÑее вÑÐµÐ¼Ñ ÑÑезмеÑнÑм. РпÑоÑивном ÑлÑÑае вÑзовPQcancelStartÑ Ð¿Ð¾ÑледÑÑÑим вÑзовомPQcancelPollв Ñикле бÑдÑÑ ÑквиваленÑÐ½Ñ Ð²ÑзовÑPQcancelBlocking.PQcancelStatus#ÐозвÑаÑÐ°ÐµÑ ÑоÑÑоÑние подклÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾ÑменÑ.
ConnStatusType PQcancelStatus(const PGcancelConn *cancelConn);
СÑаÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð¾Ð´Ð½Ð¾ из ÑÑда знаÑений. Ðднако ÑолÑко ÑÑи из Ð½Ð¸Ñ Ð²Ð¸Ð´Ð½Ñ Ð¸Ð·Ð²Ð½Ðµ пÑоÑедÑÑÑ Ð°ÑÐ¸Ð½Ñ Ñонной оÑменÑ:
CONNECTION_ALLOCATED,CONNECTION_OKиCONNECTION_BAD. ÐзнаÑалÑное ÑоÑÑоÑние подклÑÑениÑPGcancelConn, ÑÑпеÑно Ñозданного ÑеÑезPQcancelCreate, âCONNECTION_ALLOCATED. УÑпеÑно оÑпÑавленнÑй запÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð¸Ð¼ÐµÐµÑ ÑÑаÑÑÑCONNECTION_OK. РнеÑдаÑной попÑÑке оÑÐ¼ÐµÐ½Ñ ÑигнализиÑÑÐµÑ ÑÑаÑÑÑCONNECTION_BAD. ÐбÑÑно ÑÑаÑÑÑ OK оÑÑаÑÑÑÑ ÑаковÑм до вÑзоваPQcancelFinishилиPQcancelReset.РдÑÑÐ³Ð¸Ñ ÐºÐ¾Ð´Ð°Ñ ÑоÑÑоÑниÑ, коÑоÑÑе могÑÑ Ð²ÑдаÑÑ ÑÑи ÑÑнкÑии, можно ÑзнаÑÑ Ð² опиÑании
PQcancelStart.УÑпеÑÐ½Ð°Ñ Ð¾ÑпÑавка оÑÐ¼ÐµÐ½Ñ ÐµÑÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð³Ð°ÑанÑией Ñого, ÑÑо запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо ÑÑÑекÑ. ÐÑли оÑмена ÑÑабоÑала, ÑекÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° завеÑÑиÑÑÑ Ð´Ð¾ÑÑоÑно и возвÑаÑÐ¸Ñ Ð² каÑеÑÑве ÑезÑлÑÑаÑа оÑибкÑ. ÐÑли же оÑмена не полÑÑиÑÑÑ (напÑимеÑ, поÑомÑ, ÑÑо ÑеÑÐ²ÐµÑ Ñже завеÑÑил обÑабоÑÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ), Ñогда видимого ÑезÑлÑÑаÑа не бÑÐ´ÐµÑ Ð²Ð¾Ð²Ñе.
PQcancelSocket#ÐолÑÑÐ°ÐµÑ Ð½Ð¾Ð¼ÐµÑ Ñайлового деÑкÑипÑоÑа Ð´Ð»Ñ ÑокеÑа оÑÐ¼ÐµÐ½Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑеÑвеÑом.
int PQcancelSocket(const PGcancelConn *cancelConn);
ÐейÑÑвиÑелÑнÑй деÑкÑипÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð±Ð¾Ð»ÑÑе или Ñавен 0; знаÑение -1 показÑваеÑ, ÑÑо в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ðµ оÑкÑÑÑо ни одного ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑеÑвеÑом. ÐнаÑение Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑÑÑ Ð² ÑезÑлÑÑаÑе вÑзова лÑбой ÑÑнкÑии в ÑÑом Ñазделе в
PGcancelConn(кÑомеPQcancelErrorMessageи ÑамойPQcancelSocket).-
PQcancelErrorMessage# ÐозвÑаÑÐ°ÐµÑ ÑообÑение об оÑибке, наиболее недавно ÑгенеÑиÑованное опеÑаÑией оÑÐ¼ÐµÐ½Ñ ÑоединениÑ.
char *PQcancelErrorMessage(const PGcancelConn *cancelconn);
ÐоÑÑи вÑе ÑÑнкÑии библиоÑеки libpq, пÑинимаÑÑие
PGcancelConn, в ÑлÑÑае ÑÐ±Ð¾Ñ ÑÑоÑмиÑÑÑÑ ÑообÑение длÑPQcancelErrorMessage. ÐбÑаÑиÑе внимание, ÑÑо по ÑоглаÑениÑм, пÑинÑÑÑм в libpq, непÑÑÑой ÑезÑлÑÑÐ°Ñ ÑÑнкÑииPQcancelErrorMessageÐ¼Ð¾Ð¶ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· неÑколÑÐºÐ¸Ñ ÑÑÑок и бÑÐ´ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑий Ñимвол новой ÑÑÑоки. ÐÑзÑваÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна оÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемое знаÑение, напÑÑмÑÑ. Ðна бÑÐ´ÐµÑ Ð¾Ñвобождена, когда ÑвÑзаннÑй Ñ Ð½ÐµÐ¹ деÑкÑипÑоÑPGcancelConnбÑÐ´ÐµÑ Ð¿ÐµÑедан ÑÑнкÑииPQcancelFinish. Ðе ÑÑÐ¾Ð¸Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ, ÑÑо ÑезÑлÑÑиÑÑÑÑÐ°Ñ ÑÑÑока оÑÑанеÑÑÑ Ñой же Ñамой пÑи вÑполнении неÑколÑÐºÐ¸Ñ Ð¾Ð¿ÐµÑаÑий Ñо ÑÑÑÑкÑÑÑойPGcancelConn.PQcancelFinish#ÐакÑÑÐ²Ð°ÐµÑ Ñоединение Ð´Ð»Ñ Ð¾ÑÐ¼ÐµÐ½Ñ (еÑли оÑпÑавка запÑоÑа оÑÐ¼ÐµÐ½Ñ ÐµÑÑ Ð½Ðµ завеÑÑена). Также оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð¿Ð°Ð¼ÑÑÑ, иÑполÑзÑемÑÑ Ð¾Ð±ÑекÑом
PGcancelConn.void PQcancelFinish(PGcancelConn *cancelConn);
ÐбÑаÑиÑе внимание, ÑÑо даже еÑли попÑÑка оÑÐ¼ÐµÐ½Ñ Ð¿Ð¾ÑеÑпела неÑдаÑÑ (как показÑваеÑ
PQcancelStatus), пÑиложение вÑе Ñавно должно вÑзваÑÑPQcancelFinish, ÑÑÐ¾Ð±Ñ Ð¾ÑвободиÑÑ Ð¿Ð°Ð¼ÑÑÑ, иÑполÑзÑемÑÑ Ð¾Ð±ÑекÑомPGcancelConn. УказаÑелÑPGcancelConnне должен иÑполÑзоваÑÑÑÑ Ð¿Ð¾Ð²ÑоÑно поÑле Ñого, как бÑла вÑзвана ÑÑнкÑиÑPQcancelFinish.PQcancelReset#ÐеÑеÑÑÑанавливаеÑ
PGcancelConnв ÑелÑÑ Ð¿Ð¾Ð²ÑоÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾ÑменÑ.void PQcancelReset(PGcancelConn *cancelConn);
ÐÑли
PGcancelConnиÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾ÑпÑавки запÑоÑа оÑменÑ, Ñоединение закÑÑваеÑÑÑ. Ðозже бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð³Ð¾Ñовлен обÑекÑPGcancelConn, ÑÑÐ¾Ð±Ñ ÑеÑез него можно бÑло оÑпÑавиÑÑ Ð½Ð¾Ð²Ñй запÑÐ¾Ñ Ð¾ÑменÑ.ÐÑо можно иÑполÑзоваÑÑ Ð´Ð»Ñ ÑозданиÑ
PGcancelConnдлÑPGconnи многокÑаÑно его пеÑеиÑполÑзоваÑÑ Ð½Ð° пÑоÑÑжении ÑабоÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾PGconn.
32.7.2. УÑÑаÑевÑие ÑÑнкÑии Ð´Ð»Ñ Ð¾ÑпÑавки запÑоÑов оÑÐ¼ÐµÐ½Ñ #
ЧеÑез даннÑе ÑÑнкÑии ÑанÑÑе оÑпÑавлÑлиÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð¾ÑменÑ. ХоÑÑ ÑÑи ÑÑнкÑии вÑÑ ÐµÑÑ ÑабоÑаÑÑ, они пÑÐ¸Ð·Ð½Ð°Ð½Ñ ÑÑÑаÑевÑими, поÑколÑÐºÑ Ð¾ÑпÑавлÑÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð¾ÑÐ¼ÐµÐ½Ñ Ð½ÐµÐ·Ð°ÑиÑÑованнÑми, даже еÑли в иÑÑ
одном Ñоединении Ñказано ÑÑебование ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ sslmode или gssencmode. Ðо ÑÑой пÑиÑине кÑайне не ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¸Ñ
в новом коде, а Ñак же лÑÑÑе измениÑÑ ÑÑÑеÑÑвÑÑÑий код и впиÑаÑÑ Ð² него новÑе ÑÑнкÑии.
PQgetCancel#СоздаÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , ÑодеÑжаÑÑÑ Ð¸Ð½ÑоÑмаÑиÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð´Ð»Ñ Ð¾ÑÐ¼ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, запÑÑенной ÑеÑез
PQcancel.PGcancel *PQgetCancel(PGconn *conn);
ФÑнкÑиÑ
PQgetCancelÑоздаÑÑ Ð¾Ð±ÑекÑPGcancel, полÑÑив обÑекÑPGconn, опиÑÑваÑÑий подклÑÑение. Ðна возвÑаÑиÑNULL, еÑли паÑамеÑÑconnÑавенNULLили пÑедÑÑавлÑÐµÑ Ð½ÐµÐ´ÐµÐ¹ÑÑвиÑелÑное подклÑÑение. ÐбÑекÑPGcancelÑвлÑеÑÑÑ Ð½ÐµÐ¿ÑозÑаÑной ÑÑÑÑкÑÑÑой, коÑоÑÐ°Ñ Ð½Ðµ пÑедназнаÑена Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ñиложение обÑаÑалоÑÑ Ðº ней напÑÑмÑÑ; ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко пеÑедаваÑÑ ÑÑнкÑииPQcancelилиPQfreeCancel.PQfreeCancel#ÐÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð¿Ð°Ð¼ÑÑÑ, занимаемÑÑ ÑÑÑÑкÑÑÑой даннÑÑ , Ñозданной ÑÑнкÑией
PQgetCancel.void PQfreeCancel(PGcancel *cancel);
PQfreeCancelоÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð¿Ð°Ð¼ÑÑÑ, занимаемÑÑ Ð¾Ð±ÑекÑом, пÑедваÑиÑелÑно ÑозданнÑм ÑÑнкÑиейPQgetCancel.PQcancel#PQcancelÑвлÑеÑÑÑ ÑÑÑаÑевÑим и небезопаÑнÑм аналогом ÑÑнкÑииPQcancelBlocking, но ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ безопаÑно иÑполÑзоваÑÑ Ð² ÑÐ°Ð¼ÐºÐ°Ñ Ð¾Ð±ÑабоÑÑика Ñигналов.int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);
ФÑнкÑиÑ
PQcancelÑÑÑеÑÑвÑÐµÑ ÑолÑко в ÑелÑÑ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи. ÐмеÑÑо Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ иÑполÑзоваÑÑPQcancelBlocking. ÐдинÑÑвенное пÑеимÑÑеÑÑвоPQcancelÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ безопаÑно вÑзÑваÑÑ Ð¸Ð· обÑабоÑÑика Ñигнала, еÑлиerrbufÑвлÑеÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ñной пеÑеменной в Ñаком обÑабоÑÑике. Ðднако ÑÑо пÑеимÑÑеÑÑво не иÑклÑÑÐ°ÐµÑ Ð¿Ñоблем Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑÑÑ, ÑвÑзаннÑÑ Ñ ÑÑой ÑÑнкÑией, и не ÑвлÑеÑÑÑ Ð²ÐµÑомой пÑиÑиной Ð´Ð»Ñ ÐµÑ Ð¸ÑполÑзованиÑ.ÐбÑекÑ
PGcancelдоÑÑÑпен ÑолÑко в Ñежиме ÑÑениÑ, пока ÑеÑÑ Ð¸Ð´ÑÑ Ð¾ ÑÑнкÑииPQcancel, поÑÑÐ¾Ð¼Ñ ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñакже вÑзÑваÑÑ Ð¸Ð· поÑока, оÑделÑного Ð¾Ñ Ñого, коÑоÑÑй ÑпÑавлÑÐµÑ Ð¾Ð±ÑекÑомPGconn.ÐозвÑаÑаемое ÑÑнкÑией
PQcancelзнаÑение Ñавно 1, еÑли запÑÐ¾Ñ Ð½Ð° оÑÐ¼ÐµÐ½Ñ Ð±Ñл ÑÑпеÑно оÑпÑавлен, и 0 в пÑоÑивном ÑлÑÑае. Ð ÑлÑÑае неÑдаÑной оÑпÑавкиerrbufзаполнÑеÑÑÑ Ð¿Ð¾ÑÑниÑелÑнÑм ÑообÑением об оÑибке.errbufдолжен бÑÑÑ Ð¼Ð°ÑÑивом Ñимволов, имеÑÑим ÑазмеÑerrbufsize(ÑекомендÑемÑй ÑÐ°Ð·Ð¼ÐµÑ ÑоÑÑавлÑÐµÑ 256 байÑ).
PQrequestCancel#PQrequestCancelÑвлÑеÑÑÑ ÑÑÑаÑевÑим и небезопаÑнÑм аналогом ÑÑнкÑииPQcancelBlocking.int PQrequestCancel(PGconn *conn);
ФÑнкÑиÑ
PQrequestCancelÑÑÑеÑÑвÑÐµÑ ÑолÑко в ÑелÑÑ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи. ÐмеÑÑо Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ иÑполÑзоваÑÑPQcancelBlocking. ÐÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¿ÑеимÑÑеÑÑв иÑполÑзованиÑPQrequestCancelвмеÑÑоPQcancelBlocking.ÐÑдаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° Ñо, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð¿ÑекÑаÑил обÑабоÑÐºÑ ÑекÑÑей командÑ. ФÑнкÑÐ¸Ñ ÑабоÑÐ°ÐµÑ Ð½Ð°Ð¿ÑÑмÑÑ Ñ Ð¾Ð±ÑекÑом
PGconnи в ÑлÑÑае ÑÐ±Ð¾Ñ ÑÐ¾Ñ ÑанÑÐµÑ ÑообÑение об оÑибке в обÑекÑеPGconn(оÑкÑда его можно извлеÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑPQerrorMessage). ХоÑÑ ÑÑнкÑионалÑноÑÑÑ Ñа же ÑамаÑ, ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ небезопаÑен Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ð¾ÑоÑнÑÑ Ð¿ÑогÑамм или обÑабоÑÑиков Ñигналов, поÑколÑÐºÑ Ð¿ÐµÑезапиÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке, Ñ ÑанÑÑегоÑÑ Ð² обÑекÑеPGconn, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ Ñ Ð¾Ð´Ñ Ð¾Ð¿ÐµÑаÑии, вÑполнÑемой ÑеÑез данное подклÑÑение.