32.12. Различные функции#
32.12. Различные функции
Как всегда, есть некоторые функции, которые просто никуда не подходят.
PQfreememОсвобождает память, выделенную libpq.
void PQfreemem(void *ptr);
Освобождает память, выделенную libpq, в частности
PQescapeByteaConn,PQescapeBytea,PQunescapeBytea, иPQnotifies.PQconninfoFreeОсвобождает структуры данных, выделенные функциями
PQconndefaultsилиPQconninfoParse.void PQconninfoFree(PQconninfoOption *connOptions);
Простой
PQfreememне подойдет для этого, так как массив содержит ссылки на дополнительные строки.PQencryptPasswordConnПодготавливает зашифрованную форму пароля Tantor SE.
char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, const char *algorithm);
Эта функция предназначена для использования клиентскими приложениями, которые хотят отправить команды вроде
ALTER USER joe PASSWORD 'pwd'. Хорошей практикой является не отправлять исходный пароль в открытом виде в такой команде, потому что он может быть виден в журналах команд, отображениях активности и т. д. Вместо этого используйте эту функцию для преобразования пароля в зашифрованную форму перед его отправкой.Аргументы
passwdиuserпредставляют собой пароль в открытом виде и SQL-имя пользователя, для которого он предназначен.algorithmуказывает алгоритм шифрования, который будет использоваться для шифрования пароля. В настоящее время поддерживаются алгоритмыmd5иscram-sha-256(также принимаются псевдонимыonиoffвместоmd5для обеспечения совместимости с более старыми версиями сервера). Обратите внимание, что поддержка алгоритмаscram-sha-256была введена в PostgreSQL версии 10 и не будет работать правильно с более старыми версиями сервера. Если значениеalgorithmравноNULL, эта функция запросит текущее значение параметра password_encryption у сервера. Это может заблокировать выполнение и завершиться неудачей, если текущая транзакция была отменена или если соединение занято выполнением другого запроса. Если нужно использовать алгоритм по умолчанию для сервера, но хотите избежать блокировки, запросите значениеpassword_encryptionсамостоятельно перед вызовомPQencryptPasswordConnи передайте это значение в качестве аргументаalgorithm.Возвращаемое значение - это строка, выделенная с помощью функции
malloc. Вызывающая сторона может предположить, что строка не содержит специальных символов, которые требуют экранирования. ИспользуйтеPQfreememдля освобождения результата после использования. В случае ошибки возвращаетсяNULL, а соответствующее сообщение сохраняется в объекте соединения.PQencryptPasswordПодготавливает md5-зашифрованную форму пароля Tantor SE.
char *PQencryptPassword(const char *passwd, const char *user);
PQencryptPassword- это старая, устаревшая версия функцииPQencryptPasswordConn. Разница заключается в том, чтоPQencryptPasswordне требует объекта соединения, и всегда используется алгоритм шифрованияmd5.PQmakeEmptyPGresultСоздает пустой объект
PGresultс заданным статусом.PGresult *PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);
Это внутренняя функция libpq для выделения и инициализации пустого объекта
PGresult. Эта функция возвращаетNULL, если не удалось выделить память. Она экспортируется, потому что некоторым приложениям полезно генерировать сами объекты результата (особенно объекты с ошибочным статусом). Еслиconnне является нулевым иstatusуказывает на ошибку, то текущее сообщение об ошибке указанного соединения копируется вPGresult. Кроме того, еслиconnне является нулевым, то все процедуры событий, зарегистрированные в соединении, копируются вPGresult. (Они не получают вызововPGEVT_RESULTCREATE, но см.PQfireResultCreateEvents). Обратите внимание, что в конечном итоге на объекте должна быть вызвана функцияPQclear, так же как и на объектеPGresult, возвращенном самим libpq.PQfireResultCreateEventsВызывает событие
PGEVT_RESULTCREATE(см. Раздел 32.14) для каждой зарегистрированной процедуры события в объекте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указывает на копирование событий исходного результата. (Но любые данные экземпляра, связанные с источником, не копируются). Процедуры событий получают событияPGEVT_RESULTCOPY.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.PQresultMemorySizeВозвращает количество выделенных байтов для объекта
PGresult.size_t PQresultMemorySize(const PGresult *res);
Это значение является суммой всех запросов
malloc, связанных с объектомPGresult, то есть, всего пространства, которое будет освобождено с помощьюPQclear. Эта информация может быть полезна для управления потреблением памяти.PQlibVersionВернуть версию libpq, которая используется.
int PQlibVersion(void);
Результатом этой функции может быть определение во время выполнения, доступна ли конкретная функциональность в текущей загруженной версии libpq. Функцию можно использовать, например, для определения доступных параметров подключения в
PQconnectdb.Результат формируется путем умножения основной версии библиотеки на 10000 и добавления номера минорной версии. Например, версия 10.1 будет возвращена как 100001, а версия 11.0 будет возвращена как 110000.
До основной версии 10 PostgreSQL использовал трехчастные номера версий, в которых первые две части вместе представляли основную версию. Для этих версий
PQlibVersionиспользует две цифры для каждой части; например, версия 9.1.5 будет возвращена как 90105, а версия 9.2.0 будет возвращена как 90200.Поэтому, для определения совместимости функций, приложения должны делить результат
PQlibVersionна 100, а не на 10000, чтобы определить логический номер основной версии. Во всех сериях выпусков, только последние две цифры отличаются между корректирующими выпусками (исправлениями ошибок).Примечание
Эта функция появилась в версии PostgreSQL 9.1, поэтому ее нельзя использовать для определения необходимой функциональности в более ранних версиях, так как вызов ее создаст зависимость от версии 9.1 или более поздней.