Серверный API PostgreSQL: как найти путь к базе данных?

0

Хорошо, может быть, неправильно. Но хотите научить PostgreSQL распространять файлы с функциями расширения в C++. Проект работает в локальной сети и может составлять примерно десять подключений. Я не хочу иметь FTP или другие внешние решения для хранения изображений. Я не хочу хранить изображения в базе данных. Мне бы хотелось: fs_select_file(id), fs_insert_file(id, escaped_bytea), fs_delete_file(id), например SELECT id, name, fs_select_file(id) as escaped_bytea FROM... Но не можете найти, как определить путь к текущей базе данных, чтобы использовать [PGDATA]/files.

Теги:

2 ответа

3
Лучший ответ

Не связывайтесь с данными.

Даже если вы считаете безопасным создание собственного содержимого внутри него, возможно, это не так. Такие инструменты, как pg_basebackup, не ожидают увидеть его.

Храните свой собственный контент вне каталога данных PostgreSQL. Если вы работаете с расширением C, достаточно простым, просто позвольте пользователю настроить хранилище с помощью настраиваемой строки GUC (см. DefineCustomStringVariable).


В любом случае вы можете найти определение data_directory GUC в src/backend/utils/misc/guc.c Там вы увидите, что он сопоставлен с глобальным char * data_directory. Быстрый:

$ git grep data_directory src/include
src/include/utils/guc.h:extern char *data_directory;                                                                                                                           

показывает, что extern для него находится в guc.h Таким образом, вы можете получить к нему доступ:

#include "utils/guc.h"

затем с использованием глобального data_directory. Но вы не должны. Не делай этого. Определите свой собственный GUC, указав расположение отдельного хранилища изображений.


Пока мы на нем. C++.

PostgreSQL - это приложение на C, которое использует обработку ошибок на основе longjmp. Это связано с обработкой исключительных ситуаций C++, а также с сигаретой в кислородной палатке. Исключения C++, пересекающие границы PG_TRY, полностью PG_TRY стек ошибок. Ловушки ошибок PostgreSQL, которые пересекают стек C++, подлежащий размотке (любые объекты стека с деструкторами, блоки try/catch и т.д.) Полностью изменят состояние C++.

Возможно, но сложно объединить PostgreSQL и C++. Вы должны изолировать каждую часть с помощью интерфейса чистого кода C и быть параноидальным в отношении улавливания и перевода условий ошибки на всех границах.

Если это вообще возможно, вам следует вместо этого использовать C или по крайней мере инкапсулировать ваш код C++ в отдельную библиотеку, которая никогда не включает заголовки PostgreSQL и никогда не будет переходить обратно в код PostgreSQL. В документации это обсуждается чуть подробнее.

  • 0
    Спасибо за ответ и советы по использованию C ++. Проблема решена . И имеет смысл использовать домашний каталог пользователя, например: ~/pg_files_storage/[database name] . Однако база расположена на внешнем диске, поэтому желательно использовать путь к базе данных, это возможно относительно хранилища (../[pgdata]/pg_files_storage).
0

SELECT current_setting('data_directory');

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

  • 0
    Я пишу библиотеку на C ++, используя специальный API. Было бы хорошо получить настройки с помощью вызова функции. Как использовать SQL-запрос в библиотеке? И, я обещаю :), я не буду изменять файлы базы данных, мне нужно создать подкаталог для двоичных файлов. Фактически, PostgreSQL будет действовать как файловый сервер.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню