Хорошо, может быть, неправильно. Но хотите научить 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
.
Не связывайтесь с данными.
Даже если вы считаете безопасным создание собственного содержимого внутри него, возможно, это не так. Такие инструменты, как 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. В документации это обсуждается чуть подробнее.
SELECT current_setting('data_directory');
Это покажет вам полный путь к каталогу данных. Я не понимаю, зачем вам это нужно, потому что обман в файлах данных обычно является хорошим способом повредить вашу базу данных. Во всяком случае, я думаю, что это тот ответ, который вы ищете.
~/pg_files_storage/[database name]
. Однако база расположена на внешнем диске, поэтому желательно использовать путь к базе данных, это возможно относительно хранилища (../[pgdata]/pg_files_storage).