×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

4.1.10. Функции, связанные с COPY командой

4.1.10.1. Функции для передачи COPY данных
4.1.10.2. Функции для получения данных COPY данных
4.1.10.3. Устаревшие функции для COPY

Функция COPY команда в Digital Q.DataBase имеет параметры для чтения из сетевого соединения, используемого , или записи в него libpq. Функции, описанные в данном разделе, позволяют приложениям использовать эту возможность путем предоставления или получения копируемых данных.

Общий процесс заключается в том, что приложение сначала инициирует выполнение SQL-команды COPY через функцию PQexec или одну из эквивалентных функций. Результатом выполнения этой операции (при отсутствии в команде ошибок) будет PGresult объект, содержащий код состояния PGRES_COPY_OUT или PGRES_COPY_IN (в зависимости от заданного направления копирования). После этого приложению следует использовать функции из данного раздела для приема или передачи строк данных. По завершении передачи данных возвращается другой PGresult объект, информирующий об успешном или неудачном завершении операции. Он будет иметь статус PGRES_COMMAND_OK в случае успеха или PGRES_FATAL_ERROR при возникновении какой-либо проблемы. На данном этапе можно выполнять другие SQL-команды через функцию PQexec. (Выполнение других SQL-команд через то же самое соединение невозможно, пока COPY операция находится в процессе выполнения.)

Если COPY команда передается через функцию PQexec в строке, которая может содержать дополнительные команды, приложение должно продолжать получение результатов через функцию PQgetResult после завершения последовательности функций COPY . Только когда функция PQgetResult возвращает значение значение NULL становится точно известно, что выполнение строки PQexec команд завершено и можно безопасно выполнять следующие команды.

Функции, описанные в данном разделе, должны выполняться только после получения статуса результата PGRES_COPY_OUT или PGRES_COPY_IN из PQexec или PQgetResult.

Объект PGresult объект conn, имеющий одно из этих значений статуса, содержит некоторые дополнительные данные об операции COPY начинающейся операции. Эти дополнительные данные доступны при использовании функций, которые также применяются в связи с результатами запросов:

PQnfields #

Возвращает количество столбцов (полей), подлежащих копированию.

PQbinaryTuples #

Значение 0 указывает на то, что общий формат копирования является текстовым (строки разделяются символами новой строки, столбцы — символами-разделителями и т. д.). Значение 1 указывает на то, что общий формат операции копирования является бинарным. См. COPY for more information.

PQfformat #

Возвращает код формата (0 для текстового, 1 для бинарного), связанный с каждым столбцом операции копирования. Постолбцовые коды форматов всегда будут равны нулю, если общий формат копирования является текстовым, однако бинарный формат может поддерживать как текстовые, так и бинарные столбцы. (Однако в текущей реализации COPY, в бинарном копировании участвуют только бинарные столбцы; поэтому постолбцовые форматы в настоящее время всегда соответствуют общему формату.)

4.1.10.1. Функции для передачи COPY данных #

Данные функции используются для передачи данных во время выполнения операции COPY FROM STDIN. Вызов данных функций завершится ошибкой, если соединение не находится в COPY_IN состоянии.

PQputCopyData #

Передает данные на сервер во время выполнения операции COPY_IN состоянии.

int PQputCopyData(PGconn *conn,
                  const char *buffer,
                  int nbytes);

Передает COPY данные из указанного bufferдлиной nbytesна сервер. Результат равен 1, если данные были помещены в очередь, и 0, если данные не были помещены в очередь вследствие переполнения буферов (это происходит только в неблокирующем режиме), или -1 при возникновении ошибки. (Используйте соответствующие средства PQerrorMessage для получения подробных сведений, если возвращаемое значение равно -1. Если значение равно нулю, дождитесь готовности к записи и повторите попытку.)

Приложение может разделить COPY поток данных на порции буфера любого удобного размера. Границы порций буфера не имеют семантического значения при отправке. Содержимое потока данных должно соответствовать формату данных, который ожидает COPY команда; см. COPY для получения подробных сведений.

PQputCopyEnd #

Отправляет на сервер индикатор завершения передачи данных в процессе COPY_IN состоянии.

int PQputCopyEnd(PGconn *conn,
                 const char *errormsg);

Завершает COPY_IN операцию успешно, если же errormsg имеет значение NULL значение NULL. Если errormsg не является значение NULL то она COPY принудительно завершается с ошибкой, а в качестве сообщения об ошибке используется строка, на которую указывает errormsg параметр errormsg. (Не следует полагать, что от сервера вернется именно это сообщение об ошибке, однако, так как сервер уже мог завершить со сбоем COPY по собственным причинам.)

Результат равен 1, если сообщение о завершении было отправлено; либо в неблокирующем режиме это может означать лишь то, что сообщение о завершении было успешно поставлено в очередь. (В неблокирующем режиме, чтобы быть уверенным в отправке данных, следует дождаться состояния готовности к записи и вызвать функцию PQflush, повторяя вызов до тех пор, пока она не вернёт ноль.) Ноль означает, что функция не смогла поставить в очередь сообщение о завершении из-за переполнения буферов; это возможно только в неблокирующем режиме. (В этом случае следует дождаться готовности к записи и повторить PQputCopyEnd вызов функции снова.) При возникновении критической ошибки возвращается -1; можно использовать PQerrorMessage для получения подробных сведений.

После успешного вызова функции PQputCopyEnd, вызовите функцию PQgetResult для получения окончательного статуса результата COPY команда. Можно дождаться, когда этот результат будет станут доступны обычным способом. После этого следует вернуться к штатному режиму работы.

4.1.10.2. Функции для получения данных COPY данных #

Для получения данных в ходе выполнения операции используются данные функции COPY TO STDOUT. Вызов данных функций завершится ошибкой, если соединение не находится в COPY_OUT состоянии.

PQgetCopyData #

В ходе выполнения операции данные от сервера получает функция COPY_OUT состоянии.

int PQgetCopyData(PGconn *conn,
                  char **buffer,
                  int async);

В ходе выполнения операции попытка получения очередной строки данных от сервера осуществляется функцией COPY. Данные всегда возвращаются по одной строке за раз; в случае доступности только части строки она не возвращается. Успешный возврат строки данных предполагает выделение фрагмента памяти для хранения данных. buffer параметр должен быть не-значение NULL. *buffer устанавливается в значение указывать на выделенную область памяти или на значение NULL в тех случаях, когда буфер не возвращается. Значение,значение NULL результат отличное от значения NULL, следует освободить с помощью функции PQfreemem когда оно больше не требуется.

При успешном возврате строки возвращаемым значением является количество байтов данных в строке (данное значение всегда будет больше нуля). Возвращаемая строка всегда завершается нулем, хотя это, вероятно, полезно только для текстовых данных COPY. Результат равный нулю, указывает на то, что COPY операция все еще находится в процессе выполнения, но строка еще не доступна (это возможно только в случае, когда параметр async имеет значение true). Результат, равный -1, указывает на то, что выполнение COPY завершено. Значение -2 указывает на то, что произошла ошибка (обратитесь к PQerrorMessage для выяснения причины).

Когда async имеет значение true (не ноль), PQgetCopyData не будет блокироваться в ожидании ввода; функция вернет ноль, если COPY все еще выполняется но полная строка недоступна. (В этом случае дождитесь готовности дескриптора к чтению и затем вызовите функцию PQconsumeInput перед вызовом функции PQgetCopyData снова.) Когда async имеет имеет значение false (ноль), PQgetCopyData будет блокироваться до тех пор, пока данные не станут доступны или операция не завершится.

После того как функция PQgetCopyData вернет -1, вызовите функцию PQgetResult для получения окончательного статуса результата COPY команда. Можно дождаться, когда этот результат будет станут доступны обычным способом. После этого следует вернуться к штатному режиму работы.

4.1.10.3. Устаревшие функции для COPY #

Данные функции представляют собой устаревшие методы обработки COPY. Несмотря на то, что они все еще функционируют, они считаются устаревшими из-за неудовлетворительной обработки ошибок, неудобных методов определения конца данных и отсутствия поддержки двоичной или неблокирующей передачи.

PQgetline #

Считывает переданную сервером строку символов, завершающуюся символом новой строки, в строковый буфер, имеющий размер length.

int PQgetline(PGconn *conn,
              char *buffer,
              int length);

Данная функция копирует до length-1 символов в буфер и преобразует завершающий символ новой строки в нулевой байт. PQgetline возвращает EOF при достижении конца входных данных, 0, если была считана вся строка, и 1, если буфер заполнен, но завершающий символ новой строки ещё не был считан.

Следует отметить, что приложение должно проверять, состоит ли новая строка из двух символов \., что указывает на информацию о том, что сервер завершил отправку результатов COPY команда. Если приложение может получать строки, длина которых превышает length-1 символов, необходимо убедиться, что оно правильно распознает \. эту строку (и, например, не принимает окончание длинной строки данных за строку-терминатор).

PQgetlineAsync #

Считывает строку COPY данных (передаваемых сервером) в буфер без блокировки.

int PQgetlineAsync(PGconn *conn,
                   char *buffer,
                   int bufsize);

Данная функция аналогична PQgetline, однако она может использоваться в приложениях, которые должны выполнять чтение COPY данные асинхронно, то есть без блокировки. После выполнения COPY команды и получения PGRES_COPY_OUT ответа, приложение должно вызвать PQconsumeInput и PQgetlineAsync до тех пор, пока не будет обнаружен сигнал завершения передачи данных.

В отличие от PQgetline, данная функция берет на себя задачу по обнаружению завершения передачи данных.

При каждом вызове PQgetlineAsync будет возвращать данные, если доступна полная строка данных во libpqвходном буфере. В противном случае данные не будут возвращены до тех пор, пока не поступит оставшаяся часть строки. Функция возвращает -1, если был распознан маркер завершения копирования данных, 0, если данные недоступны, или положительное число, указывающее количество возвращенных байтов данных. Если возвращается значение -1, вызывающая сторона должна затем вызвать функцию PQendcopy, после чего следует вернуться к обычной обработке.

Возвращаемые данные не будут выходить за границы строки данных. По возможности вся строка будет возвращена за один раз. Однако если буфер, предоставленный вызывающей стороной, слишком мал для размещения строки, отправленной сервером, будет возвращена частичная строка данных. В случае текстовых данных это можно определить путем проверки того, является ли последний возвращенный байт символом \n или нет. (В двоичном формате COPYдля принятия аналогичного решения COPY потребуется фактический разбор формата данных.) Возвращаемая строка не завершается значением NULL. (Если требуется добавить завершающее значение NULL, обязательно передайте в параметре bufsize значение на единицу меньше фактически доступного объема памяти.)

PQputline #

Отправляет серверу строку, завершающуюся нулевым символом. Возвращает 0, если операция завершена успешно, и EOF если отправить строку не удалось.

int PQputline(PGconn *conn,
              const char *string);

Параметр COPY поток данных, отправляемый серией вызовов, равным PQputline имеет тот же формат, что и данные, возвращаемые функцией PQgetlineAsync, за исключением того, что приложения не обязаны отправлять ровно одну строку данных за один PQputline вызов; допускается отправка части строки или нескольких строк за один вызов.

Примечание

В версиях до Digital Q.DataBase протокола 3.0 приложению необходимо было явно отправлять два символа \. в качестве завершающей строки, чтобы сообщить серверу, что передача завершила отправку COPY данных. Хотя этот механизм все еще работает, он считается устаревшим, и специальное значение \. может быть удалено в будущем выпуске. Достаточно вызвать функцию PQendcopy после отправки фактических данных.

PQputnbytes #

Отправляет на сервер строку, не завершающуюся нулевым символом. Возвращает значение 0 в случае успеха и EOF если отправить строку не удалось.

int PQputnbytes(PGconn *conn,
                const char *buffer,
                int nbytes);

Эта функция работает точно так же, как PQputline, за исключением того, что буфер данных не обязательно должен завершаться нулевым символом, так как количество байтов для отправки указывается напрямую. Данную процедуру следует использовать при отправке двоичных данных.

PQendcopy #

Выполняет синхронизацию с сервером.

int PQendcopy(PGconn *conn);

Данная функция ожидает завершения процесса копирования сервером. Ее следует вызывать либо после того, как была отправлена последняя строка серверу с помощью PQputline либо когда от сервера была получена последняя строка с помощью PQgetline. Функцию необходимо вызвать, иначе сервер перейдет в состояние «рассинхронизации» с клиентом. После возврата из данной функции сервер будет готов к приему следующей SQL-команды команды. При успешном завершении возвращаемое значение равно 0, в противном случае оно отлично от нуля. (Используйте PQerrorMessage для для получения подробных сведений, если возвращаемое значение не равно нулю.)

При использовании параметра PQgetResult, приложению следует реагировать на PGRES_COPY_OUT результат путем выполнения PQgetline многократно, после чего следует PQendcopy после обнаружения строки-терминатора. Затем управление должно вернуться в PQgetResult цикл до тех пор, пока PQgetResult функция не вернет значение NULL. Аналогичным образом PGRES_COPY_IN результат обрабатывается посредством ряда PQputline вызовов, за которыми следует PQendcopy, после чего необходимо вернуться в PQgetResult цикл. Такой порядок обеспечит, чтобы COPY команда, встроенная в последовательность параметра SQL команд, выполнялась корректно.

В устаревших приложениях, вероятнее всего, отправляется COPY посредством PQexec и предполагается, что транзакция завершается после PQendcopy. Это будет работать корректно только в том случае, если COPY является единственной SQL командой в командной строке.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению