30.9. ФÑнкÑии, ÑвÑзаннÑе Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ COPY
Ðоманда COPY в Postgres Pro Ð¸Ð¼ÐµÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑиÑаÑÑ Ð¸ запиÑÑваÑÑ Ð´Ð°Ð½Ð½Ñе ÑеÑез ÑеÑевое подклÑÑение, ÑÑÑановленное libpq. ÐпиÑаннÑе в ÑÑом Ñазделе ÑÑнкÑии позволÑÑÑ Ð¿ÑиложениÑм воÑполÑзоваÑÑÑÑ ÑÑой возможноÑÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑедаÑи или пÑиÑма копиÑÑемÑÑ
даннÑÑ
.
ÐбÑÐ°Ñ Ð¿ÑоÑедÑÑа Ñакова: ÑнаÑала пÑиложение вÑдаÑÑ SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COPY, вÑзÑÐ²Ð°Ñ PQexec или Ð¾Ð´Ð½Ñ Ð¸Ð· подобнÑÑ
ÑÑнкÑий. РоÑÐ²ÐµÑ Ð¾Ð½Ð¾ должно полÑÑиÑÑ (еÑли не возникла оÑибка) обÑÐµÐºÑ PGresult Ñ ÐºÐ¾Ð´Ð¾Ð¼ ÑоÑÑоÑÐ½Ð¸Ñ PGRES_COPY_OUT или PGRES_COPY_IN (в завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð¿ÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸ÑованиÑ). ÐаÑем пÑиложение должно иÑполÑзоваÑÑ ÑÑнкÑии, опиÑаннÑе в ÑÑом Ñазделе, и пÑинимаÑÑ Ð¸Ð»Ð¸ пеÑедаваÑÑ ÑÑÑоки даннÑÑ
. Ðо завеÑÑении пеÑедаÑи возвÑаÑаеÑÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ обÑÐµÐºÑ PGresult, ÑообÑаÑÑий о ÑоÑÑоÑнии завеÑÑÐµÐ½Ð¸Ñ Ð¿ÐµÑедаÑи. Ð ÑлÑÑае ÑÑпеÑ
а он ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð´ ÑоÑÑоÑÐ½Ð¸Ñ PGRES_COMMAND_OK, а еÑли Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ ÐºÐ°ÐºÐ°Ñ-Ñо пÑоблема â PGRES_FATAL_ERROR. ÐоÑле ÑÑого можно пÑодолжаÑÑ Ð²ÑполнÑÑÑ SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑеÑез PQexec. (Ðока опеÑаÑÐ¸Ñ COPY не завеÑÑена, вÑполнÑÑÑ Ð´ÑÑгие SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑеÑез Ñо же подклÑÑение нелÑзÑ.)
ÐÑли команда COPY бÑла вÑполнена ÑеÑез PQexec в ÑÑÑоке, ÑодеÑжаÑей дополниÑелÑнÑе командÑ, пÑиложение должно пÑодолжиÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ ÑезÑлÑÑаÑÑ ÑеÑез PQgetResult поÑле завеÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи COPY. ТолÑко когда PQgetResult возвÑаÑÐ°ÐµÑ NULL, можно Ñ ÑвеÑенноÑÑÑÑ ÑÑиÑаÑÑ, ÑÑо ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ ÑÑÑока PQexec вÑполнена полноÑÑÑÑ, и безопаÑно пеÑедаваÑÑ Ð´ÑÑгие командÑ.
ФÑнкÑии, опиÑаннÑе в ÑÑом Ñазделе, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ ÑолÑко поÑле полÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð° ÑоÑÑоÑÐ½Ð¸Ñ PGRES_COPY_OUT или PGRES_COPY_IN Ð¾Ñ ÑÑнкÑии PQexec или PQgetResult.
ÐбÑÐµÐºÑ PGresult Ñ Ñаким кодом ÑоÑÑоÑÐ½Ð¸Ñ ÑодеÑÐ¶Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе о наÑавÑейÑÑ Ð¾Ð¿ÐµÑаÑии COPY. ÐÑи даннÑе можно полÑÑиÑÑ ÑÑнкÑиÑми, Ñакже пÑименÑÑÑимиÑÑ Ð¿Ñи обÑабоÑке ÑезÑлÑÑаÑов запÑоÑа:
-
PQnfields ÐозвÑаÑÐ°ÐµÑ ÑиÑло копиÑÑемÑÑ ÑÑолбÑов (полей).
-
PQbinaryTuples ÐнаÑение 0 ÑказÑваеÑ, ÑÑо Ð´Ð»Ñ Ð²Ñей опеÑаÑии копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑименÑеÑÑÑ ÑекÑÑовÑй ÑоÑÐ¼Ð°Ñ (ÑÑÑоки ÑазделÑÑÑÑÑ Ñимволами новой ÑÑÑоки, ÑÑолбÑÑ ÑазделÑÑÑÑÑ Ñимволами-ÑазделиÑелÑми и Ñ. д.). ÐнаÑение 1 ÑказÑваеÑ, ÑÑо Ð´Ð»Ñ Ð²Ñей опеÑаÑии копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑименÑеÑÑÑ Ð´Ð²Ð¾Ð¸ÑнÑй ÑоÑмаÑ. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº COPY.
-
PQfformat ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð´ ÑоÑмаÑа (0 â ÑекÑÑовÑй, 1 â двоиÑнÑй), ÑвÑзаннÑй Ñ ÐºÐ°Ð¶Ð´Ñм копиÑÑемÑм ÑÑолбÑом. ÐÐ¾Ð´Ñ ÑоÑмаÑов ÑÑолбÑов вÑегда бÑдÑÑ Ð½ÑлевÑми, еÑли обÑий ÑоÑÐ¼Ð°Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ â ÑекÑÑовÑй, но Ñ Ð´Ð²Ð¾Ð¸ÑнÑм ÑоÑмаÑом поддеÑживаÑÑÑÑ Ð¸ ÑекÑÑовÑе, и двоиÑнÑе ÑÑолбÑÑ. (Ðднако в ÑекÑÑей ÑеализаÑии
COPYпÑи двоиÑном копиÑовании ÑÑолбÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑолÑко двоиÑнÑми, Ñак ÑÑо ÑоÑмаÑÑ ÑÑолбÑов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ñегда ÑооÑвеÑÑÑвоваÑÑ Ð¾Ð±ÑÐµÐ¼Ñ ÑоÑмаÑÑ.)
ÐÑимеÑание
ÐÑи дополниÑелÑнÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ ÑолÑко пÑи иÑполÑзовании пÑоÑокола 3.0. С пÑоÑоколом 2.0 вÑе ÑÑи ÑÑнкÑии возвÑаÑаÑÑ 0.
30.9.1. ФÑнкÑии Ð´Ð»Ñ Ð¿ÐµÑедаÑи даннÑÑ
COPY
ÐÑи ÑÑнкÑии пÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑедаÑи даннÑÑ
пÑи опеÑаÑии COPY FROM STDIN. Ðни не бÑдÑÑ ÑабоÑаÑÑ, еÑли подклÑÑение наÑ
одиÑÑÑ Ð½Ðµ в ÑоÑÑоÑнии COPY_IN.
-
PQputCopyData ÐÑпÑавлÑÐµÑ Ð´Ð°Ð½Ð½Ñе на ÑеÑвеÑ, когда акÑивно ÑоÑÑоÑние
COPY_IN.int PQputCopyData(PGconn *conn, const char *buffer, int nbytes);ÐеÑедаÑÑ ÑеÑвеÑÑ Ð´Ð°Ð½Ð½Ñе
COPYиз Ñказанного бÑÑеÑа (buffer), длинойnbytesбайÑ. Ðна возвÑаÑÐ°ÐµÑ 1, еÑли даннÑе бÑли пеÑеданÑ, 0, еÑли они не попали в оÑеÑедÑ, Ñак как бÑÑеÑÑ Ð±Ñли Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ñ (ÑÑо возможно ÑолÑко в неблокиÑÑÑÑем Ñежиме), или -1, еÑли пÑоизоÑла оÑибка. (ÐÑли возвÑаÑено -1, подÑобноÑÑи оÑибки можно ÑзнаÑÑ, вÑзвавPQerrorMessage. ÐÑли полÑÑен 0, дождиÑеÑÑ ÑоÑÑоÑÐ½Ð¸Ñ Ð³Ð¾ÑовноÑÑи к запиÑи и повÑоÑиÑе попÑÑкÑ.)ÐÑиложение Ð¼Ð¾Ð¶ÐµÑ ÑазделÑÑÑ Ð¿Ð¾Ñок даннÑÑ
COPYна бÑÑеÑизÑемÑе блоки лÑбого Ñдобного ÑазмеÑа. ÐÑаниÑÑ Ð±ÑÑеÑа не имеÑÑ ÑеманÑиÑеÑкого знаÑÐµÐ½Ð¸Ñ Ð¿Ñи пеÑедаÑе. СодеÑжимое поÑока даннÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑооÑвеÑÑÑвоваÑÑ ÑоÑмаÑÑ Ð´Ð°Ð½Ð½ÑÑ , Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹COPY; за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº COPY.-
PQputCopyEnd ÐÑпÑавлÑÐµÑ Ð¿Ñизнак конÑа даннÑÑ Ð½Ð° ÑеÑвеÑ, когда акÑивно ÑоÑÑоÑние
COPY_IN.int PQputCopyEnd(PGconn *conn, const char *errormsg);ÐавеÑÑÐ°ÐµÑ Ð¾Ð¿ÐµÑаÑиÑ
COPY_INÑ ÑÑпеÑнÑм ÑезÑлÑÑаÑом, еÑли вerrormsgпеÑедаÑÑÑÑNULL. ÐÑлиerrormsgнеNULL, командаCOPYбÑÐ´ÐµÑ Ð·Ð°Ð²ÐµÑÑена Ñ Ð¾Ñибкой, а ÑообÑением об оÑибке бÑÐ´ÐµÑ ÑÑÑока, пеÑÐµÐ´Ð°Ð½Ð½Ð°Ñ Ð²errormsg. (Ðднако не ÑледÑÐµÑ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑ, ÑÑо именно ÑÑо ÑообÑение бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено Ð¾Ñ ÑеÑвеÑа назад, Ñак как ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð³ Ñже пÑеÑваÑÑ Ð¾Ð¿ÐµÑаÑиÑCOPYпо Ñвоим пÑиÑинам. Также замеÑÑÑе, ÑÑо пÑинÑдиÑелÑнÑй вÑзов оÑибки не ÑабоÑÐ°ÐµÑ Ñ ÑоединениÑми по пÑоÑÐ¾ÐºÐ¾Ð»Ñ Ð²ÐµÑÑии до 3.0.)ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ 1, еÑли ÑообÑение завеÑÑÐµÐ½Ð¸Ñ Ð±Ñло пеÑедано; в неблокиÑÑÑÑем Ñежиме ÑÑо ознаÑÐ°ÐµÑ ÑолÑко, ÑÑо ÑообÑение завеÑÑÐµÐ½Ð¸Ñ ÑÑпеÑно поÑÑавлено в оÑеÑедÑ. (ЧÑÐ¾Ð±Ñ ÑдоÑÑовеÑиÑÑÑÑ, ÑÑо даннÑе бÑли ÑÑпеÑно оÑпÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² неблокиÑÑÑÑем Ñежиме, ÑледÑÐµÑ Ð´Ð¾Ð¶Ð´Ð°ÑÑÑÑ Ð³Ð¾ÑовноÑÑи к запиÑи и вÑзÑваÑÑ
PQflushв Ñикле, пока она не веÑнÑÑ Ð½Ð¾Ð»Ñ.) ÐÑлевой ÑезÑлÑÑÐ°Ñ Ð¾Ð·Ð½Ð°ÑаеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ðµ Ñмогла поÑÑавиÑÑ ÑообÑение завеÑÑÐµÐ½Ð¸Ñ Ð² оÑеÑÐµÐ´Ñ Ð¿Ð¾ пÑиÑине Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±ÑÑеÑов; ÑÑо возможно ÑолÑко в неблокиÑÑÑÑем Ñежиме. (Ð ÑÑом ÑлÑÑае нÑжно дождаÑÑÑÑ Ð³Ð¾ÑовноÑÑи к запиÑи и попÑÑаÑÑÑÑ Ð²ÑзваÑÑPQputCopyEndÑнова.) ÐÑли дейÑÑвиÑелÑно пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¾Ñибка, возвÑаÑаеÑÑÑ -1; полÑÑиÑÑ ÐµÑ Ð¿Ð¾Ð´ÑобноÑÑи можно, вÑзвавPQerrorMessage.ÐоÑле ÑÑпеÑного вÑзова
PQputCopyEndвÑзовиÑеPQgetResult, ÑÑÐ¾Ð±Ñ ÑзнаÑÑ Ð¾ÐºÐ¾Ð½ÑаÑелÑнÑй ÑезÑлÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑCOPY. ÐжидаÑÑ Ð¿Ð¾ÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑого ÑезÑлÑÑаÑа можно обÑÑнÑм обÑазом. ÐаÑем веÑниÑеÑÑ Ðº обÑÑнÑм опеÑаÑиÑм.
30.9.2. ФÑнкÑии Ð´Ð»Ñ Ð¿ÑиÑма даннÑÑ
COPY
ÐÑи ÑÑнкÑии пÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
пÑи опеÑаÑии COPY TO STDOUT. Ðни не бÑдÑÑ ÑабоÑаÑÑ, еÑли подклÑÑение наÑ
одиÑÑÑ Ð½Ðµ в ÑоÑÑоÑнии COPY_OUT.
-
PQgetCopyData ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе Ð¾Ñ ÑеÑвеÑа, когда акÑивно ÑоÑÑоÑние
COPY_OUT.int PQgetCopyData(PGconn *conn, char **buffer, int async);ÐапÑаÑÐ¸Ð²Ð°ÐµÑ ÑледÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð´Ð°Ð½Ð½ÑÑ Ñ ÑеÑвеÑа в пÑоÑеÑÑе опеÑаÑии
COPY. ÐаннÑе вÑегда возвÑаÑаÑÑÑÑ ÑÑÑока за ÑÑÑокой; еÑли поÑÑÑпила ÑолÑко ÑаÑÑÑ ÑÑÑоки, она не возвÑаÑаеÑÑÑ. УÑпеÑное полÑÑение ÑÑÑоки даннÑÑ Ð¿Ð¾Ð´ÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð²Ñделение блока памÑÑи Ð´Ð»Ñ ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ . РпаÑамеÑÑеbufferей пеÑедаÑÑÑÑ ÑказаÑелÑ, оÑлиÑнÑй оÑNULL. Ðо адÑеÑÑ*bufferзапиÑÑваеÑÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° вÑделеннÑÑ Ð¿Ð°Ð¼ÑÑÑ, либоNULL, когда бÑÑÐµÑ Ð½Ðµ возвÑаÑаеÑÑÑ. ÐÑли бÑÑÐµÑ ÑезÑлÑÑаÑа оÑлиÑен оÑNULL, его ÑледÑÐµÑ Ð¾ÑвободиÑÑ, когда он ÑÑÐ°Ð½ÐµÑ Ð½Ðµ нÑжен, вÑзвавPQfreemem.Ðогда ÑÑÑока полÑÑена ÑÑпеÑно, возвÑаÑаеÑÑÑ ÑиÑло Ð±Ð°Ð¹Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² ÑÑой ÑÑÑоке (ÑÑо ÑиÑло вÑегда болÑÑе нÑлÑ). ÐозвÑаÑаемое ÑÑÑоковое знаÑение вÑегда завеÑÑаеÑÑÑ Ð½ÑлÑм, Ñ Ð¾ÑÑ ÑÑо полезно, веÑоÑÑно, ÑолÑко Ð´Ð»Ñ ÑекÑÑовой
COPY. ÐÑлевой ÑезÑлÑÑÐ°Ñ Ð¾Ð·Ð½Ð°ÑаеÑ, ÑÑо опеÑаÑиÑCOPYпÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ Ð²ÑполнÑÑÑÑÑ, но ÑÑÑока еÑÑ Ð½Ðµ гоÑова (ÑÑо возможно, ÑолÑко когда паÑамеÑÑasyncÑавен true). ÐозвÑаÑÑнное знаÑение -1 ознаÑаеÑ, ÑÑо командаCOPYзавеÑÑена, а -2 показÑваеÑ, ÑÑо пÑоизоÑла оÑибка (ÐµÑ Ð¿ÑиÑÐ¸Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑзнаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑPQerrorMessage).Ðогда паÑамеÑÑ
asyncÑавен true (оÑлиÑен Ð¾Ñ Ð½ÑлÑ), ÑÑнкÑиÑPQgetCopyDataне бÑÐ´ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑÑÑ, Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ ; она возвÑаÑÐ¸Ñ Ð½Ð¾Ð»Ñ, еÑли вÑполнениеCOPYпÑодолжаеÑÑÑ, но Ð¿Ð¾Ð»Ð½Ð°Ñ ÑÑÑока еÑÑ Ð½Ðµ полÑÑена. (Ð ÑÑом ÑлÑÑае нÑжно дождаÑÑÑÑ Ð³Ð¾ÑовноÑÑи к ÑÑÐµÐ½Ð¸Ñ Ð¸ заÑем вÑзваÑÑPQconsumeInput, пÑежде Ñем вÑзÑваÑÑPQgetCopyDataеÑÑ Ñаз.) ÐогдаasyncÑавен false (нÑлÑ),PQgetCopyDataбÑÐ´ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñована до поÑÑÑÐ¿Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð»Ð¸ оконÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии.Ðогда
PQgetCopyDataвозвÑаÑÐ°ÐµÑ -1, вÑзовиÑеPQgetResult, ÑÑÐ¾Ð±Ñ ÑзнаÑÑ Ð¾ÐºÐ¾Ð½ÑаÑелÑнÑй ÑезÑлÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑCOPY. ÐжидаÑÑ Ð¿Ð¾ÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑого ÑезÑлÑÑаÑа можно обÑÑнÑм обÑазом. ÐаÑем веÑниÑеÑÑ Ðº обÑÑнÑм опеÑаÑиÑм.
30.9.3. УÑÑаÑевÑие ÑÑнкÑии Ð´Ð»Ñ COPY
ÐÑи ÑÑнкÑии пÑедÑÑавлÑÑÑ ÑÑаÑÑе меÑÐ¾Ð´Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии COPY. ХоÑÑ Ð¾Ð½Ð¸ пÑодолжаÑÑ ÑабоÑаÑÑ, они пÑÐ¸Ð·Ð½Ð°Ð½Ñ ÑÑÑаÑевÑими из-за плоÑ
ой обÑабоÑки оÑибок, неÑдобнÑÑ
ÑпоÑобов обнаÑÑÐ¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñа даннÑÑ
и оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки двоиÑнÑÑ
или неблокиÑÑÑÑиÑ
пеÑедаÑ.
-
PQgetline ЧиÑÐ°ÐµÑ Ð¿ÐµÑедаваемÑÑ ÑеÑвеÑом ÑÑÑÐ¾ÐºÑ Ñимволов, завеÑÑаÑÑÑÑÑÑ Ñимволом новой ÑÑÑоки, в бÑÑÐµÑ (buffer) ÑазмеÑа
length.int PQgetline(PGconn *conn, char *buffer, int length);ÐÑа ÑÑнкÑÐ¸Ñ ÐºÐ¾Ð¿Ð¸ÑÑеÑ
length-1 Ñимволов в бÑÑÐµÑ Ð¸ пÑеобÑазÑÐµÑ Ñимвол конÑа ÑÑÑоки в нÑлевой байÑ.PQgetlineвозвÑаÑаеÑEOFв конÑе ввода, 0, еÑли бÑла пÑоÑиÑана вÑÑ ÑÑÑока, и 1, еÑли бÑÑÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½, но завеÑÑаÑÑий Ñимвол конÑа ÑÑÑоки еÑÑ Ð½Ðµ пÑоÑиÑан.ÐамеÑÑÑе, ÑÑо пÑиложение должно пÑовеÑиÑÑ, не ÑоÑÑÐ¾Ð¸Ñ Ð»Ð¸ Ð½Ð¾Ð²Ð°Ñ ÑÑÑока в ÑоÑноÑÑи из двÑÑ Ñимволов
\., ÑÑо бÑÐ´ÐµÑ Ð¾Ð·Ð½Ð°ÑаÑÑ, ÑÑо ÑеÑÐ²ÐµÑ Ð·Ð°Ð²ÐµÑÑил пеÑедаÑÑ ÑезÑлÑÑаÑов командÑCOPY. ÐÑли пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ ÑÑÑоки длиннееlength-1 Ñимволов, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ позабоÑиÑÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ коÑÑекÑно ÑаÑпознавало ÑÑÑокÑ\.(а не воÑпÑинимало, напÑимеÑ, ÐºÐ¾Ð½ÐµÑ Ð´Ð»Ð¸Ð½Ð½Ð¾Ð¹ ÑÑÑоки даннÑÑ ÐºÐ°Ðº завеÑÑаÑÑÑÑ ÑÑÑокÑ).-
PQgetlineAsync ЧиÑÐ°ÐµÑ Ð¿ÐµÑедаваемÑÑ ÑеÑвеÑом ÑÑÑÐ¾ÐºÑ Ð´Ð°Ð½Ð½ÑÑ
COPYв бÑÑÐµÑ Ð±ÐµÐ· блокиÑовки.int PQgetlineAsync(PGconn *conn, char *buffer, int bufsize);ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ñ Ð¾Ð¶Ð° на
PQgetline, но Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² пÑиложениÑÑ , коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ ÑиÑаÑÑ Ð´Ð°Ð½Ð½ÑеCOPYаÑÐ¸Ð½Ñ Ñонно, Ñо еÑÑÑ, без блокиÑовки. ÐапÑÑÑив командÑCOPYи полÑÑив оÑвеÑPGRES_COPY_OUT, пÑиложение должно вÑзÑваÑÑPQconsumeInputиPQgetlineAsync, пока не бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑен Ñигнал конÑа даннÑÑ .РоÑлиÑие оÑ
PQgetline, ÑÑа ÑÑнкÑÐ¸Ñ Ñама оÑвеÑÐ°ÐµÑ Ð·Ð° обнаÑÑжение конÑа даннÑÑ .ÐÑи каждом вÑзове
PQgetlineAsyncбÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð´Ð°Ð½Ð½Ñе, еÑли во Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¼ бÑÑеÑе libpq оказÑваеÑÑÑ Ð¿Ð¾Ð»Ð½Ð°Ñ ÑÑÑока даннÑÑ . РпÑоÑивном ÑлÑÑае никакие даннÑе не возвÑаÑаÑÑÑÑ Ð´Ð¾ поÑÑÑÐ¿Ð»ÐµÐ½Ð¸Ñ Ð¾ÑÑалÑного ÑодеÑжимого ÑÑÑоки. ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ -1, еÑли обнаÑÑживаеÑÑÑ Ð¿Ñизнак завеÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸ÑованиÑ, или 0, еÑли даннÑе не полÑÑенÑ, или положиÑелÑное колиÑеÑÑво возвÑаÑÑннÑÑ Ð±Ð°Ð¹Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑли возвÑаÑаеÑÑÑ -1, вÑзÑваÑÑий код должен заÑем вÑзваÑÑPQendcopyи поÑле ÑÑого пеÑейÑи в обÑÑнÑй Ñежим ÑабоÑÑ.ÐозвÑаÑаемÑе даннÑе не бÑдÑÑ Ð¿ÐµÑеÑекаÑÑ Ð³ÑаниÑÑ ÑÑÑок даннÑÑ . ÐÑи ÑÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑена одна ÑÑÑока Ñеликом. Ðо еÑли бÑÑеÑ, вÑделеннÑй вÑзÑваÑÑим кодом, оказÑваеÑÑÑ ÑлиÑком мал Ð´Ð»Ñ ÑÑÑоки, пеÑедаваемой ÑеÑвеÑом, возвÑаÑена бÑÐ´ÐµÑ ÑаÑÑÑ ÑÑÑоки. Ðогда пеÑедаÑÑÑÑ ÑекÑÑовÑе даннÑе, ÑÑо можно вÑÑвиÑÑ, пÑовеÑив, ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸ поÑледний возвÑаÑаемÑй Ð±Ð°Ð¹Ñ Ñимвол
\n. (ÐлÑCOPYв двоиÑном ÑоÑмаÑе поÑÑебÑеÑÑÑ ÑобÑÑвенно ÑазобÑаÑÑ ÑоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð½ÑÑCOPY, ÑÑÐ¾Ð±Ñ Ð²ÑÑвиÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ ÑиÑÑаÑиÑ.) ÐозвÑаÑÐ°ÐµÐ¼Ð°Ñ ÑÑÑока не завеÑÑаеÑÑÑ Ð½ÑлÑм. (ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе полÑÑиÑÑ ÑÑÑÐ¾ÐºÑ Ñ Ð½ÑлÑм в конÑе, пеÑедайÑе вbufsizeÑиÑло на единиÑÑ Ð¼ÐµÐ½ÑÑе ÑакÑиÑеÑкого ÑазмеÑа блока.)-
PQputline ÐеÑедаÑÑ ÑеÑвеÑÑ ÑÑÑокÑ, завеÑÑÑннÑÑ Ð½ÑлÑм. ÐозвÑаÑÐ°ÐµÑ 0 в ÑлÑÑае ÑÑÐ¿ÐµÑ Ð°, либо
EOF, еÑли пеÑедаÑÑ ÑÑÑÐ¾ÐºÑ Ð½Ðµ ÑдаÑÑÑÑ.int PQputline(PGconn *conn, const char *string);ÐоÑок даннÑÑ
COPY, пеÑедаваемÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑÑ Ð²ÑзововPQputline, Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑоÑмаÑ, ÑÑо возвÑаÑаеÑPQgetlineAsync, за иÑклÑÑением Ñого, ÑÑо пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ обÑзаÑелÑно Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÐµÑедаваÑÑ Ð¿Ð¾ одной ÑÑÑоке даннÑÑ Ð·Ð° вÑзовPQputline; они могÑÑ Ð¿Ð¾ÑÑлаÑÑ ÑаÑÑи ÑÑÑок или ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑко ÑÑÑок.ÐÑимеÑание
Ðо веÑÑии 3.0 пÑоÑокола Postgres Pro пÑиложение должно бÑло Ñвно оÑпÑавлÑÑÑ Ð´Ð²Ð° Ñимвола
\.поÑледней ÑÑÑокой, ÑÑÐ¾Ð±Ñ ÑообÑиÑÑ ÑеÑвеÑÑ, ÑÑо оно законÑило пеÑедаÑÑ Ð´Ð°Ð½Ð½ÑÑCOPY. ХоÑÑ ÑÑо по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ ÑабоÑаеÑ, Ñакое поведение ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим и ожидаеÑÑÑ, ÑÑо оÑобое знаÑение\.бÑÐ´ÐµÑ Ð¸ÑклÑÑено в бÑдÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ . ÐеÑедав ÑобÑÑвенно даннÑе, ÑейÑÐ°Ñ Ð´Ð¾ÑÑаÑоÑно вÑзваÑÑPQendcopy.-
PQputnbytes ÐеÑедаÑÑ ÑеÑвеÑÑ ÑÑÑокÑ, не завеÑÑÑннÑÑ Ð½ÑлÑм. ÐозвÑаÑÐ°ÐµÑ 0 в ÑлÑÑае ÑÑÐ¿ÐµÑ Ð°, либо
EOF, еÑли пеÑедаÑÑ ÑÑÑÐ¾ÐºÑ Ð½Ðµ ÑдаÑÑÑÑ.int PQputnbytes(PGconn *conn, const char *buffer, int nbytes);Ðоведение ÑÑой ÑÑнкÑии не оÑлиÑаеÑÑÑ Ð¾Ñ
PQputline, но ÐµÑ Ð±ÑÑÐµÑ Ð´Ð°Ð½Ð½ÑÑ Ð½Ðµ должен ÑодеÑжаÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑий нолÑ, Ñак как Ð´Ð»Ñ Ð½ÐµÑ ÑиÑло пеÑедаваемÑÑ Ð±Ð°Ð¹Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно. ÐÑполÑзÑйÑе ÑÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÐµÑедаÑи двоиÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ .-
PQendcopy ÐÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ ÑÐ¸Ð½Ñ ÑонизаÑÐ¸Ñ Ñ ÑеÑвеÑом.
int PQendcopy(PGconn *conn);
ÐÑа ÑÑнкÑÐ¸Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑвеÑом. ÐÑ ÑледÑÐµÑ Ð²ÑзÑваÑÑ, либо когда ÑеÑвеÑÑ Ð±Ñла пеÑедана поÑледнÑÑ ÑÑÑока ÑÑнкÑией
PQputline, либо когда Ð¾Ñ ÑеÑвеÑа бÑла полÑÑена поÑледнÑÑ ÑÑÑока ÑÑнкÑиейPQgetline. ÐÑли ÐµÑ Ð½Ðµ вÑзваÑÑ, ÑеÑÐ²ÐµÑ Â«Ð¿Ð¾ÑеÑÑÐµÑ ÑÐ¸Ð½Ñ ÑонизаÑиÑ» Ñ ÐºÐ»Ð¸ÐµÐ½Ñом. ÐоÑле завеÑÑÐµÐ½Ð¸Ñ ÑÑой ÑÑнкÑии ÑеÑÐ²ÐµÑ Ð³Ð¾Ñов пÑинимаÑÑ ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL. Ð ÑлÑÑае ÑÑпеÑного завеÑÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ 0, в пÑоÑивном ÑлÑÑае â ненÑлевое знаÑение. (ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð¾Ð´ÑобноÑÑи оÑибки пÑи ненÑлевом знаÑении, вÑзовиÑеPQerrorMessage.)ÐÑзÑваÑ
PQgetResult, пÑиложение должно обÑабаÑÑваÑÑ ÑезÑлÑÑаÑPGRES_COPY_OUT, в Ñикле вÑполнÑÑPQgetline, а обнаÑÑжив завеÑÑаÑÑÑÑ ÑÑÑокÑ, вÑзваÑÑPQendcopy. ÐаÑем оно должно веÑнÑÑÑÑÑ Ðº ÑиклÑPQgetResult, и вÑйÑи из него, когдаPQgetResultвозвÑаÑÐ¸Ñ Ð½Ñлевой ÑказаÑелÑ. ÐодобнÑм обÑазом, полÑÑив ÑезÑлÑÑаÑPGRES_COPY_IN, пÑиложение должно вÑполниÑÑ ÑеÑÐ¸Ñ Ð²ÑзововPQputline, завеÑÑиÑÑ ÐµÑ, вÑзвавPQendcopy, а заÑем веÑнÑÑÑÑÑ Ðº ÑиклÑPQgetResult. ÐÑи Ñакой оÑганизаÑии обÑабоÑки командаCOPYбÑÐ´ÐµÑ ÐºÐ¾ÑÑекÑно вÑполнÑÑÑÑÑ Ð¸ в ÑоÑÑаве поÑледоваÑелÑноÑÑи команд SQL.СÑаÑÑе пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑно пеÑедаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
COPYÑеÑезPQexecи ÑаÑÑÑиÑÑваÑÑ, ÑÑо ÑÑанзакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð²ÐµÑÑена поÑлеPQendcopy. ÐÑо бÑÐ´ÐµÑ ÑабоÑаÑÑ, ÑолÑко еÑли командаCOPYÑвлÑеÑÑÑ ÐµÐ´Ð¸Ð½ÑÑвенной SQL-командой в ÑÑÑоке команд.