30.11. ФÑнкÑии Ñазного назнаÑениÑ
Ðак вÑегда, Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ ÑÑнкÑии, коÑоÑÑе не попадаÑÑ Ð½Ð¸ в Ð¾Ð´Ð½Ñ Ð¸Ð· каÑегоÑий.
-
PQfreemem ÐÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð¿Ð°Ð¼ÑÑÑ, коÑоÑÑÑ Ð²Ñделила libpq.
void PQfreemem(void *ptr);
ÐÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð¿Ð°Ð¼ÑÑÑ, вÑделеннÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой libpq, а именно ÑÑнкÑиÑми
PQescapeByteaConn,PQescapeBytea,PQunescapeByteaиPQnotifies. ÐÑобенно важно иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑÑÑ ÑÑнкÑиÑ, а неfree(), в Microsoft Windows. ÐÑо ÑвÑзано Ñ Ñем, ÑÑо вÑделение памÑÑи в DLL и оÑвобождение ÐµÑ Ð² пÑиложении бÑÐ´ÐµÑ ÑабоÑаÑÑ, ÑолÑко еÑли Ñлаги многопоÑоÑной/однопоÑоÑной, вÑпÑÑкаемой/оÑладоÑной или ÑÑаÑиÑеÑкой/динамиÑеÑкой ÑбоÑки Ð´Ð»Ñ DLL и пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑовпадаÑÑ. Ðа дÑÑÐ³Ð¸Ñ Ð¿Ð»Ð°ÑÑоÑÐ¼Ð°Ñ ÑÑа ÑÑнкÑÐ¸Ñ Ð´ÐµÐ¹ÑÑвÑÐµÑ Ñак же, как ÑÑандаÑÑÐ½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑеÑÐ½Ð°Ñ ÑÑнкÑиÑfree().-
PQconninfoFree ÐÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , вÑделеннÑе ÑÑнкÑиÑми
PQconndefaultsиPQconninfoParse.void PQconninfoFree(PQconninfoOption *connOptions);
ÐÑоÑÑÐ°Ñ ÑÑнкÑиÑ
PQfreememне подойдÑÑ Ð´Ð»Ñ ÑÑого, Ñак как ÑÑи ÑÑÑÑкÑÑÑÑ ÑодеÑÐ¶Ð°Ñ ÑÑÑлки на подÑинÑннÑе ÑÑÑоки.-
PQencryptPassword ÐодгоÑÐ°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð·Ð°ÑиÑÑованнÑÑ ÑоÑÐ¼Ñ Ð¿Ð°ÑÐ¾Ð»Ñ Postgres Pro.
char * PQencryptPassword(const char *passwd, const char *user);
ÐÑа ÑÑнкÑÐ¸Ñ Ð¿ÑедназнаÑена Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑÐºÐ¸Ñ Ð¿Ñиложений, желаÑÑÐ¸Ñ Ð¿ÐµÑедаваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð²Ð¸Ð´Ð°
ALTER USER joe PASSWORD 'pwd'. Ð Ñакой команде лÑÑÑе не пеÑедаваÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ñй паÑÐ¾Ð»Ñ Ð¾ÑкÑÑÑÑм ÑекÑÑом, Ñак как он Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑвиÑÑÑÑ Ð² ÑабоÑÐ¸Ñ Ð¶ÑÑÐ½Ð°Ð»Ð°Ñ , мониÑоÑе акÑивноÑÑи и Ñ. д. ÐмеÑÑо ÑÑого, воÑполÑзÑйÑеÑÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑнкÑией и пеÑеведиÑе паÑÐ¾Ð»Ñ Ð² заÑиÑÑованнÑÑ ÑоÑмÑ, пÑежде Ñем пеÑедаваÑÑ ÐµÐ³Ð¾. РаÑгÑменÑÐ°Ñ ÐµÐ¹ пеÑедаÑÑÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð² оÑкÑÑÑом виде и Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ SQL, Ð´Ð»Ñ ÐºÐ¾ÑоÑого он пÑедназнаÑен. ÐозвÑаÑÐ°ÐµÑ Ð¾Ð½Ð° ÑÑÑокÑ, вÑделеннÑÑ ÑÑнкÑиейmalloc, илиNULLв ÑлÑÑае Ð½ÐµÑ Ð²Ð°Ñки памÑÑи. ÐÑзÑваÑÑий код Ð¼Ð¾Ð¶ÐµÑ ÑаÑÑÑиÑÑваÑÑ Ð½Ð° Ñо, ÑÑо в ÑÑой ÑÑÑоке не бÑÐ´ÐµÑ ÑпеÑиалÑнÑÑ Ñимволов, ÑÑебÑÑÑÐ¸Ñ ÑкÑаниÑованиÑ. ÐавеÑÑив ÑабоÑÑ Ñ ÑÑой ÑÑÑокой, вÑзовиÑеPQfreemem, ÑÑÐ¾Ð±Ñ Ð¾ÑвободиÑÑ ÐµÑ.-
PQmakeEmptyPGresult ÐонÑÑÑÑиÑÑÐµÑ Ð¿ÑÑÑой обÑекÑ
PGresultÑ ÑказаннÑм ÑоÑÑоÑнием.PGresult *PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);
ÐÑо внÑÑÑеннÑÑ ÑÑнкÑÐ¸Ñ libpq, вÑделÑÑÑÐ°Ñ Ð¿Ð°Ð¼ÑÑÑ Ð¸ иниÑиализиÑÑÑÑÐ°Ñ Ð¿ÑÑÑой обÑекÑ
PGresult. ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑNULL, еÑли не Ð¼Ð¾Ð¶ÐµÑ Ð²ÑделиÑÑ Ð¿Ð°Ð¼ÑÑÑ. Ðна Ñделана ÑкÑпоÑÑиÑÑемой, Ñак как некоÑоÑÑе пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ñ Ð¾Ð´ÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ ÑезÑлÑÑаÑов (в ÑаÑÑноÑÑи, обÑекÑÑ Ñ ÑоÑÑоÑнием оÑибки) ÑамоÑÑоÑÑелÑно. ÐÑли вconnпеÑедаÑÑÑÑ Ð½Ðµ null иstatusÑказÑÐ²Ð°ÐµÑ Ð½Ð° оÑибкÑ, вPGresultкопиÑÑеÑÑÑ ÑекÑÑее ÑообÑение об оÑибке Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑоединениÑ. Также, еÑли вconnпеÑедаÑÑÑÑ Ð½Ðµ null, вPGresultкопиÑÑÑÑÑÑ Ð²Ñе пÑоÑедÑÑÑ ÑобÑÑий, заÑегиÑÑÑиÑованнÑе Ð´Ð»Ñ ÑÑого ÑоединениÑ. (ÐÑи ÑÑом вÑзовÑPGEVT_RESULTCREATEне вÑполнÑÑÑÑÑ; Ñм. опиÑаниеPQfireResultCreateEvents.) ÐамеÑÑÑе, ÑÑо в конÑе Ð´Ð»Ñ ÑÑого обÑекÑа ÑледÑÐµÑ Ð²ÑзваÑÑPQclear, как и Ð´Ð»Ñ Ð¾Ð±ÑекÑаPGresult, возвÑаÑÑнного Ñамой библиоÑекой libpq.-
PQfireResultCreateEvents ÐÑзÑÐ²Ð°ÐµÑ ÑобÑÑие
PGEVT_RESULTCREATE(Ñм. Раздел 30.13) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ пÑоÑедÑÑÑ ÑобÑÑий, заÑегиÑÑÑиÑованной в обÑекÑеPGresult. ÐозвÑаÑÐ°ÐµÑ Ð½ÐµÐ½Ñлевое знаÑение в ÑлÑÑае ÑÑÐ¿ÐµÑ Ð° или Ð½Ð¾Ð»Ñ Ð² ÑлÑÑае оÑибки в одной из пÑоÑедÑÑ.int PQfireResultCreateEvents(PGconn *conn, PGresult *res);
ÐÑгÑменÑ
connпеÑедаÑÑÑÑ Ð¿ÑоÑедÑÑам ÑобÑÑий, но непоÑÑедÑÑвенно не иÑполÑзÑеÑÑÑ. Ðн Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑавенNULL, еÑли он не нÑжен пÑоÑедÑÑам ÑобÑÑий.ÐÑоÑедÑÑÑ ÑобÑÑий, Ñже полÑÑивÑие ÑобÑÑие
PGEVT_RESULTCREATEилиPGEVT_RESULTCOPYÐ´Ð»Ñ ÑÑого обÑекÑа, болÑÑе не вÑзÑваÑÑÑÑ.ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿ÑиÑина оÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑой ÑÑнкÑии оÑ
PQmakeEmptyPGresultв Ñом, ÑÑо ÑаÑÑо ÑÑебÑеÑÑÑ ÑоздаÑÑ Ð¾Ð±ÑекÑPGresultи наполниÑÑ ÐµÐ³Ð¾ даннÑми, пÑежде Ñем вÑзÑваÑÑ Ð¿ÑоÑедÑÑÑ ÑобÑÑий.-
PQcopyResult СоздаÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð¾Ð±ÑекÑа
PGresult. ÐÑа ÐºÐ¾Ð¿Ð¸Ñ Ð½Ð¸ÐºÐ°Ðº не ÑвÑзана Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ñм ÑезÑлÑÑаÑом и поÑÑомÑ, когда она ÑÑановиÑÑÑ Ð½Ðµ нÑжна, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ вÑзваÑÑPQclear. ÐÑли ÑÑнкÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ Ð¾Ñибкой, она возвÑаÑаеÑNULL.PGresult *PQcopyResult(const PGresult *src, int flags);
Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑоÑной. РвозвÑаÑаемÑй ÑезÑлÑÑÐ°Ñ Ð²Ñегда помеÑаеÑÑÑ ÑоÑÑоÑние
PGRES_TUPLES_OKи в него не копиÑÑÑÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑÐ¸Ð±ÐºÐ°Ñ Ð¸Ð· иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑекÑа. (Ðднако в него копиÑÑеÑÑÑ ÑÑÑока ÑоÑÑоÑÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ.) ЧÑо еÑÑ Ð² него бÑÐ´ÐµÑ ÐºÐ¾Ð¿Ð¸ÑоваÑÑÑÑ, опÑеделÑÐµÑ Ð°ÑгÑменÑflags, в коÑоÑом ÑкладÑваÑÑÑÑ Ð½ÐµÑколÑко Ñлагов. ФлагPG_COPYRES_ATTRSвклÑÑÐ°ÐµÑ ÐºÐ¾Ð¿Ð¸Ñование аÑÑибÑÑов иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑекÑа (опÑеделений ÑÑолбÑов), а ÑлагPG_COPYRES_TUPLESвклÑÑÐ°ÐµÑ ÐºÐ¾Ð¿Ð¸Ñование коÑÑежей из иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑекÑа (пÑи ÑÑом Ñакже копиÑÑÑÑÑÑ Ð¸ аÑÑибÑÑÑ.) ФлагPG_COPYRES_NOTICEHOOKSвклÑÑÐ°ÐµÑ ÐºÐ¾Ð¿Ð¸Ñование обÑабоÑÑиков замеÑаний, а ÑлагPG_COPYRES_EVENTSâ ÑобÑÑий из иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑекÑа ÑезÑлÑÑаÑа. (Ðо лÑбÑе даннÑе, ÑвÑзаннÑе Ñ ÑкземплÑÑом иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑекÑа, не копиÑÑÑÑÑÑ.)-
PQsetResultAttrs УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð°ÑÑибÑÑÑ Ð¾Ð±ÑекÑа
PGresult.int PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs);
ÐÑедоÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ ÑÑÑÑкÑÑÑа
attDescsкопиÑÑеÑÑÑ Ð² ÑезÑлÑÑаÑ. ÐÑли ÑказаÑелÑattDescsÑавенNULLилиnumAttributesменÑÑе одного, запÑÐ¾Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑеÑÑÑ Ð¸ ÑÑнкÑÐ¸Ñ Ð²ÑполнÑеÑÑÑ Ð±ÐµÐ· оÑибки. ÐÑлиresÑже ÑодеÑÐ¶Ð¸Ñ Ð°ÑÑибÑÑÑ, ÑÑнкÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ Ð¾Ñибкой. Ð ÑлÑÑае оÑибки ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð½Ð¾Ð»Ñ, а в обÑаÑном ÑлÑÑае â ненÑлевое знаÑение.-
PQsetvalue УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð·Ð½Ð°Ñение Ð¿Ð¾Ð»Ñ ÐºÐ¾ÑÑежа в обÑекÑе
PGresult.int PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len);
ÐÑа ÑÑнкÑÐ¸Ñ Ð°Ð²ÑомаÑиÑеÑки ÑвелиÑÐ¸Ð²Ð°ÐµÑ Ð²Ð½ÑÑÑенний маÑÑив коÑÑежей пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи. Ðднако знаÑение
tup_numдолжно бÑÑÑ Ð¼ÐµÐ½ÑÑе или ÑавноPQntuples, ÑÑо ознаÑаеÑ, ÑÑо ÑÑа ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ ÑвелиÑиваÑÑ Ð¼Ð°ÑÑив коÑÑежей ÑолÑко на один коÑÑеж. Ðо в ÑÑÑеÑÑвÑÑÑем коÑÑеже лÑбÑе Ð¿Ð¾Ð»Ñ Ð¼Ð¾Ð³ÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð² лÑбом поÑÑдке. ÐÑли знаÑение в поле Ñ Ð½Ð¾Ð¼ÐµÑомfield_numÑже ÑÑÑеÑÑвÑеÑ, оно бÑÐ´ÐµÑ Ð¿ÐµÑезапиÑано. ÐÑлиlenÑавно -1 илиvalueÑавноNULL, в поле бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñано знаÑение SQL NULL. УÑÑанавливаемое знаÑение (value) копиÑÑеÑÑÑ Ð² закÑÑÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¾Ð±ÑекÑа ÑезÑлÑÑаÑа, Ñак ÑÑо Ð¾Ñ Ð½ÐµÐ³Ð¾ можно избавиÑÑÑÑ Ð¿Ð¾Ñле завеÑÑÐµÐ½Ð¸Ñ ÑÑнкÑии. ÐÑли ÑÑнкÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ Ð¾Ñибкой, она возвÑаÑÐ°ÐµÑ Ð½Ð¾Ð»Ñ, а в обÑаÑном ÑлÑÑае â ненÑлевое знаÑение.-
PQresultAlloc ÐÑделÑÐµÑ Ð¿Ð¾Ð´ÑинÑннÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи Ð´Ð»Ñ Ð¾Ð±ÑекÑа
PGresult.void *PQresultAlloc(PGresult *res, size_t nBytes);
ÐÑÐ±Ð°Ñ Ð¿Ð°Ð¼ÑÑÑ, вÑÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÑÑой ÑÑнкÑией, бÑÐ´ÐµÑ Ð¾Ñвобождена пÑи оÑиÑÑке обÑекÑа
res. Ð ÑлÑÑае оÑибки ÑÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑNULL. РезÑлÑÑÐ°Ñ Ð³Ð°ÑанÑиÑованно вÑÑавниваеÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом Ð´Ð»Ñ Ð»Ñбого Ñипа даннÑÑ , как и пÑиmalloc.-
PQlibVersion ÐозвÑаÑÐ°ÐµÑ Ð²ÐµÑÑÐ¸Ñ Ð¸ÑполÑзÑемой библиоÑеки libpq.
int PQlibVersion(void);
Ðо ÑезÑлÑÑаÑÑ ÑÑой ÑÑнкÑии можно во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделиÑÑ, пÑедоÑÑавлÑеÑÑÑ Ð»Ð¸ опÑеделÑÐ½Ð½Ð°Ñ ÑÑнкÑионалÑноÑÑÑ Ð·Ð°Ð³ÑÑженной в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²ÐµÑÑией libpq. ÐÑа ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ, напÑимеÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ, какие паÑамеÑÑÑ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинÑÑÑ
PQconnectdbили поддеÑживаеÑÑÑ Ð»Ð¸ вÑводbyteaв ÑоÑмаÑеhex, поÑвивÑийÑÑ Ð² PostgreSQL 9.0.ÐÑо ÑиÑло ÑоÑмиÑÑеÑÑÑ Ð² ÑезÑлÑÑаÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¾Ð¼ÐµÑов ÑÑаÑÑей, дополниÑелÑной и коÑÑекÑиÑÑÑÑей веÑÑии в ÑиÑла из двÑÑ ÑиÑÑ Ð¸ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸Ñ Ð²Ð¼ÐµÑÑе. ÐапÑимеÑ, Ð´Ð»Ñ Ð²ÐµÑÑии 9.1 бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑено 90100, а Ð´Ð»Ñ Ð²ÐµÑÑии 9.1.2 â 90102 (ведÑÑие нÑли не показÑваÑÑÑÑ).
ÐÑимеÑание
ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾ÑвилаÑÑ Ð² PostgreSQL веÑÑии 9.1, поÑÑÐ¾Ð¼Ñ Ñ ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð¿ÑовеÑиÑÑ ÑÑнкÑионалÑноÑÑÑ Ð¿ÑедÑдÑÑÐ¸Ñ Ð²ÐµÑÑий, Ñак как пÑи компоновке Ñ Ð½ÐµÐ¹ бÑÐ´ÐµÑ Ñоздана завиÑимоÑÑÑ Ð¾Ñ Ð²ÐµÑÑии 9.1.