31.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(см. Раздел 31.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.