31.12. Различные функции#
31.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);
Если аргумент является указателем на
NULL
, операция не выполняется.Простой
PQfreemem
не подойдет для этого, так как массив содержит ссылки на дополнительные строки.PQencryptPasswordConn
#Подготавливает зашифрованную форму пароля Tantor SE-1C.
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-1C.
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
(см. Раздел 31.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 или более поздней.