33.3. ФÑнкÑии Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ #
- 33.3.1. ÐлавнÑе ÑÑнкÑии
- 33.3.2. ÐзвлеÑение инÑоÑмаÑии, ÑвÑзанной Ñ ÑезÑлÑÑаÑом запÑоÑа
- 33.3.3. ÐолÑÑение дÑÑгой инÑоÑмаÑии о ÑезÑлÑÑаÑе
- 33.3.4. ÐкÑаниÑование ÑÑÑоковÑÑ Ð·Ð½Ð°Ñений Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð² SQL-командÑ
- 33.3.2. ÐзвлеÑение инÑоÑмаÑии, ÑвÑзанной Ñ ÑезÑлÑÑаÑом запÑоÑа
ÐоÑле Ñого как Ñоединение Ñ ÑеÑвеÑом бÑло ÑÑпеÑно ÑÑÑановлено, ÑÑнкÑии, опиÑаннÑе в ÑÑом Ñазделе, иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SQL-запÑоÑов и команд.
33.3.1. ÐлавнÑе ÑÑнкÑии #
PQexec#ÐеÑедаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑеÑвеÑÑ Ð¸ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑезÑлÑÑаÑа.
PGresult *PQexec(PGconn *conn, const char *command);
ÐозвÑаÑÐ°ÐµÑ ÑказаÑÐµÐ»Ñ Ð½Ð°
PGresultили, возможно, пÑÑÑой ÑказаÑÐµÐ»Ñ (null). Ðак пÑавило, возвÑаÑаеÑÑÑ Ð½ÐµÐ¿ÑÑÑой ÑказаÑелÑ, иÑклÑÑением ÑвлÑÑÑÑÑ ÑиÑÑаÑии Ð½ÐµÑ Ð²Ð°Ñки памÑÑи или ÑеÑÑÑзнÑе оÑибки, Ñакие, как невозможноÑÑÑ Ð¾ÑпÑавки ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑеÑвеÑÑ. ÐÐ»Ñ Ð¿ÑовеÑки возвÑаÑаемого знаÑÐµÐ½Ð¸Ñ Ð½Ð° налиÑие оÑибок ÑледÑÐµÑ Ð²ÑзваÑÑ ÑÑнкÑиÑPQresultStatus(в ÑлÑÑае нÑлевого ÑказаÑÐµÐ»Ñ Ð¾Ð½Ð° возвÑаÑиÑPGRES_FATAL_ERROR). ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии о ÑÐ°ÐºÐ¸Ñ Ð¾ÑÐ¸Ð±ÐºÐ°Ñ Ð¸ÑполÑзÑйÑе ÑÑнкÑиÑPQerrorMessage.
СÑÑока ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð² ÑÐµÐ±Ñ Ð±Ð¾Ð»ÐµÐµ одной SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (коÑоÑÑе ÑазделÑÑÑÑÑ ÑоÑкой Ñ Ð·Ð°Ð¿ÑÑой). ÐеÑколÑко запÑоÑов, оÑпÑавленнÑÑ
Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ вÑзова PQexec, обÑабаÑÑваÑÑÑÑ Ð² ÑамкаÑ
одной ÑÑанзакÑии, еÑли ÑолÑко ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ BEGIN/COMMIT не вклÑÑÐµÐ½Ñ Ñвно в ÑÑÑÐ¾ÐºÑ Ð·Ð°Ð¿ÑоÑа, ÑÑÐ¾Ð±Ñ ÑазделиÑÑ ÐµÐ³Ð¾ на неÑколÑко ÑÑанзакÑий. (ÐодÑобнее о Ñом, как ÑеÑÐ²ÐµÑ Ð¾Ð±ÑабаÑÑÐ²Ð°ÐµÑ ÑÑÑоки, вклÑÑаÑÑие неÑколÑко команд, ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе 54.2.2.1.) Ðднако обÑаÑиÑе внимание, ÑÑо возвÑаÑÐ°ÐµÐ¼Ð°Ñ ÑÑÑÑкÑÑÑа PGresult опиÑÑÐ²Ð°ÐµÑ ÑолÑко ÑезÑлÑÑÐ°Ñ Ð¿Ð¾Ñледней из вÑполненнÑÑ
команд, ÑодеÑжаÑиÑ
ÑÑ Ð² ÑÑÑоке запÑоÑа. ÐÑли одна из команд завеÑÑаеÑÑÑ Ñбоем, Ñо обÑабоÑка ÑÑÑоки запÑоÑа на ÑÑом оÑÑанавливаеÑÑÑ, и возвÑаÑÑÐ½Ð½Ð°Ñ ÑÑÑÑкÑÑÑа PGresult опиÑÑÐ²Ð°ÐµÑ ÑоÑÑоÑние оÑибки.
PQexecParams#ÐÑпÑавлÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑеÑвеÑÑ Ð¸ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑезÑлÑÑаÑа. ÐÐ¼ÐµÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿ÐµÑедаÑÑ Ð¿Ð°ÑамеÑÑÑ Ð¾ÑделÑно Ð¾Ñ ÑекÑÑа SQL-командÑ.
PGresult *PQexecParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);PQexecParamsподобнаPQexec, но пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÑнкÑионалÑноÑÑÑ: знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов могÑÑ Ð±ÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ñ Ð¾ÑделÑно Ð¾Ñ Ñамой ÑÑÑоки-командÑ, а ÑезÑлÑÑаÑÑ Ð·Ð°Ð¿ÑоÑа могÑÑ Ð±ÑÑÑ Ð·Ð°ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ñ Ð»Ð¸Ð±Ð¾ в ÑекÑÑовом, либо в двоиÑном ÑоÑмаÑе.ÐаÑамеÑÑÑ ÑÑнкÑии ÑледÑÑÑие:
connÐбÑекÑ, опиÑÑваÑÑий подклÑÑение, ÑеÑез коÑоÑое пеÑеÑÑлаеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°.
commandСÑÑока SQL-командÑ, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð²Ñполнена. ÐÑли иÑполÑзÑÑÑÑÑ Ð¿Ð°ÑамеÑÑÑ, Ñо в ÑÑÑоке ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½Ð° Ð½Ð¸Ñ ÑÑÑлаÑÑÑÑ, как
$1,$2и Ñ. д.nParamsЧиÑло пÑедоÑÑавлÑемÑÑ Ð¿Ð°ÑамеÑÑов. Ðно Ñавно длине маÑÑивов
paramTypes[],paramValues[],paramLengths[]иparamFormats[]. (УказаÑели на маÑÑÐ¸Ð²Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑавнÑNULL, когдаnParamsÑавно нÑлÑ.)paramTypes[]ÐÑедпиÑÑваеÑ, поÑÑедÑÑвом OID, ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð½Ð°Ð·Ð½Ð°ÑÐµÐ½Ñ Ð¿Ð°ÑамеÑÑам. ÐÑли знаÑение
paramTypesÑавноNULLили какой-либо оÑделÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² маÑÑиве Ñавен нÑлÑ, Ñогда ÑеÑÐ²ÐµÑ ÑамоÑÑоÑÑелÑно опÑÐµÐ´ÐµÐ»Ð¸Ñ Ñип даннÑÑ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа ÑоÑно Ñаким же обÑазом, как он Ñделал Ð±Ñ Ð´Ð»Ñ Ð»Ð¸ÑеÑалÑной ÑÑÑоки, Ñип коÑоÑой не Ñказан.paramValues[]УказÑÐ²Ð°ÐµÑ ÑакÑиÑеÑкие знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов. ÐÑлевой ÑказаÑÐµÐ»Ñ Ð² ÑÑом маÑÑиве ознаÑаеÑ, ÑÑо ÑооÑвеÑÑÑвÑÑÑий паÑамеÑÑ Ñавен null; в пÑоÑивном ÑлÑÑае ÑказаÑÐµÐ»Ñ ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑекÑÑовÑÑ ÑÑÑокÑ, завеÑÑаÑÑÑÑÑÑ Ð½ÑлевÑм Ñимволом (Ð´Ð»Ñ ÑекÑÑового ÑоÑмаÑа), или на двоиÑнÑе даннÑе в ÑоÑмаÑе, коÑоÑого Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑеÑÐ²ÐµÑ (Ð´Ð»Ñ Ð´Ð²Ð¾Ð¸Ñного ÑоÑмаÑа).
paramLengths[]УказÑÐ²Ð°ÐµÑ ÑакÑиÑеÑкие Ð´Ð»Ð¸Ð½Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов, пÑедÑÑавленнÑÑ Ð² двоиÑном ÑоÑмаÑе. Ðн игноÑиÑÑеÑÑÑ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов, имеÑÑÐ¸Ñ Ð·Ð½Ð°Ñение null, и Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов, пÑедÑÑавленнÑÑ Ð² ÑекÑÑовом ÑоÑмаÑе. УказаÑÐµÐ»Ñ Ð½Ð° маÑÑив Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÑлевÑм, когда Ð½ÐµÑ Ð´Ð²Ð¾Ð¸ÑнÑÑ Ð¿Ð°ÑамеÑÑов.
paramFormats[]УказÑваеÑ, ÑвлÑÑÑÑÑ Ð»Ð¸ паÑамеÑÑÑ ÑекÑÑовÑми (помеÑÑиÑе нÑÐ»Ñ Ð² ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива, ÑооÑвеÑÑÑвÑÑÑий ÑÐ°ÐºÐ¾Ð¼Ñ Ð¿Ð°ÑамеÑÑÑ) или двоиÑнÑми (помеÑÑиÑе единиÑÑ Ð² ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива, ÑооÑвеÑÑÑвÑÑÑий ÑÐ°ÐºÐ¾Ð¼Ñ Ð¿Ð°ÑамеÑÑÑ). ÐÑли ÑказаÑÐµÐ»Ñ Ð½Ð° маÑÑив ÑвлÑеÑÑÑ Ð½ÑлевÑм, Ñогда вÑе паÑамеÑÑÑ ÑÑиÑаÑÑÑÑ ÑекÑÑовÑми ÑÑÑоками.
ÐнаÑениÑ, пеÑеданнÑе в двоиÑном ÑоÑмаÑе, ÑÑебÑÑÑ Ð·Ð½Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑеннего пÑедÑÑавлениÑ, коÑоÑого Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑеÑвеÑ. ÐапÑимеÑ, ÑелÑе ÑиÑла Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÐµÑедаваÑÑÑÑ Ñ Ð¸ÑполÑзованием ÑеÑевого поÑÑдка байÑов. ÐеÑедаÑа знаÑений Ñипа
numericÑÑебÑÐµÑ Ð·Ð½Ð°Ð½Ð¸Ñ ÑоÑмаÑа, в коÑоÑом Ð¸Ñ Ñ ÑÐ°Ð½Ð¸Ñ ÑеÑвеÑ.resultFormatТÑебÑÐµÑ ÑказаÑÑ Ð½Ð¾Ð»Ñ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑезÑлÑÑаÑÑ Ð² ÑекÑÑовом ÑоÑмаÑе, или единиÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑезÑлÑÑаÑÑ Ð² двоиÑном ÑоÑмаÑе. (РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð½ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи полÑÑиÑÑ ÑазлиÑнÑе ÑÑолбÑÑ ÑезÑлÑÑаÑа в ÑазнÑÑ ÑоÑмаÑÐ°Ñ , Ñ Ð¾ÑÑ ÑÑо и возможно на ÑÑовне пÑоÑокола, лежаÑего в оÑнове подклÑÑений.)
ÐлавнÑм пÑеимÑÑеÑÑвом PQexecParams пеÑед PQexec ÑвлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾ÑделиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов Ð¾Ñ ÑÑÑоки запÑоÑа. ÐÑо позволÑÐµÑ Ð¾Ð±Ð¾Ð¹ÑиÑÑ Ð±ÐµÐ· кавÑÑек и ÑкÑаниÑÑÑÑиÑ
Ñимволов, манипÑлиÑование коÑоÑÑми бÑÐ²Ð°ÐµÑ ÑÑÑдоÑмким и ÑаÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº оÑибкам.
РоÑлиÑие Ð¾Ñ PQexec, PQexecParams позволÑÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð½Ðµ более одной SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² ÑÑÑÐ¾ÐºÑ Ð·Ð°Ð¿ÑоÑа. (Рней могÑÑ ÑодеÑжаÑÑÑÑ ÑоÑки Ñ Ð·Ð°Ð¿ÑÑой, однако Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð½Ðµ более одной непÑÑÑой командÑ.) ÐÑо огÑаниÑение накладÑваеÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñм пÑоÑоколом, но оно пÑиноÑÐ¸Ñ Ð¸ некоÑоÑÑÑ Ð¿Ð¾Ð»ÑÐ·Ñ Ð² каÑеÑÑве дополниÑелÑной заÑиÑÑ Ð¾Ñ Ð°Ñак меÑодом SQL-инÑекÑий.
ÐодÑказка
Указание Ñипов паÑамеÑÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ OID ÑвлÑеÑÑÑ ÑÑÑдоÑмким, оÑобенно еÑли Ð²Ñ Ð¿ÑедпоÑиÑаеÑе не ÑказÑваÑÑ Ñвно знаÑений OID в ваÑей пÑогÑамме. Ðднако Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе избежаÑÑ ÑÑого даже в ÑлÑÑаÑÑ , когда ÑеÑÐ²ÐµÑ ÑамоÑÑоÑÑелÑно не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ Ñип паÑамеÑÑа или вÑбиÑÐ°ÐµÑ Ð½Ðµ ÑÐ¾Ñ Ñип, коÑоÑÑй Ð²Ñ Ñ Ð¾ÑиÑе. Ð ÑÑÑоке SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð¾Ð±Ð°Ð²ÑÑе Ñвное пÑиведение Ñипа Ð´Ð»Ñ ÑÑого паÑамеÑÑа, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ, какой Ñип даннÑÑ Ð²Ñ Ð±ÑдеÑе оÑпÑавлÑÑÑ. ÐапÑимеÑ:
SELECT * FROM mytable WHERE x = $1::bigint;
ÐÑо пÑиведÑÑ Ðº ÑомÑ, ÑÑо паÑамеÑÑ $1 бÑÐ´ÐµÑ ÑÑиÑаÑÑÑÑ Ð¸Ð¼ÐµÑÑим Ñип bigint, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº по ÑмолÑÐ°Ð½Ð¸Ñ ÐµÐ¼Ñ Ð±Ñл Ð±Ñ Ð½Ð°Ð·Ð½Ð°Ñен ÑÐ¾Ñ Ð¶Ðµ ÑамÑй Ñип, ÑÑо и x. Такое Ñвное пÑинÑÑие ÑеÑÐµÐ½Ð¸Ñ Ð¾ Ñипе паÑамеÑÑа либо Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿Ð¸Ñанного меÑода, либо пÑÑÑм Ð·Ð°Ð´Ð°Ð½Ð¸Ñ ÑиÑлового OID ÑÑÑого ÑекомендÑеÑÑÑ, когда знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов оÑпÑавлÑÑÑÑÑ Ð² двоиÑном ÑоÑмаÑе, поÑколÑÐºÑ Ð´Ð²Ð¾Ð¸ÑнÑй ÑоÑÐ¼Ð°Ñ Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÐ½ÑÑÑÑ Ð¸Ð·Ð±ÑÑоÑноÑÑÑ, Ñем ÑекÑÑовÑй, и поÑÑÐ¾Ð¼Ñ Ð³Ð¾Ñаздо менее веÑоÑÑно, ÑÑо ÑеÑÐ²ÐµÑ Ð¾Ð±Ð½Ð°ÑÑÐ¶Ð¸Ñ Ð¾ÑÐ¸Ð±ÐºÑ Ð½ÐµÑооÑвеÑÑÑÐ²Ð¸Ñ Ñипов, допÑÑеннÑÑ Ð²Ð°Ð¼Ð¸.
PQprepare#ÐÑпÑавлÑÐµÑ Ð·Ð°Ð¿ÑоÑ, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑй опеÑаÑÐ¾Ñ Ñ ÐºÐ¾Ð½ÐºÑеÑнÑми паÑамеÑÑами, и Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð·Ð°Ð²ÐµÑÑениÑ.
PGresult *PQprepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes);PQprepareÑоздаÑÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑй опеÑаÑÐ¾Ñ Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑего иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑPQexecPrepared. ÐлагодаÑÑ ÑÑомÑ, командÑ, коÑоÑÑе бÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑно, не поÑÑебÑеÑÑÑ ÑазбиÑаÑÑ Ð¸ планиÑоваÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз; за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº PREPARE.ФÑнкÑÐ¸Ñ ÑоздаÑÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑй опеÑаÑÐ¾Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼
stmtNameиз ÑÑÑокиquery, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑодеÑжаÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑÑ SQL-командÑ.stmtNameÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑой ÑÑÑокой"", Ñогда бÑÐ´ÐµÑ Ñоздан неименованнÑй опеÑаÑÐ¾Ñ (в Ñаком ÑлÑÑае лÑбой Ñже ÑÑÑеÑÑвÑÑÑий неименованнÑй опеÑаÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки заменÑн), в пÑоÑивном ÑлÑÑае, еÑли Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа Ñже опÑеделено в ÑекÑÑем ÑеанÑе ÑабоÑÑ, бÑÐ´ÐµÑ Ð¾Ñибка. ÐÑли иÑполÑзÑÑÑÑÑ Ð¿Ð°ÑамеÑÑÑ, Ñо в запÑоÑе к ним обÑаÑаÑÑÑÑ Ñаким обÑазом:$1,$2и Ñ. д.nParamsпÑедÑÑавлÑÐµÑ ÑиÑло паÑамеÑÑов, ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ñ Ð² маÑÑивеparamTypes[]. (УказаÑÐµÐ»Ñ Ð½Ð° маÑÑив Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑавенNULL, когда знаÑениеnParamsÑавно нÑлÑ.)paramTypes[]ÑказÑваеÑ, поÑÑедÑÑвом OID, ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑе бÑдÑÑ Ð½Ð°Ð·Ð½Ð°ÑÐµÐ½Ñ Ð¿Ð°ÑамеÑÑам. ÐÑлиparamTypesÑавенNULLили какой-либо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² ÑÑом маÑÑиве Ñавен нÑлÑ, Ñо ÑеÑÐ²ÐµÑ Ð½Ð°Ð·Ð½Ð°ÑÐ°ÐµÑ Ñип даннÑÑ ÑооÑвеÑÑÑвÑÑÑÐµÐ¼Ñ Ð¿Ð°ÑамеÑÑÑ ÑоÑно Ñаким же ÑпоÑобом, как он Ñделал Ð±Ñ Ð´Ð»Ñ Ð»Ð¸ÑеÑалÑной ÑÑÑоки, не имеÑÑей Ñипа. Также в запÑоÑе можно иÑполÑзоваÑÑ Ð¿Ð°ÑамеÑÑÑ Ñ Ð½Ð¾Ð¼ÐµÑами, болÑÑими, ÑемnParams; ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð½Ð¸Ñ ÑеÑÐ²ÐµÑ Ñакже ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±ÑаÑÑ. (См. опиÑаниеPQdescribePrepared, где Ñказано, как можно опÑеделиÑÑ, какие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð±Ñли подобÑанÑ).Ðак и пÑи вÑзове
PQexec, ÑезÑлÑÑаÑом ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑPGresult, ÑодеÑжимое коÑоÑого показÑÐ²Ð°ÐµÑ ÑÑÐ¿ÐµÑ Ð¸Ð»Ð¸ Ñбой на ÑÑоÑоне ÑеÑвеÑа. ÐÑлевой ÑказаÑÐµÐ»Ñ Ð¾Ð·Ð½Ð°ÑÐ°ÐµÑ Ð½ÐµÑ Ð²Ð°ÑÐºÑ Ð¿Ð°Ð¼ÑÑи или невозможноÑÑÑ Ð²Ð¾Ð¾Ð±Ñе оÑпÑавиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии о ÑÐ°ÐºÐ¸Ñ Ð¾ÑÐ¸Ð±ÐºÐ°Ñ Ð¸ÑполÑзÑйÑеPQerrorMessage.
ÐодгоÑовленнÑе опеÑаÑоÑÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ PQexecPrepared можно Ñакже ÑоздаÑÑ Ð¿ÑÑÑм иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SQL-команд PREPARE. Также, Ñ
оÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ ÑÑнкÑии libpq Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовленного опеÑаÑоÑа не пÑедÑÑмоÑÑено, Ð´Ð»Ñ ÑÑой Ñели можно воÑполÑзоваÑÑÑÑ SQL-командой DEALLOCATE.
PQexecPrepared#ÐÑпÑавлÑÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° иÑполнение подгоÑовленного опеÑаÑоÑа Ñ Ð´Ð°Ð½Ð½Ñми паÑамеÑÑами и Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑезÑлÑÑаÑа.
PGresult *PQexecPrepared(PGconn *conn, const char *stmtName, int nParams, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);PQexecPreparedподобнаPQexecParams, но команда, подлежаÑÐ°Ñ Ð¸ÑполнениÑ, ÑказÑваеÑÑÑ Ð¿ÑÑÑм пеÑедаÑи имени пÑедваÑиÑелÑно подгоÑовленного опеÑаÑоÑа вмеÑÑо пеÑедаÑи ÑÑÑоки запÑоÑа. ÐÑа возможноÑÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼, коÑоÑÑе вÑзÑваÑÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑно, подвеÑгаÑÑÑÑ ÑазбоÑÑ Ð¸ планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑолÑко один Ñаз, а не пÑи каждом Ð¸Ñ Ð¸Ñполнении. ÐпеÑаÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñовлен пÑедваÑиÑелÑно в ÑÐ°Ð¼ÐºÐ°Ñ ÑекÑÑего ÑеанÑа ÑабоÑÑ.ÐаÑамеÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑнÑ
PQexecParams, за иÑклÑÑением Ñого, ÑÑо вмеÑÑо ÑÑÑоки запÑоÑа пеÑедаÑÑÑÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовленного опеÑаÑоÑа и оÑÑÑÑÑÑвÑÐµÑ Ð¿Ð°ÑамеÑÑparamTypes[](он не нÑжен, поÑколÑÐºÑ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов подгоÑовленного опеÑаÑоÑа бÑли опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¿Ñи его Ñоздании).PQdescribePrepared#ÐеÑедаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° полÑÑение инÑоÑмаÑии об Ñказанном подгоÑовленном опеÑаÑоÑе и Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð·Ð°Ð²ÐµÑÑениÑ.
PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);
PQdescribePreparedпозволÑÐµÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ пÑедваÑиÑелÑно подгоÑовленном опеÑаÑоÑе.ÐÐ»Ñ ÑÑÑлки на неименованнÑй опеÑаÑÐ¾Ñ Ð·Ð½Ð°Ñение
stmtNameÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑой ÑÑÑокой""илиNULL, в пÑоÑивном ÑлÑÑае оно должно бÑÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑÑеÑÑвÑÑÑего подгоÑовленного опеÑаÑоÑа. Ð ÑлÑÑае ÑÑпеÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑPGresultÑо ÑÑаÑÑÑомPGRES_COMMAND_OK. ФÑнкÑииPQnparamsиPQparamtypeпозволÑÑÑ Ð¸Ð·Ð²Ð»ÐµÑÑ Ð¸Ð·PGresultинÑоÑмаÑÐ¸Ñ Ð¾ паÑамеÑÑÐ°Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовленного опеÑаÑоÑа, а ÑÑнкÑииPQnfields,PQfname,PQftypeи Ñ. п. пÑедоÑÑавлÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑезÑлÑÑиÑÑÑÑÐ¸Ñ ÑÑолбÑÐ°Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа (еÑли они еÑÑÑ).PQdescribePortal#ÐеÑедаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° полÑÑение инÑоÑмаÑии об Ñказанном поÑÑале и Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð·Ð°Ð²ÐµÑÑениÑ.
PGresult *PQdescribePortal(PGconn *conn, const char *portalName);
PQdescribePortalпозволÑÐµÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ пÑедваÑиÑелÑно Ñозданном поÑÑале. (libpq не пÑедоÑÑавлÑÐµÑ Ð¿ÑÑмого доÑÑÑпа к поÑÑалам, но Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñо ÑвойÑÑвами кÑÑÑоÑа, Ñозданного Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ SQL-командÑDECLARE CURSOR.)ÐÐ»Ñ ÑÑÑлки на неименованнÑй поÑÑал знаÑение
portalNameÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑой ÑÑÑокой""илиNULL, в пÑоÑивном ÑлÑÑае оно должно бÑÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑÑеÑÑвÑÑÑего поÑÑала. Ð ÑлÑÑае ÑÑпеÑного завеÑÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑPGresultÑо ÑÑаÑÑÑомPGRES_COMMAND_OK. С помоÑÑÑ ÑÑнкÑийPQnfields,PQfname,PQftypeи Ñ. д. можно извлеÑÑ Ð¸Ð·PGresultинÑоÑмаÑÐ¸Ñ Ð¾ ÑезÑлÑÑиÑÑÑÑÐ¸Ñ ÑÑолбÑÐ°Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ поÑÑала (еÑли они еÑÑÑ).
СÑÑÑкÑÑÑа PGresult ÑодеÑÐ¶Ð¸Ñ ÑезÑлÑÑаÑ, возвÑаÑÑннÑй ÑеÑвеÑом. РазÑабоÑÑики пÑиложений libpq Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑаÑелÑно поддеÑживаÑÑ Ð°Ð±ÑÑÑакÑÐ¸Ñ PGresult. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа к ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ PGresult иÑполÑзÑйÑе ÑÑнкÑии доÑÑÑпа, опиÑаннÑе ниже. ÐзбегайÑе непоÑÑедÑÑвенного обÑаÑÐµÐ½Ð¸Ñ Ðº полÑм ÑÑÑÑкÑÑÑÑ PGresult, поÑколÑÐºÑ Ð¾Ð½Ð¸ могÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑÑÑ Ð² бÑдÑÑем.
PQresultStatus#ÐозвÑаÑÐ°ÐµÑ ÑÑаÑÑÑ ÑезÑлÑÑаÑа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ.
ExecStatusType PQresultStatus(const PGresult *res);
PQresultStatusÐ¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¾Ð´Ð½Ð¾ из ÑледÑÑÑÐ¸Ñ Ð·Ð½Ð°Ñений:PGRES_EMPTY_QUERY#СÑÑока, оÑпÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ ÑеÑвеÑÑ, бÑла пÑÑÑой.
PGRES_COMMAND_OK#УÑпеÑное завеÑÑение командÑ, не возвÑаÑаÑÑей Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ .
PGRES_TUPLES_OK#УÑпеÑное завеÑÑение командÑ, возвÑаÑаÑÑей даннÑе (Ñакой, как
SELECTилиSHOW).PGRES_COPY_OUT#ÐаÑÐ°Ñ Ð¿ÐµÑÐµÐ½Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ Copy Out (Ñ ÑеÑвеÑа).
PGRES_COPY_IN#ÐаÑÐ°Ñ Ð¿ÐµÑÐµÐ½Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ Copy In (на ÑеÑвеÑ).
PGRES_BAD_RESPONSE#ÐÑÐ²ÐµÑ ÑеÑвеÑа не бÑл ÑаÑпознан.
PGRES_NONFATAL_ERROR#ÐÑоизоÑла некÑиÑиÑеÑÐºÐ°Ñ Ð¾Ñибка (Ñведомление или пÑедÑпÑеждение).
PGRES_FATAL_ERROR#ÐÑоизоÑла кÑиÑиÑеÑÐºÐ°Ñ Ð¾Ñибка.
PGRES_COPY_BOTH#ÐаÑÐ°Ñ Ð¿ÐµÑÐµÐ½Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ Copy In/Out (на ÑеÑÐ²ÐµÑ Ð¸ Ñ ÑеÑвеÑа). ÐÑа ÑÑнкÑÐ¸Ñ Ð² наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¸ÑполÑзÑеÑÑÑ ÑолÑко Ð´Ð»Ñ Ð¿Ð¾Ñоковой ÑепликаÑии, поÑÑÐ¾Ð¼Ñ Ñакой ÑÑаÑÑÑ Ð½Ðµ должен имеÑÑ Ð¼ÐµÑÑо в обÑÑнÑÑ Ð¿ÑиложениÑÑ .
PGRES_SINGLE_TUPLE#СÑÑÑкÑÑÑа
PGresultÑодеÑÐ¶Ð¸Ñ ÑолÑко Ð¾Ð´Ð½Ñ ÑезÑлÑÑиÑÑÑÑÑÑ ÑÑÑокÑ, возвÑаÑÑннÑÑ ÑекÑÑей командой. ÐÑÐ¾Ñ ÑÑаÑÑÑ Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо ÑолÑко Ñогда, когда Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ запÑоÑа бÑл вÑбÑан Ñежим поÑÑÑоÑного вÑвода (Ñм. Раздел 33.6).PGRES_PIPELINE_SYNC#PGresultпÑедÑÑавлÑÐµÑ ÑоÑÐºÑ ÑÐ¸Ð½Ñ ÑонизаÑии в конвейеÑном Ñежиме, запÑоÑеннÑÑPQpipelineSync. ÐÑÐ¾Ñ ÑÑаÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½, ÑолÑко еÑли вÑбÑан конвейеÑнÑй Ñежим.PGRES_PIPELINE_ABORTED#СÑÑÑкÑÑÑа
PGresultпÑедÑÑавлÑÐµÑ ÐºÐ¾Ð½Ð²ÐµÐ¹ÐµÑ, полÑÑивÑий оÑÐ¸Ð±ÐºÑ Ð¾Ñ ÑеÑвеÑа. ФÑнкÑиÑPQgetResultдолжна вÑзÑваÑÑÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑаÑно, и каждÑй Ñаз она бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´ ÑоÑÑоÑÐ½Ð¸Ñ Ð´Ð¾ конÑа ÑекÑÑего конвейеÑа, поÑле Ñего она веÑнÑÑPGRES_PIPELINE_SYNCи ÑÐ¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð¸ÑÑÑÑ Ð½Ð¾ÑмалÑÐ½Ð°Ñ Ð¾Ð±ÑабоÑка.
ÐÑли ÑÑаÑÑÑ ÑезÑлÑÑаÑа
PGRES_TUPLES_OKилиPGRES_SINGLE_TUPLE, Ñогда Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ ÑÑÑок, возвÑаÑÑннÑÑ Ð·Ð°Ð¿ÑоÑом, можно иÑполÑзоваÑÑ ÑÑнкÑии, опиÑаннÑе ниже. ÐбÑаÑиÑе внимание, ÑÑо командаSELECT, даже когда она не Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð½Ð¸ одной ÑÑÑоки, вÑÑ Ð¶Ðµ показÑваеÑPGRES_TUPLES_OK.PGRES_COMMAND_OKпÑедназнаÑен Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, коÑоÑÑе никогда не возвÑаÑаÑÑ ÑÑÑоки (INSERTилиUPDATEбез иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑедложениÑRETURNINGи дÑ.). ÐÑвеÑPGRES_EMPTY_QUERYÐ¼Ð¾Ð¶ÐµÑ ÑказÑваÑÑ Ð½Ð° налиÑие оÑибки в клиенÑÑком пÑогÑаммном обеÑпеÑении.РезÑлÑÑÐ°Ñ Ñо ÑÑаÑÑÑом
PGRES_NONFATAL_ERRORникогда не бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÑн напÑÑмÑÑ ÑÑнкÑиейPQexecили дÑÑгими ÑÑнкÑиÑми иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов; вмеÑÑо ÑÑого ÑезÑлÑÑаÑÑ Ñакого вида пеÑедаÑÑÑÑ Ð¾Ð±ÑабоÑÑÐ¸ÐºÑ Ñведомлений (Ñм. Раздел 33.13).PQresStatus#ÐÑеобÑазÑÐµÑ Ð·Ð½Ð°Ñение пеÑеÑиÑлимого Ñипа, возвÑаÑÑнное ÑÑнкÑией
PQresultStatus, в ÑÑÑоковÑÑ ÐºÐ¾Ð½ÑÑанÑÑ, опиÑÑваÑÑÑÑ ÐºÐ¾Ð´ ÑÑаÑÑÑа. ÐÑзÑваÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна оÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй ÑказаÑелÑ.char *PQresStatus(ExecStatusType status);
PQresultErrorMessage#ÐозвÑаÑÐ°ÐµÑ ÑообÑение об оÑибке, ÑвÑзанное Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹, или пÑÑÑÑÑ ÑÑÑокÑ, еÑли оÑибки не пÑоизоÑло.
char *PQresultErrorMessage(const PGresult *res);
ÐÑли пÑоизоÑла оÑибка, Ñо возвÑаÑÑÐ½Ð½Ð°Ñ ÑÑÑока бÑÐ´ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑий Ñимвол новой ÑÑÑоки. ÐÑзÑваÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна напÑÑмÑÑ Ð¾ÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй ÑказаÑелÑ. Ðна бÑÐ´ÐµÑ Ð¾Ñвобождена, когда ÑооÑвеÑÑÑвÑÑÑий ÑказаÑелÑ
PGresultбÑÐ´ÐµÑ Ð¿ÐµÑедан ÑÑнкÑииPQclear.ÐÑли непоÑÑедÑÑвенно поÑле вÑзова
PQexecилиPQgetResultвÑзваÑÑ ÑÑнкÑиÑPQerrorMessage(Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ подклÑÑениÑ), Ñо она возвÑаÑÐ¸Ñ ÑÑ Ð¶Ðµ ÑамÑÑ ÑÑÑокÑ, ÑÑо иPQresultErrorMessage(Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑезÑлÑÑаÑа). ÐднакоPGresultÑÐ¾Ñ ÑÐ°Ð½Ð¸Ñ ÑÐ²Ð¾Ñ ÑообÑение об оÑибке до ÑÐµÑ Ð¿Ð¾Ñ, пока не бÑÐ´ÐµÑ ÑниÑÑожен, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑообÑение об оÑибке, ÑвÑзанное Ñ Ð´Ð°Ð½Ð½Ñм подклÑÑением, бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ñи вÑполнении поÑледÑÑÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑий. ÐоÑполÑзÑйÑеÑÑ ÑÑнкÑиейPQresultErrorMessage, когда Ð²Ñ Ñ Ð¾ÑиÑе ÑзнаÑÑ ÑÑаÑÑÑ, ÑвÑзаннÑй Ñ ÐºÐ¾Ð½ÐºÑеÑной ÑÑÑÑкÑÑÑойPGresult; иÑполÑзÑйÑе ÑÑнкÑиÑPQerrorMessage, когда Ð²Ñ Ñ Ð¾ÑиÑе ÑзнаÑÑ ÑÑаÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñамой поÑледней опеÑаÑии на данном Ñоединении.PQresultVerboseErrorMessage#ÐозвÑаÑÐ°ÐµÑ Ð¿ÐµÑеÑоÑмаÑиÑованнÑÑ Ð²ÐµÑÑÐ¸Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке, ÑвÑзанного Ñ Ð¾Ð±ÑекÑом
PGresult.char *PQresultVerboseErrorMessage(const PGresult *res, PGVerbosity verbosity, PGContextVisibility show_context);РнекоÑоÑÑÑ ÑиÑÑаÑиÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ñ Ð¾ÑеÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð¾Ð»ÐµÐµ подÑобнÑÑ Ð²ÐµÑÑÐ¸Ñ Ñанее вÑданного ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке. ÐÑÑ Ð¿Ð¾ÑÑебноÑÑÑ ÑдовлеÑвоÑÑÐµÑ ÑÑнкÑиÑ
PQresultVerboseErrorMessage, ÑоÑмиÑÑÑ ÑообÑение, коÑоÑое бÑло Ð±Ñ Ð²Ñдано ÑÑнкÑиейPQresultErrorMessage, еÑли Ð±Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´ÐµÑализаÑии бÑл ÑекÑÑим Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸ÑPGresult. ÐÑли же вPGresultне ÑодеÑжиÑÑÑ Ð¾Ñибка, вмеÑÑо ÑÑого вÑдаÑÑÑÑ ÑообÑение «PGresult is not an error result» (PGresult â не ÑезÑлÑÑÐ°Ñ Ñ Ð¾Ñибкой). ÐозвÑаÑаемое ÑÑой ÑÑнкÑией ÑообÑение завеÑÑаеÑÑÑ Ð¿ÐµÑеводом ÑÑÑоки.РоÑлиÑие Ð¾Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð´ÑÑÐ³Ð¸Ñ ÑÑнкÑий, извлекаÑÑÐ¸Ñ Ð´Ð°Ð½Ð½Ñе из
PGresult, ÑезÑлÑÑÐ°Ñ ÑÑой ÑÑнкÑии â Ð½Ð¾Ð²Ð°Ñ ÑазмеÑÑÐ½Ð½Ð°Ñ Ð² памÑÑи ÑÑÑока. Ðогда ÑÑа ÑÑÑока бÑÐ´ÐµÑ Ð½Ðµ нÑжна, вÑзÑваÑÑий код должен оÑвободиÑÑ ÐµÑ Ð¼ÐµÑÑо, вÑзвавPQfreemem().ÐÑи Ð½ÐµÑ Ð²Ð°Ñке памÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑÑно NULL.
PQresultErrorField#ÐозвÑаÑÐ°ÐµÑ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑалÑное поле из оÑÑÑÑа об оÑибке.
char *PQresultErrorField(const PGresult *res, int fieldcode);
fieldcodeÑÑо иденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð»Ñ Ð¾Ñибки; Ñм. ÑимволиÑеÑкие конÑÑанÑÑ, пеÑеÑиÑленнÑе ниже. ÐÑлиPGresultне ÑодеÑÐ¶Ð¸Ñ Ð¾Ñибки или пÑедÑпÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ не вклÑÑÐ°ÐµÑ Ñказанное поле, Ñо возвÑаÑаеÑÑÑNULL. ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ обÑÑно не вклÑÑаÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑий Ñимвол новой ÑÑÑоки. ÐÑзÑваÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна напÑÑмÑÑ Ð¾ÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй ÑказаÑелÑ. Ðна бÑÐ´ÐµÑ Ð¾Ñвобождена, когда ÑооÑвеÑÑÑвÑÑÑий ÑказаÑелÑPGresultбÑÐ´ÐµÑ Ð¿ÐµÑедан ÑÑнкÑииPQclear.ÐоÑÑÑÐ¿Ð½Ñ ÑледÑÑÑие ÐºÐ¾Ð´Ñ Ð¿Ð¾Ð»ÐµÐ¹:
PG_DIAG_SEVERITY#СеÑÑÑзноÑÑÑ; поле Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ
ERROR,FATALилиPANIC(в ÑообÑении об оÑибке) либоWARNING,NOTICE,DEBUG,INFOилиLOG(в ÑообÑении-Ñведомлении) либо локализованнÑй пеÑевод одного из ÑÑÐ¸Ñ Ð·Ð½Ð°Ñений. ÐÑиÑÑÑÑÑвÑÐµÑ Ð²Ñегда.PG_DIAG_SEVERITY_NONLOCALIZED#СеÑÑÑзноÑÑÑ; поле Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ
ERROR,FATALилиPANIC(в ÑообÑении об оÑибке) либоWARNING,NOTICE,DEBUG,INFOилиLOG(в ÑообÑении-Ñведомлении). ÐÑо поле подобноPG_DIAG_SEVERITY, но его ÑодеÑжимое никогда не пеÑеводиÑÑÑ. ÐÑиÑÑÑÑÑвÑÐµÑ ÑолÑко в оÑÑÑÑÐ°Ñ , вÑдаваемÑÑ Postgres Pro веÑÑии 9.6 и новее.PG_DIAG_SQLSTATE#Ðод оÑибки в ÑооÑвеÑÑÑвии Ñ ÑоглаÑением о ÐºÐ¾Ð´Ð°Ñ SQLSTATE. Ðод SQLSTATE иденÑиÑиÑиÑÑÐµÑ Ñип ÑлÑÑивÑейÑÑ Ð¾Ñибки; он Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкими пÑиложениÑми, ÑÑÐ¾Ð±Ñ Ð²ÑполнÑÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑе опеÑаÑии (Ñакие, как обÑабоÑка оÑибок) в оÑÐ²ÐµÑ Ð½Ð° конкÑеÑнÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . СпиÑок возможнÑÑ ÐºÐ¾Ð´Ð¾Ð² SQLSTATE пÑиведÑн в ÐÑиложении A. ÐÑо поле не Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñии. Ðно вÑегда пÑиÑÑÑÑÑвÑеÑ.
PG_DIAG_MESSAGE_PRIMARY#Ðлавное ÑообÑение об оÑибке, пÑедназнаÑенное Ð´Ð»Ñ Ð¿ÑоÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелем. Ðак пÑавило ÑоÑÑавлÑÐµÑ Ð²Ñего Ð¾Ð´Ð½Ñ ÑÑÑокÑ. ÐÑо поле вÑегда пÑиÑÑÑÑÑвÑеÑ.
PG_DIAG_MESSAGE_DETAIL#ÐеобÑзаÑелÑное дополниÑелÑное ÑообÑение об оÑибке, пеÑедаÑÑее более деÑалÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ пÑоблеме. ÐÐ¾Ð¶ÐµÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð½ÐµÑколÑко ÑÑÑок.
PG_DIAG_MESSAGE_HINT#ÐодÑказка: необÑзаÑелÑное пÑедположение о Ñом, ÑÑо можно ÑделаÑÑ Ð² данной пÑоблемной ÑиÑÑаÑии. Ðно должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð´ÐµÑалÑной инÑоÑмаÑии в Ñом ÑмÑÑле, ÑÑо оно пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÑÐ¾Ð²ÐµÑ (возможно, и Ð½ÐµÐ¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий), а не пÑоÑÑо ÑакÑÑ. ÐÐ¾Ð¶ÐµÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð½ÐµÑколÑко ÑÑÑок.
PG_DIAG_STATEMENT_POSITION#СÑÑока, ÑодеÑжаÑÐ°Ñ Ð´ÐµÑÑÑиÑное Ñелое ÑиÑло, ÑказÑваÑÑее позиÑÐ¸Ñ ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñибки в каÑеÑÑве индекÑа в оÑигиналÑной ÑÑÑоке опеÑаÑоÑа. ÐеÑвÑй Ñимвол Ð¸Ð¼ÐµÐµÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ 1, пÑи ÑÑом позиÑии измеÑÑÑÑÑÑ Ð² ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°Ñ Ð° не в байÑÐ°Ñ .
PG_DIAG_INTERNAL_POSITION#ÐÑо поле опÑеделÑеÑÑÑ ÑоÑно Ñак же, как и поле
PG_DIAG_STATEMENT_POSITION, но оно иÑполÑзÑеÑÑÑ, когда позиÑÐ¸Ñ Ð¼ÐµÑÑÐ¾Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ñибки оÑноÑиÑÑÑ Ðº команде, ÑгенеÑиÑованной внÑÑÑенними модÑлÑми, а не к команде, пÑедÑÑавленной клиенÑом. Ðогда поÑвлÑеÑÑÑ ÑÑо поле, Ñо вÑегда поÑвлÑеÑÑÑ Ð¸ полеPG_DIAG_INTERNAL_QUERY.PG_DIAG_INTERNAL_QUERY#ТекÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, ÑгенеÑиÑованной внÑÑÑенними модÑлÑми, завеÑÑивÑейÑÑ Ñбоем. ÐÑо мог Ð±Ñ Ð±ÑÑÑ, напÑимеÑ, SQL-запÑоÑ, вÑданнÑй ÑÑнкÑией на ÑзÑке PL/pgSQL.
PG_DIAG_CONTEXT#ХаÑакÑеÑиÑÑика конÑекÑÑа, в коÑоÑом пÑоизоÑла оÑибка. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð½Ð° вклÑÑÐ°ÐµÑ Ð²Ñвод ÑÑека вÑзовов акÑивнÑÑ ÑÑнкÑий пÑоÑедÑÑного ÑзÑка и запÑоÑов, ÑгенеÑиÑованнÑÑ Ð²Ð½ÑÑÑенними модÑлÑми. СÑек вÑводиÑÑÑ Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑлеменÑÑ Ð² ÑÑÑоке, пÑи ÑÑом пеÑвÑм Ð¸Ð´ÐµÑ ÑамÑй поÑледний из ÑлеменÑов (ÑамÑй недавний вÑзов).
PG_DIAG_SCHEMA_NAME#ÐÑли оÑибка бÑла ÑвÑзана Ñ ÐºÐ¾Ð½ÐºÑеÑнÑм обÑекÑом Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , Ñо в ÑÑо поле бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñано Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ, ÑодеÑжаÑей даннÑй обÑекÑ.
PG_DIAG_TABLE_NAME#ÐÑли оÑибка бÑла ÑвÑзана Ñ ÐºÐ¾Ð½ÐºÑеÑной ÑаблиÑей, Ñо в ÑÑо поле бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñано Ð¸Ð¼Ñ ÑаблиÑÑ. (ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑÑ ÐµÐ¼Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаблиÑÑ Ð¾Ð±ÑаÑиÑеÑÑ Ðº полÑ, ÑодеÑжаÑÐµÐ¼Ñ Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ.)
PG_DIAG_COLUMN_NAME#ÐÑли оÑибка бÑла ÑвÑзана Ñ ÐºÐ¾Ð½ÐºÑеÑнÑм ÑÑолбÑом ÑаблиÑÑ, Ñо в ÑÑо поле бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñано Ð¸Ð¼Ñ ÑÑолбÑа. (ЧÑÐ¾Ð±Ñ Ð¸Ð´ÐµÐ½ÑиÑиÑиÑоваÑÑ ÑаблиÑÑ, обÑаÑиÑеÑÑ Ðº полÑм, ÑодеÑжаÑим имена ÑÑ ÐµÐ¼Ñ Ð¸ ÑаблиÑÑ.)
PG_DIAG_DATATYPE_NAME#ÐÑли оÑибка бÑла ÑвÑзана Ñ ÐºÐ¾Ð½ÐºÑеÑнÑм Ñипом даннÑÑ , Ñо в ÑÑо поле бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñано Ð¸Ð¼Ñ Ñипа даннÑÑ . (ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ, коÑоÑой пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÑÑÐ¾Ñ Ñип даннÑÑ , обÑаÑиÑеÑÑ Ðº полÑ, ÑодеÑжаÑÐµÐ¼Ñ Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ.)
PG_DIAG_CONSTRAINT_NAME#ÐÑли оÑибка бÑла ÑвÑзана Ñ ÐºÐ¾Ð½ÐºÑеÑнÑм огÑаниÑением, Ñо в ÑÑо поле бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñано Ð¸Ð¼Ñ Ð¾Ð³ÑаниÑениÑ. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð¼Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ домена, ÑвÑзаннÑÑ Ñ ÑÑим огÑаниÑением, обÑаÑиÑеÑÑ Ðº полÑм, пеÑеÑиÑленнÑм вÑÑе. (С ÑÑой ÑелÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº огÑаниÑениÑ, даже еÑли они и не бÑли ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑинÑакÑиÑа Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð³ÑаниÑений.)
PG_DIAG_SOURCE_FILE#ÐÐ¼Ñ Ñайла, ÑодеÑжаÑего позиÑÐ¸Ñ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ коде, Ð´Ð»Ñ ÐºÐ¾ÑоÑой бÑло вÑдано ÑообÑение об оÑибка.
PG_DIAG_SOURCE_LINE#ÐÐ¾Ð¼ÐµÑ ÑÑÑоки Ñой позиÑии в иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ коде, Ð´Ð»Ñ ÐºÐ¾ÑоÑой бÑло вÑдано ÑообÑение об оÑибке.
PG_DIAG_SOURCE_FUNCTION#ÐÐ¼Ñ ÑÑнкÑии в иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ коде, ÑообÑаÑÑей об оÑибке.
ÐÑимеÑание
ÐÐ¾Ð»Ñ Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑÑ ÐµÐ¼Ñ, имени ÑаблиÑÑ, имени ÑÑолбÑа, имени Ñипа даннÑÑ Ð¸ имени огÑаниÑÐµÐ½Ð¸Ñ Ð¿ÑедоÑÑавлÑÑÑÑÑ Ð»Ð¸ÑÑ Ð´Ð»Ñ Ð¾Ð³ÑаниÑенного ÑиÑла Ñипов оÑибок; Ñм. ÐÑиложение A. Ðе ÑаÑÑÑиÑÑвайÑе на Ñо, ÑÑо пÑиÑÑÑÑÑвие лÑбого из ÑÑÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ гаÑанÑиÑÑÐµÑ Ð¸ пÑиÑÑÑÑÑвие какого-Ñо дÑÑгого полÑ. ÐазовÑе иÑÑоÑники оÑибок пÑидеÑживаÑÑÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾ÑвÑзей, опиÑаннÑÑ Ð²ÑÑе, но ÑÑнкÑии, опÑеделÑннÑе полÑзоваÑелем, могÑÑ Ð¸ÑполÑзоваÑÑ ÑÑи Ð¿Ð¾Ð»Ñ Ð´ÑÑгими ÑпоÑобами. ÐналогиÑно, не ÑаÑÑÑиÑÑвайÑе на Ñо, ÑÑо ÑÑи Ð¿Ð¾Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑаÑÑ Ð¾Ð±ÑекÑÑ, ÑÑÑеÑÑвÑÑÑие в ÑекÑÑей базе даннÑÑ Ð² наÑÑоÑÑий моменÑ.
ÐÐ»Ð¸ÐµÐ½Ñ Ð¾ÑвеÑÐ°ÐµÑ Ð·Ð° ÑоÑмаÑиÑование оÑобÑажаемой инÑоÑмаÑии в ÑооÑвеÑÑÑвии Ñ ÐµÐ³Ð¾ нÑждами; в ÑаÑÑноÑÑи, он должен ÑазбиваÑÑ Ð´Ð»Ð¸Ð½Ð½Ñе ÑÑÑоки, как ÑÑебÑеÑÑÑ. Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑÑÑоки, вÑÑÑеÑаÑÑиеÑÑ Ð² полÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑабаÑÑваÑÑÑÑ, как ÑазÑÑÐ²Ñ Ð°Ð±Ð·Ð°Ñев, а не ÑÑÑок.
ÐÑибки, ÑгенеÑиÑованнÑе внÑÑÑенними модÑлÑми libpq, бÑдÑÑ Ð¸Ð¼ÐµÑÑ Ð¿Ð¾Ð»Ñ ÑеÑÑÑзноÑÑи оÑибки и оÑновного ÑообÑениÑ, но, как пÑавило, Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´ÑÑÐ³Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹.
ÐамеÑÑÑе, ÑÑо Ð¿Ð¾Ð»Ñ Ð¾Ñибки доÑÑÑÐ¿Ð½Ñ ÑолÑко из обÑекÑов
PGresult, а не из обÑекÑовPGconn. Ðе ÑÑÑеÑÑвÑÐµÑ ÑÑнкÑииPQerrorField.PQclear#ÐÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи, ÑвÑзаннÑÑ Ñ
PGresult. РезÑлÑÑÐ°Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¾ÑвобождÑн Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑPQclear, когда он болÑÑе не нÑжен.void PQclear(PGresult *res);
ÐÑли аÑгÑÐ¼ÐµÐ½Ñ ÑвлÑеÑÑÑ ÑказаÑелем
NULL, опеÑаÑÐ¸Ñ Ð½Ðµ вÑполнÑеÑÑÑ.ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑÐ¾Ñ ÑанÑÑÑ Ð¾Ð±ÑекÑ
PGresult, пока он вам нÑжен; он не иÑÑÐµÐ·Ð°ÐµÑ Ð½Ð¸ когда Ð²Ñ Ð²ÑдаÑÑе новÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, ни даже еÑли Ð²Ñ Ð·Ð°ÐºÑÑваеÑе Ñоединение. ЧÑÐ¾Ð±Ñ Ð¾Ñ Ð½ÐµÐ³Ð¾ избавиÑÑÑÑ, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑзваÑÑPQclear. ÐÑли ÑÑого не делаÑÑ, в ваÑем пÑиложении бÑдÑÑ Ð¸Ð¼ÐµÑÑ Ð¼ÐµÑÑо ÑÑеÑки памÑÑи.
33.3.2. ÐзвлеÑение инÑоÑмаÑии, ÑвÑзанной Ñ ÑезÑлÑÑаÑом запÑоÑа #
ÐÑи ÑÑнкÑии ÑлÑÐ¶Ð°Ñ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии из обÑекÑа PGresult, коÑоÑÑй пÑедÑÑавлÑÐµÑ ÑезÑлÑÑÐ°Ñ ÑÑпеÑного запÑоÑа (Ñо еÑÑÑ Ñакого, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ ÑÑаÑÑÑ PGRES_TUPLES_OK или PGRES_SINGLE_TUPLE). ÐÑ
Ñакже можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии об ÑÑпеÑной опеÑаÑии DESCRIBE: ÑезÑлÑÑÐ°Ñ ÑÑой опеÑаÑии ÑодеÑÐ¶Ð¸Ñ Ð²ÑÑ ÑÑ Ð¶Ðµ ÑамÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑÑолбÑаÑ
, коÑоÑÐ°Ñ Ð±Ñла Ð±Ñ Ð¿Ð¾Ð»ÑÑена пÑи ÑеалÑном иÑполнении запÑоÑа, но не ÑодеÑÐ¶Ð¸Ñ Ð½Ð¸ одной ÑÑÑоки. ÐÐ»Ñ Ð¾Ð±ÑекÑов, имеÑÑиÑ
дÑÑгие знаÑÐµÐ½Ð¸Ñ ÑÑаÑÑÑа, ÑÑи ÑÑнкÑии бÑдÑÑ Ð´ÐµÐ¹ÑÑвоваÑÑ Ñаким обÑазом, как бÑдÑо ÑезÑлÑÑÐ°Ñ Ð½Ðµ ÑодеÑÐ¶Ð¸Ñ Ð½Ð¸ одной ÑÑÑоки и ни одного ÑÑолбÑа.
PQntuples#ÐозвÑаÑÐ°ÐµÑ ÑиÑло ÑÑÑок (коÑÑежей) в полÑÑенной вÑбоÑке. (ÐамеÑÑÑе, ÑÑо обÑекÑÑ
PGresultне могÑÑ ÑодеÑжаÑÑ Ð±Ð¾Ð»ÐµÐµ ÑемINT_MAXÑÑÑок, Ñак ÑÑо Ð´Ð»Ñ ÑезÑлÑÑаÑа доÑÑаÑоÑно Ñипаint.)int PQntuples(const PGresult *res);
PQnfields#ÐозвÑаÑÐ°ÐµÑ ÑиÑло ÑÑолбÑов (полей) в каждой ÑÑÑоке полÑÑенной вÑбоÑки.
int PQnfields(const PGresult *res);
PQfname#ÐозвÑаÑÐ°ÐµÑ Ð¸Ð¼Ñ ÑÑолбÑа, ÑооÑвеÑÑÑвÑÑÑего Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð½Ð¾Ð¼ÐµÑÑ ÑÑолбÑа. ÐомеÑа ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0. ÐÑзÑваÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна напÑÑмÑÑ Ð¾ÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй ÑказаÑелÑ. Ðна бÑÐ´ÐµÑ Ð¾Ñвобождена, когда ÑооÑвеÑÑÑвÑÑÑий ÑказаÑÐµÐ»Ñ Ð½Ð°
PGresultбÑÐ´ÐµÑ Ð¿ÐµÑедан ÑÑнкÑииPQclear.char *PQfname(const PGresult *res, int column_number);ÐÑли Ð½Ð¾Ð¼ÐµÑ ÑÑолбÑа вÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ Ð´Ð¾Ð¿ÑÑÑимого диапазона, Ñо возвÑаÑаеÑÑÑ
NULL.PQfnumber#ÐозвÑаÑÐ°ÐµÑ Ð½Ð¾Ð¼ÐµÑ ÑÑолбÑа, ÑооÑвеÑÑÑвÑÑÑий Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑÑолбÑа.
int PQfnumber(const PGresult *res, const char *column_name);ÐÑли данное Ð¸Ð¼Ñ Ð½Ðµ ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ни одного из ÑÑолбÑов, Ñо возвÑаÑаеÑÑÑ -1.
Ðанное Ð¸Ð¼Ñ Ð¸Ð½ÑеÑпÑеÑиÑÑеÑÑÑ, как иденÑиÑикаÑÐ¾Ñ Ð² SQL-команде. ÐÑо ознаÑаеÑ, ÑÑо оно пеÑеводиÑÑÑ Ð² нижний ÑегиÑÑÑ, еÑли ÑолÑко оно не заклÑÑено в двойнÑе кавÑÑки. ÐапÑимеÑ, Ð´Ð»Ñ Ð²ÑбоÑки, ÑгенеÑиÑованной Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñакой SQL-командÑ:
SELECT 1 AS FOO, 2 AS "BAR";
Ð¼Ñ Ð¿Ð¾Ð»ÑÑили Ð±Ñ ÑледÑÑÑие ÑезÑлÑÑаÑÑ:
PQfname(res, 0) foo PQfname(res, 1) BAR PQfnumber(res, "FOO") 0 PQfnumber(res, "foo") 0 PQfnumber(res, "BAR") -1 PQfnumber(res, "\"BAR\"") 1
PQftable#ÐозвÑаÑÐ°ÐµÑ OID ÑаблиÑÑ, из коÑоÑой бÑл полÑÑен даннÑй ÑÑолбеÑ. ÐомеÑа ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0.
Oid PQftable(const PGresult *res, int column_number);Ð ÑледÑÑÑÐ¸Ñ ÑлÑÑаÑÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ
InvalidOid: еÑли Ð½Ð¾Ð¼ÐµÑ ÑÑолбÑа вÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ Ð´Ð¾Ð¿ÑÑÑимого диапазона; еÑли ÑказаннÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð¿ÑоÑÑой ÑÑÑлкой на ÑÑÐ¾Ð»Ð±ÐµÑ ÑаблиÑÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑделаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ðº ÑиÑÑемной ÑаблиÑеpg_class, ÑÑÐ¾Ð±Ñ ÑоÑно опÑеделиÑÑ, к какой ÑаблиÑе бÑло пÑоизведено обÑаÑение.Тип даннÑÑ
Oidи конÑÑанÑаInvalidOidбÑдÑÑ Ð¾Ð¿ÑеделенÑ, когда Ð²Ñ Ð²ÐºÐ»ÑÑиÑе заголовоÑнÑй Ñайл Ð´Ð»Ñ libpq. Ðни бÑдÑÑ Ð¿ÑинадлежаÑÑ Ðº Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· ÑелоÑиÑленнÑÑ Ñипов.PQftablecol#ÐозвÑаÑÐ°ÐµÑ Ð½Ð¾Ð¼ÐµÑ ÑÑолбÑа (в пÑÐµÐ´ÐµÐ»Ð°Ñ ÐµÐ³Ð¾ ÑаблиÑÑ) Ð´Ð»Ñ Ñказанного ÑÑолбÑа в полÑÑенной вÑбоÑке. ÐомеÑа ÑÑолбÑов в полÑÑенной вÑбоÑке наÑинаÑÑÑÑ Ñ 0, но ÑÑолбÑÑ Ð² ÑаблиÑе имеÑÑ Ð½ÐµÐ½ÑлевÑе номеÑа.
int PQftablecol(const PGresult *res, int column_number);Ð ÑледÑÑÑÐ¸Ñ ÑлÑÑаÑÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð½Ð¾Ð»Ñ: еÑли Ð½Ð¾Ð¼ÐµÑ ÑÑолбÑа вÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ Ð´Ð¾Ð¿ÑÑÑимого диапазона; еÑли ÑказаннÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð¿ÑоÑÑой ÑÑÑлкой на ÑÑÐ¾Ð»Ð±ÐµÑ ÑаблиÑÑ.
PQfformat#ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð´ ÑоÑмаÑа, показÑваÑÑий ÑоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑÑолбÑа. ÐомеÑа ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0.
int PQfformat(const PGresult *res, int column_number);ÐнаÑение кода ÑоÑмаÑа, Ñавное нÑлÑ, ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑекÑÑовое пÑедÑÑавление даннÑÑ , в Ñо вÑемÑ, как знаÑение, Ñавное единиÑе, ознаÑÐ°ÐµÑ Ð´Ð²Ð¾Ð¸Ñное пÑедÑÑавление. (ÐÑÑгие знаÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¾Ð² заÑезеÑвиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² бÑдÑÑем.)
PQftype#ÐозвÑаÑÐ°ÐµÑ Ñип даннÑÑ , ÑооÑвеÑÑÑвÑÑÑий Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð½Ð¾Ð¼ÐµÑÑ ÑÑолбÑа. ÐозвÑаÑаемое Ñелое знаÑение ÑвлÑеÑÑÑ Ð²Ð½ÑÑÑенним номеÑом OID Ð´Ð»Ñ ÑÑого Ñипа. ÐомеÑа ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0.
Oid PQftype(const PGresult *res, int column_number);ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑделаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ðº ÑиÑÑемной ÑаблиÑе
pg_type, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð¼ÐµÐ½Ð° и ÑвойÑÑва ÑазлиÑнÑÑ Ñипов даннÑÑ .PQfmod#ÐозвÑаÑÐ°ÐµÑ Ð¼Ð¾Ð´Ð¸ÑикаÑÐ¾Ñ Ñипа Ð´Ð»Ñ ÑÑолбÑа, ÑооÑвеÑÑÑвÑÑÑего Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð½Ð¾Ð¼ÐµÑÑ. ÐомеÑа ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0.
int PQfmod(const PGresult *res, int column_number);ÐнÑеÑпÑеÑаÑÐ¸Ñ Ð·Ð½Ð°Ñений модиÑикаÑоÑа завиÑÐ¸Ñ Ð¾Ñ Ñипа; они обÑÑно показÑваÑÑ ÑоÑноÑÑÑ Ð¸Ð»Ð¸ пÑеделÑнÑе ÑазмеÑÑ. ÐнаÑение -1 иÑполÑзÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ Â«Ð½ÐµÑ Ð´Ð¾ÑÑÑпной инÑоÑмаÑии». ÐолÑÑинÑÑво Ñипов даннÑÑ Ð½Ðµ иÑполÑзÑÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑоÑов, в Ñаком ÑлÑÑае знаÑение вÑегда бÑÐ´ÐµÑ -1.
PQfsize#ÐозвÑаÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ Ð² байÑÐ°Ñ Ð´Ð»Ñ ÑÑолбÑа, ÑооÑвеÑÑÑвÑÑÑего Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð½Ð¾Ð¼ÐµÑÑ. ÐомеÑа ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0.
int PQfsize(const PGresult *res, int column_number);PQfsizeвозвÑаÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¿ÑоÑÑÑанÑÑва, вÑделенного Ð´Ð»Ñ ÑÑого ÑÑолбÑа в ÑÑÑоке Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , дÑÑгими Ñловами, ÑÑо ÑÐ°Ð·Ð¼ÐµÑ Ð²Ð½ÑÑÑеннего пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑого Ñипа даннÑÑ Ð½Ð° ÑеÑвеÑе. (СледоваÑелÑно, ÑÑа инÑоÑмаÑÐ¸Ñ Ð½Ðµ ÑвлÑеÑÑÑ Ð¿Ð¾-наÑÑоÑÑÐµÐ¼Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹ Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñов.) ÐÑÑиÑаÑелÑное знаÑение говоÑÐ¸Ñ Ð¾ Ñом, ÑÑо Ñип даннÑÑ Ð¸Ð¼ÐµÐµÑ Ð¿ÐµÑеменнÑÑ Ð´Ð»Ð¸Ð½Ñ.PQbinaryTuples#ÐозвÑаÑÐ°ÐµÑ 1, еÑли
PGresultÑодеÑÐ¶Ð¸Ñ Ð´Ð²Ð¾Ð¸ÑнÑе даннÑе, или 0, еÑли даннÑе ÑекÑÑовÑе.int PQbinaryTuples(const PGresult *res);
ÐÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ ÑекомендÑеÑÑÑ Ðº иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ (за иÑклÑÑением пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑвÑзи Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
COPY), поÑколÑÐºÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶ÐµPGresultÐ¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð² некоÑоÑÑÑ ÑÑолбÑÐ°Ñ ÑекÑÑовÑе даннÑе, а в оÑÑалÑнÑÑ â двоиÑнÑе. ÐÑедпоÑÑиÑелÑнее иÑполÑзоваÑÑPQfformat.PQbinaryTuplesвозвÑаÑÐ°ÐµÑ 1, ÑолÑко еÑли вÑе ÑÑолбÑÑ Ð² вÑбоÑке ÑвлÑÑÑÑÑ Ð´Ð²Ð¾Ð¸ÑнÑми (код ÑоÑмаÑа 1).PQgetvalue#ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение одного Ð¿Ð¾Ð»Ñ Ð¸Ð· одной ÑÑÑоки, ÑодеÑжаÑейÑÑ Ð²
PGresult. ÐомеÑа ÑÑÑок и ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0. ÐÑзÑваÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна напÑÑмÑÑ Ð¾ÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй ÑказаÑелÑ. Ðна бÑÐ´ÐµÑ Ð¾Ñвобождена, когда ÑооÑвеÑÑÑвÑÑÑий ÑказаÑÐµÐ»Ñ Ð½Ð°PGresultбÑÐ´ÐµÑ Ð¿ÐµÑедан ÑÑнкÑииPQclear.char *PQgetvalue(const PGresult *res, int row_number, int column_number);ÐÐ»Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² ÑекÑÑовом ÑоÑмаÑе знаÑение, возвÑаÑаемое ÑÑнкÑией
PQgetvalue, ÑвлÑеÑÑÑ Ð·Ð½Ð°Ñением полÑ, пÑедÑÑавленнÑм в виде ÑимволÑной ÑÑÑоки Ñ Ð·Ð°Ð²ÐµÑÑаÑÑим нÑлевÑм Ñимволом. ÐÐ»Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² двоиÑном ÑоÑмаÑе иÑполÑзÑеÑÑÑ Ð´Ð²Ð¾Ð¸Ñное пÑедÑÑавление знаÑениÑ. Ðно опÑеделÑеÑÑÑ ÑÑнкÑиÑмиtypsendиtypreceiveÐ´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑного Ñипа даннÑÑ . (Ð ÑÑом ÑлÑÑае к знаÑÐµÐ½Ð¸Ñ Ñакже добавлÑеÑÑÑ Ð½Ñлевой байÑ, но обÑÑно ÑÑо не пÑиноÑÐ¸Ñ Ð¿Ð¾Ð»ÑзÑ, поÑколÑÐºÑ Ð²ÐµÑоÑÑно, ÑÑо знаÑение Ñже ÑодеÑÐ¶Ð¸Ñ Ð½ÑлевÑе байÑÑ.)ÐÑÑÑÐ°Ñ ÑÑÑока возвÑаÑаеÑÑÑ Ð² Ñом ÑлÑÑае, когда поле ÑодеÑÐ¶Ð¸Ñ null. ЧÑÐ¾Ð±Ñ Ð¾ÑлиÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ null Ð¾Ñ Ð¿ÑÑÑÑÑ ÑÑÑоковÑÑ Ð·Ð½Ð°Ñений, воÑполÑзÑйÑеÑÑ ÑÑнкÑией
PQgetisnull.УказаÑелÑ, возвÑаÑаемÑй ÑÑнкÑией
PQgetvalue, ÑказÑÐ²Ð°ÐµÑ Ð½Ð° облаÑÑÑ Ð¿Ð°Ð¼ÑÑи внÑÑÑи ÑÑÑÑкÑÑÑÑPGresult. ÐодиÑиÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе, на коÑоÑÑе ÑказÑÐ²Ð°ÐµÑ ÑÑÐ¾Ñ ÑказаÑелÑ, не ÑледÑеÑ. ÐмеÑÑо ÑÑого нÑжно Ñвно ÑкопиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе в дÑÑгÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи, еÑли пÑедполагаеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¸Ñ Ð·Ð° Ñамками жизненного Ñикла ÑÑÑÑкÑÑÑÑPGresult.PQgetisnull#ÐÑовеÑÑÐµÑ Ð¿Ð¾Ð»Ðµ на пÑÐµÐ´Ð¼ÐµÑ Ð¾ÑÑÑÑÑÑÐ²Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ (null). ÐомеÑа ÑÑÑок и ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0.
int PQgetisnull(const PGresult *res, int row_number, int column_number);ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ 1, еÑли знаÑение в поле оÑÑÑÑÑÑвÑÐµÑ (null), и 0, еÑли поле ÑодеÑÐ¶Ð¸Ñ Ð¾ÑлиÑное Ð¾Ñ null знаÑение. (ÐамеÑÑÑе, ÑÑо еÑли поле ÑодеÑÐ¶Ð¸Ñ null, ÑÑнкÑиÑ
PQgetvalueвозвÑаÑÐ°ÐµÑ Ð¿ÑÑÑÑÑ ÑÑÑокÑ, а не нÑлевой ÑказаÑелÑ.)PQgetlength#ÐозвÑаÑÐ°ÐµÑ ÑакÑиÑеÑкÑÑ Ð´Ð»Ð¸Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ Ð² байÑÐ°Ñ . ÐомеÑа ÑÑÑок и ÑÑолбÑов наÑинаÑÑÑÑ Ñ 0.
int PQgetlength(const PGresult *res, int row_number, int column_number);ÐÑо ÑакÑиÑеÑÐºÐ°Ñ Ð´Ð»Ð¸Ð½Ð° даннÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑного знаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , Ñо еÑÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð±ÑекÑа, на коÑоÑÑй ÑказÑваеÑ
PQgetvalue. ÐÐ»Ñ ÑекÑÑового ÑоÑмаÑа даннÑÑ ÑÑо Ñо же Ñамое, ÑÑоstrlen(). ÐÐ»Ñ Ð´Ð²Ð¾Ð¸Ñного же ÑоÑмаÑа ÑÑо ÑÑÑеÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ. УÑÑиÑе, ÑÑо пÑи ÑаÑÑÑÑе ÑакÑиÑеÑкого обÑÑма даннÑÑ Ð½Ðµ ÑледÑÐµÑ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑÑÑ Ð½Ð°PQfsize.PQnparams#ÐозвÑаÑÐ°ÐµÑ ÑиÑло паÑамеÑÑов подгоÑовленного опеÑаÑоÑа.
int PQnparams(const PGresult *res);
ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° ÑолÑко пÑи иÑÑледовании ÑезÑлÑÑаÑа ÑабоÑÑ ÑÑнкÑии
PQdescribePrepared. ÐÐ»Ñ Ð´ÑÑÐ³Ð¸Ñ Ñипов ÑезÑлÑÑаÑов она возвÑаÑÐ¸Ñ Ð½Ð¾Ð»Ñ.PQparamtype#ÐозвÑаÑÐ°ÐµÑ Ñип даннÑÑ Ð´Ð»Ñ Ñказанного паÑамеÑÑа опеÑаÑоÑа. ÐомеÑа паÑамеÑÑов наÑинаÑÑÑÑ Ñ 0.
Oid PQparamtype(const PGresult *res, int param_number);
ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° ÑолÑко пÑи иÑÑледовании ÑезÑлÑÑаÑа ÑабоÑÑ ÑÑнкÑии
PQdescribePrepared. ÐÐ»Ñ Ð´ÑÑÐ³Ð¸Ñ Ñипов ÑезÑлÑÑаÑов она возвÑаÑÐ¸Ñ Ð½Ð¾Ð»Ñ.PQprint#ÐÑÐ²Ð¾Ð´Ð¸Ñ Ð²Ñе ÑÑÑоки и, по вÑбоÑÑ, имена ÑÑолбÑов в ÑказаннÑй поÑок вÑвода.
void PQprint(FILE *fout, /* поÑок вÑвода */ const PGresult *res, const PQprintOpt *po); typedef struct { pqbool header; /* пеÑаÑаÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ полей и ÑÑÑÑÑик ÑÑÑок */ pqbool align; /* вÑÑавниваÑÑ Ð¿Ð¾Ð»Ñ */ pqbool standard; /* ÑÑаÑÑй ÑоÑÐ¼Ð°Ñ */ pqbool html3; /* вÑводиÑÑ HTML-ÑаблиÑÑ */ pqbool expanded; /* ÑаÑÑиÑÑÑÑ ÑаблиÑÑ */ pqbool pager; /* иÑполÑзоваÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ Ð¿Ð¾ÑÑÑаниÑного пÑоÑмоÑÑа, еÑли нÑжно */ char *fieldSep; /* ÑазделиÑÐµÐ»Ñ Ð¿Ð¾Ð»ÐµÐ¹ */ char *tableOpt; /* аÑÑибÑÑÑ Ð´Ð»Ñ HTML-ÑаблиÑÑ */ char *caption; /* заголовок HTML-ÑаблиÑÑ */ char **fieldName; /* маÑÑив замениÑелей Ð´Ð»Ñ Ð¸Ð¼Ñн полей, завеÑÑаÑÑийÑÑ Ð½ÑлевÑм Ñимволом */ } PQprintOpt;ÐÑÑ ÑÑнкÑÐ¸Ñ Ð¿Ñежде иÑполÑзовала ÑÑилиÑа psql Ð´Ð»Ñ Ð²Ñвода ÑезÑлÑÑаÑов запÑоÑа, но болÑÑе она ÐµÑ Ð½Ðµ иÑполÑзÑеÑ. ÐбÑаÑиÑе внимание, пÑедполагаеÑÑÑ, ÑÑо вÑе даннÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² ÑекÑÑовом ÑоÑмаÑе.
33.3.3. ÐолÑÑение дÑÑгой инÑоÑмаÑии о ÑезÑлÑÑаÑе #
ÐÑи ÑÑнкÑии иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾ÑÑалÑной инÑоÑмаÑии из обÑекÑов PGresult.
PQcmdStatus#ÐозвÑаÑÐ°ÐµÑ Ð´ÐµÑкÑипÑÐ¾Ñ ÑÑаÑÑÑа Ð´Ð»Ñ SQL-командÑ, коÑоÑÐ°Ñ ÑгенеÑиÑовала
PGresult.char *PQcmdStatus(PGresult *res);
Ðак пÑавило, ÑÑо пÑоÑÑо Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, но могÑÑ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ñ Ð¸ дополниÑелÑнÑе ÑведениÑ, Ñакие, как ÑиÑло обÑабоÑаннÑÑ ÑÑÑок. ÐÑзÑваÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна напÑÑмÑÑ Ð¾ÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй ÑказаÑелÑ. Ðна бÑÐ´ÐµÑ Ð¾Ñвобождена, когда ÑооÑвеÑÑÑвÑÑÑий ÑказаÑÐµÐ»Ñ Ð½Ð°
PGresultбÑÐ´ÐµÑ Ð¿ÐµÑедан ÑÑнкÑииPQclear.PQcmdTuples#ÐозвÑаÑÐ°ÐµÑ ÑиÑло ÑÑÑок, коÑоÑÑе заÑÑонÑла SQL-команда.
char *PQcmdTuples(PGresult *res);
ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑÑÑоковое знаÑение, ÑодеÑжаÑее ÑиÑло ÑÑÑок, коÑоÑÑе заÑÑонÑл SQL-опеÑаÑоÑ, ÑгенеÑиÑовавÑий даннÑй
PGresult. ÐÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ ÑолÑко ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´SELECT,CREATE TABLE AS,INSERT,UPDATE,DELETE,MERGE,MOVE,FETCHилиCOPY, а Ñакже поÑле опеÑаÑоÑаEXECUTE, вÑполнивÑего подгоÑовленнÑй запÑоÑ, ÑодеÑжаÑий командÑINSERT,UPDATE,DELETEилиMERGE. ÐÑли команда, коÑоÑÐ°Ñ ÑгенеÑиÑовалаPGresult, бÑла какой-Ñо иной, ÑоPQcmdTuplesвозвÑаÑÐ°ÐµÑ Ð¿ÑÑÑÑÑ ÑÑÑокÑ. ÐÑзÑваÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна напÑÑмÑÑ Ð¾ÑвобождаÑÑ Ð¿Ð°Ð¼ÑÑÑ, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй ÑказаÑелÑ. Ðна бÑÐ´ÐµÑ Ð¾Ñвобождена, когда ÑооÑвеÑÑÑвÑÑÑий ÑказаÑÐµÐ»Ñ Ð½Ð°PGresultбÑÐ´ÐµÑ Ð¿ÐµÑедан ÑÑнкÑииPQclear.PQoidValue#ÐозвÑаÑÐ°ÐµÑ OID вÑÑавленной ÑÑÑоки, еÑли SQL-команда бÑла командой
INSERT, коÑоÑÐ°Ñ Ð²ÑÑавила Ñовно Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð² ÑаблиÑÑ, имеÑÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ OID, или командойEXECUTE, коÑоÑÐ°Ñ Ð²Ñполнила подгоÑовленнÑй запÑоÑ, ÑодеÑжаÑий ÑооÑвеÑÑÑвÑÑÑий опеÑаÑоÑINSERT. РпÑоÑивном ÑлÑÑае ÑÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑInvalidOid. ÐÑа ÑÑнкÑÐ¸Ñ Ñакже возвÑаÑиÑInvalidOid, еÑли ÑаблиÑа, заÑÑонÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹INSERT, не ÑодеÑÐ¶Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов OID.Oid PQoidValue(const PGresult *res);
PQoidStatus#ÐÑа ÑÑнкÑÐ¸Ñ ÑÑиÑаеÑÑÑ Ð½Ðµ ÑекомендÑемой к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ (в каÑеÑÑве Ð·Ð°Ð¼ÐµÐ½Ñ ÑлÑжиÑ
PQoidValue), а Ñакже она не ÑвлÑеÑÑÑ Ð¿Ð¾ÑокобезопаÑной. Ðна возвÑаÑÐ°ÐµÑ ÑÑÑоковое знаÑение, ÑодеÑжаÑее OID вÑÑавленной ÑÑÑоки, в Ñо вÑÐµÐ¼Ñ ÐºÐ°ÐºPQoidValueвозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение OID.char *PQoidStatus(const PGresult *res);
33.3.4. ÐкÑаниÑование ÑÑÑоковÑÑ Ð·Ð½Ð°Ñений Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð² SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ #
PQescapeLiteral#char *PQescapeLiteral(PGconn *conn, const char *str, size_t length);
PQescapeLiteralÑкÑаниÑÑÐµÑ ÑÑÑоковое знаÑение Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑи SQL-командÑ. ÐÑо полезно пÑи вÑÑавке в SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð·Ð½Ð°Ñений даннÑÑ Ð² виде ÑÑÑоковÑÑ ÐºÐ¾Ð½ÑÑанÑ. ÐпÑеделÑннÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ (напÑимеÑ, кавÑÑки и обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа) Ð´Ð¾Ð»Ð¶Ð½Ñ ÑкÑаниÑоваÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿ÑедоÑвÑаÑиÑÑ Ð¸Ñ ÑпеÑиалÑнÑÑ Ð¸Ð½ÑеÑпÑеÑаÑÐ¸Ñ ÑинÑакÑиÑеÑким анализаÑоÑом ÑзÑка SQL. ÐÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð²ÑполнÑеÑPQescapeLiteral.PQescapeLiteralвозвÑаÑÐ°ÐµÑ ÑкÑаниÑованнÑÑ Ð²ÐµÑÑÐ¸Ñ Ð¿Ð°ÑамеÑÑаstr, ÑазмеÑÑннÑÑ Ð² облаÑÑи памÑÑи, ÑаÑпÑеделÑнной Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑииmalloc(). ÐÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð½Ñжно оÑвобождаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑииPQfreemem(), когда возвÑаÑÑнное знаÑение болÑÑе не ÑÑебÑеÑÑÑ. ÐавеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ð½Ðµ нÑжен и не должен ÑÑиÑÑваÑÑÑÑ Ð² паÑамеÑÑеlength. (ÐÑли завеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ð±Ñл найден до Ñого, как бÑли обÑабоÑанÑlengthбайÑ, ÑоPQescapeLiteralоÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑабоÑÑ Ð½Ð° нÑлевом байÑе; Ñаким обÑазом, поведение ÑÑнкÑии напоминаеÑstrncpy.) РвозвÑаÑÑнной ÑÑÑоке вÑе ÑпеÑиалÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ñаким обÑазом, ÑÑо ÑинÑакÑиÑеÑкий анализаÑÐ¾Ñ ÑÑÑоковÑÑ Ð»Ð¸ÑеÑалов Postgres Pro Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабоÑаÑÑ Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом. Ð ÑÑÑÐ¾ÐºÑ Ñакже добавлÑеÑÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑий нÑлевой байÑ. ÐдинаÑнÑе кавÑÑки, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÐºÑÑжаÑÑ ÑÑÑоковÑе лиÑеÑÐ°Ð»Ñ Postgres Pro, вклÑÑаÑÑÑÑ Ð² ÑезÑлÑÑиÑÑÑÑÑÑ ÑÑÑокÑ.Ð ÑлÑÑае оÑибки
PQescapeLiteralвозвÑаÑаеÑNULL, и в обÑекÑconnпомеÑаеÑÑÑ ÑооÑвеÑÑÑвÑÑÑее ÑообÑение.ÐодÑказка
ÐÑобенно важно вÑполнÑÑÑ Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñее ÑкÑаниÑование пÑи обÑабоÑке ÑÑÑок, полÑÑеннÑÑ Ð¸Ð· ненадÑжнÑÑ Ð¸ÑÑоÑников. РпÑоÑивном ÑлÑÑае ваÑа безопаÑноÑÑÑ Ð¿Ð¾Ð´Ð²ÐµÑгаеÑÑÑ ÑиÑÐºÑ Ð¸Ð·-за ÑÑзвимоÑÑи в оÑноÑении аÑак Ñ Ð¸ÑполÑзованием «SQL-инÑекÑий», Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑÑÑ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑнÑе SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½Ð°Ð¿ÑавлÑÑÑÑÑ Ð² ваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐбÑаÑиÑе внимание, ÑÑо Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи (и ÑÑо бÑÐ´ÐµÑ Ð´Ð°Ð¶Ðµ некоÑÑекÑно) ÑкÑаниÑоваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , пеÑедаваемÑÑ Ð² виде оÑделÑнÑÑ Ð¿Ð°ÑамеÑÑов в ÑÑнкÑиÑ
PQexecParamsили ÑодÑÑвеннÑе ей ÑÑнкÑии.PQescapeIdentifier#char *PQescapeIdentifier(PGconn *conn, const char *str, size_t length);
PQescapeIdentifierÑкÑаниÑÑÐµÑ ÑÑÑокÑ, пÑедназнаÑеннÑÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² каÑеÑÑве иденÑиÑикаÑоÑа SQL, напÑÐ¸Ð¼ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸ ÑаблиÑÑ, ÑÑолбÑа или ÑÑнкÑии. ÐÑо полезно, когда иденÑиÑикаÑоÑ, вÑбÑаннÑй полÑзоваÑелем, Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑпеÑиалÑнÑе ÑимволÑ, коÑоÑÑе в пÑоÑивном ÑлÑÑае не инÑеÑпÑеÑиÑовалиÑÑ Ð±Ñ ÑинÑакÑиÑеÑким анализаÑоÑом SQL, как ÑаÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑа, или когда иденÑиÑикаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ ÑегиÑÑÑа и ÑÑÐ¾Ñ ÑегиÑÑÑ ÑÑебÑеÑÑÑ ÑÐ¾Ñ ÑаниÑÑ.PQescapeIdentifierвозвÑаÑÐ°ÐµÑ Ð²ÐµÑÑÐ¸Ñ Ð¿Ð°ÑамеÑÑаstr, ÑкÑаниÑованнÑÑ ÐºÐ°Ðº SQL-иденÑиÑикаÑоÑ, и ÑазмеÑÑннÑÑ Ð² облаÑÑи памÑÑи, ÑаÑпÑеделÑнной Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑииmalloc(). ÐÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð½Ñжно оÑвобождаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑииPQfreemem(), когда возвÑаÑÑнное знаÑение болÑÑе не ÑÑебÑеÑÑÑ. ÐавеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ð½Ðµ нÑжен и не должен ÑÑиÑÑваÑÑÑÑ Ð² паÑамеÑÑеlength. (ÐÑли завеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ð±Ñл найден до Ñого, как бÑли обÑабоÑанÑlengthбайÑ, ÑоPQescapeIdentifierоÑÑанавливаеÑÑÑ Ð½Ð° нÑлевом байÑе; Ñаким обÑазом, поведение ÑÑнкÑии напоминаеÑstrncpy.) РвозвÑаÑÑнной ÑÑÑоке вÑе ÑпеÑиалÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ñаким обÑазом, ÑÑо она бÑÐ´ÐµÑ Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñим обÑазом обÑабоÑана, как SQL-иденÑиÑикаÑоÑ. ÐавеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ñакже бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½. ÐозвÑаÑÑÐ½Ð½Ð°Ñ ÑÑÑока Ñакже бÑÐ´ÐµÑ Ð·Ð°ÐºÐ»ÑÑена в двойнÑе кавÑÑки.Ð ÑлÑÑае оÑибки
PQescapeIdentifierвозвÑаÑаеÑNULL, и в обÑекÑconnпомеÑаеÑÑÑ ÑооÑвеÑÑÑвÑÑÑее ÑообÑение.ÐодÑказка
Ðак и в ÑлÑÑае Ñо ÑÑÑоковÑми лиÑеÑалами, Ð´Ð»Ñ Ñого ÑÑÐ¾Ð±Ñ Ð¿ÑедоÑвÑаÑиÑÑ Ð°Ñаки Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ SQL-инÑекÑий, SQL-иденÑиÑикаÑоÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑкÑаниÑоваÑÑÑÑ, когда они полÑÑÐµÐ½Ñ Ð¸Ð· ненадÑжного иÑÑоÑника.
PQescapeStringConn#size_t PQescapeStringConn(PGconn *conn, char *to, const char *from, size_t length, int *error);PQescapeStringConnÑкÑаниÑÑÐµÑ ÑÑÑоковÑе лиÑеÑÐ°Ð»Ñ Ð½Ð°Ð¿Ð¾Ð´Ð¾Ð±Ð¸ÐµPQescapeLiteral. Ðо, в оÑлиÑие оÑPQescapeLiteral, за пÑедоÑÑавление бÑÑеÑа надлежаÑего ÑазмеÑа оÑвеÑÐ°ÐµÑ Ð²ÑзÑваÑÑÐ°Ñ ÑÑнкÑиÑ. Ðолее Ñого,PQescapeStringConnне добавлÑÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÑнÑе кавÑÑки, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÐºÑÑжаÑÑ ÑÑÑоковÑе лиÑеÑÐ°Ð»Ñ Postgres Pro; они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ñ Ð² SQL-командÑ, в коÑоÑÑÑ Ð²ÑÑавлÑеÑÑÑ ÑезÑлÑÑиÑÑÑÑÐ°Ñ ÑÑÑока. ÐаÑамеÑÑfromÑказÑÐ²Ð°ÐµÑ Ð½Ð° пеÑвÑй Ñимвол ÑÑÑоки, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑкÑаниÑоваÑÑÑÑ, а паÑамеÑÑlengthзадаÑÑ ÑиÑло Ð±Ð°Ð¹Ñ Ð² ÑÑой ÑÑÑоке. ÐавеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ð½Ðµ ÑÑебÑеÑÑÑ Ð¸ не должен ÑÑиÑÑваÑÑÑÑ Ð² паÑамеÑÑеlength. (ÐÑли завеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ð±Ñл найден до Ñого, как бÑли обÑабоÑанÑlengthбайÑ, ÑоPQescapeStringConnоÑÑанавливаеÑÑÑ Ð½Ð° нÑлевом байÑе; Ñаким обÑазом, поведение ÑÑнкÑии напоминаеÑstrncpy.) ÐаÑамеÑÑtoдолжен ÑказÑваÑÑ Ð½Ð° бÑÑеÑ, коÑоÑÑй ÑÐ¼Ð¾Ð¶ÐµÑ Ð²Ð¼ÐµÑÑиÑÑ ÐºÐ°Ðº минимÑм на один Ð±Ð°Ð¹Ñ Ð±Ð¾Ð»ÑÑе, Ñем пÑедпиÑÑÐ²Ð°ÐµÑ Ñдвоенное знаÑение паÑамеÑÑаlength, в пÑоÑивном ÑлÑÑае поведение ÑÑнкÑии не опÑеделено. Ðоведение бÑÐ´ÐµÑ Ñакже не опÑеделено, еÑли ÑÑÑокиtoиfromпеÑекÑÑваÑÑÑÑ.ÐÑли паÑамеÑÑ
errorне ÑавенNULL, Ñогда знаÑение*errorÑÑÑанавливаеÑÑÑ ÑавнÑм нÑÐ»Ñ Ð² ÑлÑÑае ÑÑпеÑной ÑабоÑÑ Ð¸ не ÑавнÑм нÑÐ»Ñ Ð² ÑлÑÑае оÑибки. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑм возможнÑм ÑÑловием Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾Ñибки ÑвлÑеÑÑÑ Ð½ÐµÐ²ÐµÑÐ½Ð°Ñ Ð¼ÑлÑÑибайÑÐ¾Ð²Ð°Ñ ÐºÐ¾Ð´Ð¸Ñовка в иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоке. ÐÑÑ Ð¾Ð´Ð½Ð°Ñ ÑÑÑока ÑоÑмиÑÑеÑÑÑ Ð´Ð°Ð¶Ðµ пÑи налиÑии оÑибки, но можно ожидаÑÑ, ÑÑо ÑеÑÐ²ÐµÑ Ð¾ÑвеÑÐ³Ð½ÐµÑ ÐµÑ ÐºÐ°Ðº невеÑно ÑÑоÑмиÑованнÑÑ. Ð ÑлÑÑае оÑибки в обÑекÑconnзапиÑÑваеÑÑÑ ÑооÑвеÑÑÑвÑÑÑее ÑообÑение незавиÑимо Ð¾Ñ Ñого, Ñавно лиNULLзнаÑение паÑамеÑÑаerror.PQescapeStringConnвозвÑаÑÐ°ÐµÑ ÑиÑло байÑ, запиÑаннÑÑ Ð¿Ð¾ адÑеÑÑto, не вклÑÑÐ°Ñ Ð·Ð°Ð²ÐµÑÑаÑÑий нÑлевой байÑ.PQescapeString#PQescapeStringÑвлÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑÑаÑой, не Ñекомендованной к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑией ÑÑнкÑииPQescapeStringConn.size_t PQescapeString (char *to, const char *from, size_t length);
ÐдинÑÑвенное оÑлиÑие оÑ
PQescapeStringConnÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ñ ÑÑнкÑииPQescapeStringÐ½ÐµÑ Ð¿Ð°ÑамеÑÑовPGconnиerror. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð° не Ð¼Ð¾Ð¶ÐµÑ ÑкоÑÑекÑиÑоваÑÑ ÑÐ²Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ в завиÑимоÑÑи Ð¾Ñ ÑвойÑÑв подклÑÑÐµÐ½Ð¸Ñ (ÑÐ°ÐºÐ¸Ñ , как кодиÑовка Ñимволов) и, ÑледоваÑелÑно, она Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð½ÐµÐ²ÐµÑнÑе ÑезÑлÑÑаÑÑ. Также она не Ð¸Ð¼ÐµÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи ÑообÑиÑÑ Ð¾Ð± оÑÐ¸Ð±ÐºÐ°Ñ .PQescapeStringÐ¼Ð¾Ð¶ÐµÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно иÑполÑзоваÑÑÑÑ Ð² клиенÑÑÐºÐ¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ð°Ñ , коÑоÑÑе ÑабоÑаÑÑ Ð»Ð¸ÑÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ подклÑÑением к Postgres Pro за один Ñаз (в ÑÑом ÑлÑÑае ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ð¹Ñи Ñо, ÑÑо ей нÑжно знаÑÑ, «за кÑлиÑами»). РдÑÑÐ³Ð¸Ñ ÐºÐ¾Ð½ÑекÑÑÐ°Ñ ÐµÑ Ð¸ÑполÑзование неÑÑÑ ÑгÑÐ¾Ð·Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи и его ÑледÑÐµÑ Ð¸Ð·Ð±ÐµÐ³Ð°ÑÑ Ð² полÑÐ·Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑнкÑииPQescapeStringConn.PQescapeByteaConn#ÐкÑаниÑÑÐµÑ Ð´Ð²Ð¾Ð¸ÑнÑе даннÑе Ð´Ð»Ñ Ð¸Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑи SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ñ Ñипом даннÑÑ
bytea. Ðак и в ÑлÑÑае ÑPQescapeStringConn, ÑÑа ÑÑнкÑÐ¸Ñ Ð¿ÑименÑеÑÑÑ ÑолÑко Ñогда, когда даннÑе вÑÑавлÑÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в ÑÑÑÐ¾ÐºÑ SQL-командÑ.unsigned char *PQescapeByteaConn(PGconn *conn, const unsigned char *from, size_t from_length, size_t *to_length);ÐайÑÑ, имеÑÑие опÑеделÑннÑе знаÑениÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑкÑаниÑоваÑÑÑÑ, когда они иÑполÑзÑÑÑÑÑ Ð²Ð½ÑÑÑи лиÑеÑала, имеÑÑего Ñип
bytea, в SQL-опеÑаÑоÑе.PQescapeByteaConnÑкÑаниÑÑÐµÑ Ð±Ð°Ð¹ÑÑ, иÑполÑзÑÑ Ð»Ð¸Ð±Ð¾ hex-кодиÑование, либо ÑкÑаниÑование Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð±ÑаÑной коÑой ÑеÑÑÑ. См. Раздел 8.4 Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии.ÐаÑамеÑÑ
fromÑказÑÐ²Ð°ÐµÑ Ð½Ð° пеÑвÑй Ð±Ð°Ð¹Ñ ÑÑÑоки, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑкÑаниÑоваÑÑÑÑ, а паÑамеÑÑfrom_lengthзадаÑÑ ÑиÑло Ð±Ð°Ð¹Ñ Ð² ÑÑой двоиÑной ÑÑÑоке. (ÐавеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ð½Ðµ нÑжен и не ÑÑиÑÑваеÑÑÑ.) ÐаÑамеÑÑto_lengthÑказÑÐ²Ð°ÐµÑ Ð½Ð° пеÑеменнÑÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð´Ð»Ð¸Ð½Ñ ÑезÑлÑÑиÑÑÑÑей ÑкÑаниÑованной ÑÑÑоки. ÐÑа длина вклÑÑÐ°ÐµÑ Ð·Ð°Ð²ÐµÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ ÑезÑлÑÑиÑÑÑÑей ÑÑÑоки.PQescapeByteaConnвозвÑаÑÐ°ÐµÑ ÑкÑаниÑованнÑÑ Ð²ÐµÑÑÐ¸Ñ Ð´Ð²Ð¾Ð¸Ñной ÑÑÑоки, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð¿Ð°ÑамеÑÑfrom, и ÑазмеÑÐ°ÐµÑ ÐµÑ Ð² памÑÑи, ÑаÑпÑеделÑнной Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑmalloc(). ÐÑа памÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð¾Ñвобождена Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑииPQfreemem(), когда ÑезÑлÑÑиÑÑÑÑÐ°Ñ ÑÑÑока болÑÑе не нÑжна. РвозвÑаÑаемой ÑÑÑоке вÑе ÑпеÑиалÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ñак, ÑÑÐ¾Ð±Ñ ÑинÑакÑиÑеÑкий анализаÑÐ¾Ñ Ð»Ð¸ÑеÑалÑнÑÑ ÑÑÑок Postgres Pro и ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° Ð´Ð»Ñ Ñипаbyteaмогли обÑабоÑаÑÑ Ð¸Ñ Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñим обÑазом. ÐавеÑÑаÑÑий нÑлевой Ð±Ð°Ð¹Ñ Ñакже добавлÑеÑÑÑ. ÐдинаÑнÑе кавÑÑки, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÐºÑÑжаÑÑ ÑÑÑоковÑе лиÑеÑÐ°Ð»Ñ Postgres Pro, не ÑвлÑÑÑÑÑ ÑаÑÑÑÑ ÑезÑлÑÑиÑÑÑÑей ÑÑÑоки.Ð ÑлÑÑае оÑибки возвÑаÑаеÑÑÑ Ð½Ñлевой ÑказаÑелÑ, и ÑооÑвеÑÑÑвÑÑÑее ÑообÑение об оÑибке запиÑÑваеÑÑÑ Ð² обÑекÑ
conn. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÐµÐ´Ð¸Ð½ÑÑвенной возможной оÑибкой Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑ Ð²Ð°Ñка памÑÑи Ð´Ð»Ñ ÑезÑлÑÑиÑÑÑÑей ÑÑÑоки.PQescapeBytea#PQescapeByteaÑвлÑеÑÑÑ ÑÑÑаÑевÑей и не ÑекомендÑемой к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑией ÑÑнкÑииPQescapeByteaConn.unsigned char *PQescapeBytea(const unsigned char *from, size_t from_length, size_t *to_length);ÐдинÑÑвенное оÑлиÑие оÑ
PQescapeByteaConnÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ñ ÑÑнкÑииPQescapeByteaÐ½ÐµÑ Ð¿Ð°ÑамеÑÑаPGconn. ÐоÑÑомÑPQescapeByteaÐ¼Ð¾Ð¶ÐµÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно иÑполÑзоваÑÑÑÑ Ð² клиенÑÑÐºÐ¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ð°Ñ , коÑоÑÑе ÑабоÑаÑÑ Ð»Ð¸ÑÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ подклÑÑением к Postgres Pro в один Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени (в ÑÑом ÑлÑÑае ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ ÑзнаÑÑ Ñо, ÑÑо ей нÑжно, «за кÑлиÑами»). Ðна Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð½ÐµÐ²ÐµÑнÑе ÑезÑлÑÑаÑÑ Ð¿Ñи иÑполÑзовании в пÑогÑÐ°Ð¼Ð¼Ð°Ñ , коÑоÑÑе ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð½ÐµÑколÑко подклÑÑений к базам даннÑÑ (в ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ Ð¸ÑполÑзÑйÑеPQescapeByteaConn).PQunescapeBytea#ÐÑеобÑазÑÐµÑ ÑÑÑоковое пÑедÑÑавление двоиÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð² двоиÑнÑе даннÑе â ÑвлÑеÑÑÑ Ð¾Ð±ÑаÑной ÑÑнкÑией к ÑÑнкÑии
PQescapeBytea. Ðна нÑжна, когда даннÑе ÑипаbyteaизвлекаÑÑÑÑ Ð² ÑекÑÑовом ÑоÑмаÑе, но не когда они извлекаÑÑÑÑ Ð² двоиÑном ÑоÑмаÑе.unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);
ÐаÑамеÑÑ
fromÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑÑÑокÑ, ÑакÑÑ, какÑÑ Ð¼Ð¾Ð³Ð»Ð° Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑиÑÑ ÑÑнкÑиÑPQgetvalue, пÑименÑÐ½Ð½Ð°Ñ Ðº ÑÑолбÑÑ Ñипаbytea.PQunescapeByteaпÑеобÑазÑÐµÑ ÑÑо ÑÑÑоковое пÑедÑÑавление в его двоиÑное пÑедÑÑавление. Ðна возвÑаÑÐ°ÐµÑ ÑказаÑÐµÐ»Ñ Ð½Ð° бÑÑеÑ, вÑделеннÑй ÑÑнкÑиейmalloc(), илиNULLв ÑлÑÑае оÑибки и помеÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ Ð±ÑÑеÑа по адÑеÑÑto_length. Ðогда ÑезÑлÑÑÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð½Ñжен, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ оÑвободиÑÑ ÐµÐ³Ð¾ памÑÑÑ, вÑзвавPQfreemem.ÐÑо пÑеобÑазование не ÑвлÑеÑÑÑ ÑоÑной инвеÑÑией длÑ
PQescapeBytea, поÑколÑÐºÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑÑÑ, ÑÑо ÑÑÑока, полÑÑÐµÐ½Ð½Ð°Ñ Ð¾ÑPQgetvalue, не бÑÐ´ÐµÑ Â«ÑкÑаниÑованной». Ð ÑаÑÑноÑÑи, ÑÑо ознаÑаеÑ, ÑÑо ÑÑиÑÑваÑÑ Ñежим ÑпеÑпоÑледоваÑелÑноÑÑей не нÑжно, и поÑÑÐ¾Ð¼Ñ Ð² паÑамеÑÑеPGconnÐ½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи.