F.1. adminpack — набор инструментов поддержки pgAdmin #

Модуль adminpack предоставляет несколько вспомогательных функций, которыми могут пользоваться pgAdmin и другие средства администрирования и управления базами данных, например для удалённого управления файлами журналов сервера. По умолчанию использовать все эти функции разрешено только суперпользователям баз данных, но такое право можно дать и другим пользователям с помощью команды GRANT.

Функции, приведённые в Таблице F.1, предоставляют возможность записи в файлы на компьютере, где работает сервер. (См. также функции в Таблице 9.102, которые открывают доступ только на чтение.) Они позволяют обычным пользователям обращаться только к файлам в каталоге кластера баз данных, но не ограничивают суперпользователей и пользователей с правами ролей pg_read_server_files или pg_write_server_files (в зависимости от рода функции). При этом путь может задаваться и как абсолютный, и как относительный.

Таблица F.1. Функции модуля adminpack

Функция

Описание

pg_catalog.pg_file_write ( filename text, data text, append boolean ) → bigint

Записывает или дописывает данные в текстовый файл.

pg_catalog.pg_file_sync ( filename text ) → void

Сбрасывает файл или каталог на диск.

pg_catalog.pg_file_rename ( oldname text, newname text [, archivename text] ) → boolean

Переименовывает файл.

pg_catalog.pg_file_unlink ( filename text ) → boolean

Удаляет файл.

pg_catalog.pg_logdir_ls () → setof record

Выдаёт список файлов журналов в каталоге log_directory.


Функция pg_file_write записывает данные (data) в файл с именем filename. Если флаг append сброшен, этот файл не должен существовать. Если же флаг append установлен, существование файла допускается и в этом случае данные будут дописаны в него. Возвращает число записанных байт.

Функция pg_file_sync синхронизирует с файловой системой файл или каталог с именем filename. В случае неудачи (например, если указанный файл не существует) выдаётся ошибка. Заметьте, что значение data_sync_retry на эту функцию не влияет, и поэтому даже в случае отказа при сбросе файлов базы не будет выдана ошибка уровня PANIC.

Функция pg_file_rename переименовывает файл. Если параметр archivename опущен или равен NULL, она просто переименовывает файл oldname в newname (файл с новым именем не должен существовать). Если параметр archivename задан, она сначала переименовывает newname в archivename (такой файл не должен существовать), а затем переименовывает oldname в newname. В случае ошибки на втором этапе переименования она попытается переименовать archivename назад в newname, прежде чем выдать ошибку. Возвращает true в случае успеха и false, если исходные файлы отсутствуют или их невозможно изменить; в других случаях выдаются ошибки.

Функция pg_file_unlink удаляет заданный файл. Возвращает true в случае успеха, false в случае отсутствия указанного файла либо при сбое в вызове unlink(); в других случаях выдаются ошибки.

Функция pg_logdir_ls возвращает время создания и пути всех файлов журналов в каталоге log_directory. Чтобы эта функция работала, параметр log_filename должен иметь значение по умолчанию (postgresql-%Y-%m-%d_%H%M%S.log).

32.21. Building libpq Programs #

To build (i.e., compile and link) a program using libpq you need to do all of the following things:

  • Include the libpq-fe.h header file:

    #include <libpq-fe.h>
    

    If you failed to do that then you will normally get error messages from your compiler similar to:

    foo.c: In function `main':
    foo.c:34: `PGconn' undeclared (first use in this function)
    foo.c:35: `PGresult' undeclared (first use in this function)
    foo.c:54: `CONNECTION_BAD' undeclared (first use in this function)
    foo.c:68: `PGRES_COMMAND_OK' undeclared (first use in this function)
    foo.c:95: `PGRES_TUPLES_OK' undeclared (first use in this function)
    

  • Point your compiler to the directory where the Postgres Pro header files were installed, by supplying the -Idirectory option to your compiler. (In some cases the compiler will look into the directory in question by default, so you can omit this option.) For instance, your compile command line could look like:

    cc -c -I/usr/local/pgsql/include testprog.c
    

    If you are using makefiles then add the option to the CPPFLAGS variable:

    CPPFLAGS += -I/usr/local/pgsql/include
    

    If there is any chance that your program might be compiled by other users then you should not hardcode the directory location like that. Instead, you can run the utility pg_config to find out where the header files are on the local system:

    $ pg_config --includedir
    /usr/local/include
    

    If you have pkg-config installed, you can run instead:

    $ pkg-config --cflags libpq
    -I/usr/local/include
    

    Note that this will already include the -I in front of the path.

    Failure to specify the correct option to the compiler will result in an error message such as:

    testlibpq.c:8:22: libpq-fe.h: No such file or directory
    

  • When linking the final program, specify the option -lpq so that the libpq library gets pulled in, as well as the option -Ldirectory to point the compiler to the directory where the libpq library resides. (Again, the compiler will search some directories by default.) For maximum portability, put the -L option before the -lpq option. For example:

    cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq
    

    You can find out the library directory using pg_config as well:

    $ pg_config --libdir
    /usr/local/pgsql/lib
    

    Or again use pkg-config:

    $ pkg-config --libs libpq
    -L/usr/local/pgsql/lib -lpq
    

    Note again that this prints the full options, not only the path.

    Error messages that point to problems in this area could look like the following:

    testlibpq.o: In function `main':
    testlibpq.o(.text+0x60): undefined reference to `PQsetdbLogin'
    testlibpq.o(.text+0x71): undefined reference to `PQstatus'
    testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
    

    This means you forgot -lpq.

    /usr/bin/ld: cannot find -lpq
    

    This means you forgot the -L option or did not specify the right directory.