32.12. Различные функции#
32.12. Различные функции
Как всегда, есть некоторые функции, которые просто никуда не подходят.
PQfreemem
Освобождает память, выделенную libpq.
void PQfreemem(void *ptr);
Освобождает память, выделенную libpq, в частности
PQescapeByteaConn
,PQescapeBytea
,PQunescapeBytea
, а такжеPQnotifies
. Особенно важно использовать именно эту функцию, а неfree()
, в операционной системе Microsoft Windows. Это связано с тем, что выделение памяти в DLL и ее освобождение в приложении работает только если флаги многопоточности/однопоточности, режима отладки/релиза и статической/динамической компоновки совпадают для DLL и приложения. В других операционных системах Windows эта функция эквивалентна стандартной библиотечной функцииfree()
.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 или более поздней.