31.5. ÐоÑÑÑоÑное извлеÑение ÑезÑлÑÑаÑов запÑоÑа
ÐбÑÑно libpq ÑобиÑÐ°ÐµÑ Ð²ÐµÑÑ ÑезÑлÑÑÐ°Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸ возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾ пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² виде единÑÑвенной ÑÑÑÑкÑÑÑÑ PGresult. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÐ¿ÑиемлемÑм Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, коÑоÑÑе возвÑаÑаÑÑ Ð±Ð¾Ð»ÑÑое ÑиÑло ÑÑÑок. Ð ÑакиÑ
ÑлÑÑаÑÑ
пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾ÑполÑзоваÑÑÑÑ ÑÑнкÑиÑми PQsendQuery и PQgetResult в одноÑÑÑоÑном Ñежиме. Ð ÑÑом Ñежиме ÑезÑлÑÑиÑÑÑÑие ÑÑÑоки пеÑедаÑÑÑÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ одной за один Ñаз, по меÑе Ñого, как они пÑинимаÑÑÑÑ Ð¾Ñ ÑеÑвеÑа.
ÐÐ»Ñ Ñого ÑÑÐ¾Ð±Ñ Ð²Ð¾Ð¹Ñи в одноÑÑÑоÑнÑй Ñежим, вÑзовиÑе PQsetSingleRowMode ÑÑÐ°Ð·Ñ Ð¶Ðµ поÑле ÑÑпеÑного вÑзова ÑÑнкÑии PQsendQuery (или ÑодÑÑвенной ÑÑнкÑии). ÐÑÐ±Ð¾Ñ ÑÑого Ñежима дейÑÑвиÑелен ÑолÑко Ð´Ð»Ñ ÑекÑÑего иÑполнÑÑÑегоÑÑ Ð·Ð°Ð¿ÑоÑа. ÐаÑем повÑоÑно вÑзÑвайÑе ÑÑнкÑÐ¸Ñ PQgetResult до ÑеÑ
поÑ, пока она не возвÑаÑÐ¸Ñ null, как опиÑано в Раздел 31.4. ÐÑли запÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÐºÐ°ÐºÐ¾Ðµ-Ñо ÑиÑло ÑÑÑок, Ñо они возвÑаÑаÑÑÑÑ Ð² виде индивидÑалÑнÑÑ
обÑекÑов PGresult, коÑоÑÑе вÑглÑдÑÑ, как обÑÑнÑе вÑбоÑки, за иÑклÑÑением Ñого, ÑÑо иÑ
код ÑÑаÑÑÑа бÑÐ´ÐµÑ PGRES_SINGLE_TUPLE вмеÑÑо PGRES_TUPLES_OK. ÐоÑле поÑледней ÑÑÑоки (или ÑÑÐ°Ð·Ñ Ð¶Ðµ, еÑли запÑÐ¾Ñ Ð½Ðµ возвÑаÑÐ°ÐµÑ Ð½Ð¸ одной ÑÑÑоки) бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÑн обÑекÑ, не ÑодеÑжаÑий ни одной ÑÑÑоки и имеÑÑий ÑÑаÑÑÑ PGRES_TUPLES_OK; ÑÑо Ñигнал о Ñом, ÑÑо ÑÑÑок болÑÑе не бÑдеÑ. (Ðо обÑаÑиÑе внимание, ÑÑо вÑÑ Ð¶Ðµ необÑ
одимо пÑодолжаÑÑ Ð²ÑзÑваÑÑ ÑÑнкÑÐ¸Ñ PQgetResult, пока она не возвÑаÑÐ¸Ñ Ð·Ð½Ð°Ñение null.) ÐÑе ÑÑи обÑекÑÑ PGresult бÑдÑÑ ÑодеÑжаÑÑ Ñе же ÑамÑе опиÑаÑелÑнÑе даннÑе (имена ÑÑолбÑов, ÑÐ¸Ð¿Ñ Ð¸ Ñ. д.), коÑоÑÑе имел Ð±Ñ Ð¾Ð±ÑÑнÑй обÑÐµÐºÑ PGresult. ÐамÑÑÑ, занимаемÑÑ ÐºÐ°Ð¶Ð´Ñм обÑекÑом, нÑжно оÑвобождаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ PQclear, как обÑÑно.
-
PQsetSingleRowMode ÐÑбиÑÐ°ÐµÑ Ð¾Ð´Ð½Ð¾ÑÑÑоÑнÑй Ñежим Ð´Ð»Ñ ÑекÑÑего вÑполнÑÑÑегоÑÑ Ð·Ð°Ð¿ÑоÑа.
int PQsetSingleRowMode(PGconn *conn);
ÐÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзÑваÑÑ ÑолÑко непоÑÑедÑÑвенно поÑле ÑÑнкÑии
PQsendQueryили одной из ÐµÑ ÑодÑÑвеннÑÑ ÑÑнкÑий, до вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð»Ñбой дÑÑгой опеÑаÑии на ÑÑом подклÑÑении, Ñакой, какPQconsumeInputилиPQgetResult. ÐÑдÑÑи вÑзванной ÑвоевÑеменно, ÑÑнкÑÐ¸Ñ Ð°ÐºÑивиÑÑÐµÑ Ð¾Ð´Ð½Ð¾ÑÑÑоÑнÑй Ñежим Ð´Ð»Ñ ÑекÑÑего запÑоÑа и возвÑаÑÐ°ÐµÑ 1. РпÑоÑивном ÑлÑÑае Ñежим оÑÑаÑÑÑÑ Ð½Ðµ изменÑннÑм, а ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ 0. РлÑбом ÑлÑÑае Ñежим возвÑаÑаеÑÑÑ Ð² ноÑмалÑное ÑоÑÑоÑние поÑле завеÑÑÐµÐ½Ð¸Ñ ÑекÑÑего запÑоÑа.
Ðнимание
РпÑоÑеÑÑе обÑабоÑки запÑоÑа ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑиÑÑ Ð½ÐµÐºÐ¾ÑоÑое колиÑеÑÑво ÑÑÑок, а заÑем ÑÑолкнÑÑÑÑÑ Ñ Ð¾Ñибкой, вÑнÑждаÑÑей его аваÑийно завеÑÑиÑÑ Ð·Ð°Ð¿ÑоÑ. ÐбÑÑно libpq оÑбÑаÑÑÐ²Ð°ÐµÑ Ñакие ÑÑÑоки и ÑообÑÐ°ÐµÑ ÑолÑко об оÑибке. Ðо в одноÑÑÑоÑном Ñежиме ÑÑи ÑÑÑоки Ñже бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ð¿ÑиложениÑ. СледоваÑелÑно, пÑиложение ÑÐ²Ð¸Ð´Ð¸Ñ ÑÑд обÑекÑов PGresult, имеÑÑиÑ
ÑÑаÑÑÑ PGRES_SINGLE_TUPLE, за коÑоÑÑми поÑледÑÐµÑ Ð¾Ð±ÑÐµÐºÑ Ñо ÑÑаÑÑÑом PGRES_FATAL_ERROR. ÐÐ»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñего Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑÑанзакÑий пÑиложение должно бÑÑÑ ÑпÑоекÑиÑовано Ñаким обÑазом, ÑÑÐ¾Ð±Ñ Ð¾ÑбÑаÑÑваÑÑ Ð¸Ð»Ð¸ оÑменÑÑÑ Ð²Ñе опеÑаÑии, пÑоведÑннÑе Ñ Ñже обÑабоÑаннÑми ÑÑÑоками, еÑли запÑÐ¾Ñ Ð² конеÑном иÑоге завеÑÑаеÑÑÑ Ñбоем.