Read-only SQL-бэкенд файлового клиента: file_pg.go — pgStore на database/sql, реализует FileStore (List/Stat/Download) и Searcher
по имени. Все write-методы возвращают ErrReadOnly. Name() — фактический
движок (mysql/postgres).
Research — БД на самом деле MySQL, не PostgreSQL
Community Server в VM onlyoffice-v2 работает на MySQL 8.0
(127.0.0.1:3306, база onlyoffice, providerName: MySql.Data.MySqlClient).
Таблицы files_file/files_folder/files_folder_tree/files_security,
тенанты — tenants_tenants.
PostgreSQL 16 в той же VM — наш контур edw_docs (роли edw/edw_ro), files_file там нет.
Поэтому pgStore выбирает драйвер по DSN: mysql (live) или pgx
(PostgreSQL, если портал перенесут). Оба пути живые: MySQL — integration,
pgx — проверен подключением к edw_ro.
Download
Через MinIO (storage_fallback.go), REST не используется. Ключ 00/00/<tenant>/files/folder_<shard>/file_<id>/v<version>/content.<ext>,
где shard = (id/1000+1)*1000 (файл 3727 → folder_4000, не folder_id).
Стриминг переиспользует новый общий downloadMinioObject.
Integration (file_pg_integration_test.go, //go:build integration, skip без ONLYOFFICE_DSN): TestIntegrationPGStore — PASS live (backend mysql;
Stat/List/Download vs REST, read-only, байтовое сравнение download).
go build ./... && go vet ./... && go test -race ./... — зелёные.
gitleaks — no leaks found. Секретов нет.
Док: docs/community-server-db.md; имена env — в .env.example.
Ветка feat/pg-store#36, коммит bf3ef02. Не мержу и не закрываю.
Closes #36 (F2 эпика #34).
## Что сделано
Read-only SQL-бэкенд файлового клиента: `file_pg.go` — `pgStore` на
`database/sql`, реализует `FileStore` (`List`/`Stat`/`Download`) и `Searcher`
по имени. Все write-методы возвращают `ErrReadOnly`. `Name()` — фактический
движок (`mysql`/`postgres`).
## Research — БД на самом деле MySQL, не PostgreSQL
- Community Server в VM `onlyoffice-v2` работает на **MySQL 8.0**
(`127.0.0.1:3306`, база `onlyoffice`, `providerName: MySql.Data.MySqlClient`).
Таблицы `files_file`/`files_folder`/`files_folder_tree`/`files_security`,
тенанты — `tenants_tenants`.
- PostgreSQL 16 в той же VM — наш контур `edw_docs` (роли `edw`/`edw_ro`),
`files_file` там нет.
- Поэтому `pgStore` выбирает драйвер по DSN: `mysql` (live) или `pgx`
(PostgreSQL, если портал перенесут). Оба пути живые: MySQL — integration,
pgx — проверен подключением к `edw_ro`.
## Download
Через MinIO (`storage_fallback.go`), REST не используется. Ключ
`00/00/<tenant>/files/folder_<shard>/file_<id>/v<version>/content.<ext>`,
где `shard = (id/1000+1)*1000` (файл 3727 → folder_4000, не folder_id).
Стриминг переиспользует новый общий `downloadMinioObject`.
## Тесты
- Unit (`file_pg_test.go`): `TestRebind`, `TestCSPObjectKey`,
`TestPGDriverDetection`, `TestNormalizeSQLDSNMySQL`, `TestFileRowToEntry`,
`TestFolderRowToEntry`, `TestPGStoreWriteMethodsReadOnly`, `TestPGStoreName`,
`TestPGStoreStatRejectsNonNumeric` — PASS.
- Integration (`file_pg_integration_test.go`, `//go:build integration`, skip без
`ONLYOFFICE_DSN`): `TestIntegrationPGStore` — PASS live (backend mysql;
Stat/List/Download vs REST, read-only, байтовое сравнение download).
- `go build ./... && go vet ./... && go test -race ./...` — зелёные.
gitleaks — no leaks found. Секретов нет.
- Док: `docs/community-server-db.md`; имена env — в `.env.example`.
Ветка `feat/pg-store#36`, коммит `bf3ef02`. Не мержу и не закрываю.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #36 (F2 эпика #34).
Что сделано
Read-only SQL-бэкенд файлового клиента:
file_pg.go—pgStoreнаdatabase/sql, реализуетFileStore(List/Stat/Download) иSearcherпо имени. Все write-методы возвращают
ErrReadOnly.Name()— фактическийдвижок (
mysql/postgres).Research — БД на самом деле MySQL, не PostgreSQL
onlyoffice-v2работает на MySQL 8.0(
127.0.0.1:3306, базаonlyoffice,providerName: MySql.Data.MySqlClient).Таблицы
files_file/files_folder/files_folder_tree/files_security,тенанты —
tenants_tenants.edw_docs(ролиedw/edw_ro),files_fileтам нет.pgStoreвыбирает драйвер по DSN:mysql(live) илиpgx(PostgreSQL, если портал перенесут). Оба пути живые: MySQL — integration,
pgx — проверен подключением к
edw_ro.Download
Через MinIO (
storage_fallback.go), REST не используется. Ключ00/00/<tenant>/files/folder_<shard>/file_<id>/v<version>/content.<ext>,где
shard = (id/1000+1)*1000(файл 3727 → folder_4000, не folder_id).Стриминг переиспользует новый общий
downloadMinioObject.Тесты
file_pg_test.go):TestRebind,TestCSPObjectKey,TestPGDriverDetection,TestNormalizeSQLDSNMySQL,TestFileRowToEntry,TestFolderRowToEntry,TestPGStoreWriteMethodsReadOnly,TestPGStoreName,TestPGStoreStatRejectsNonNumeric— PASS.file_pg_integration_test.go,//go:build integration, skip безONLYOFFICE_DSN):TestIntegrationPGStore— PASS live (backend mysql;Stat/List/Download vs REST, read-only, байтовое сравнение download).
go build ./... && go vet ./... && go test -race ./...— зелёные.gitleaks — no leaks found. Секретов нет.
docs/community-server-db.md; имена env — в.env.example.Ветка
feat/pg-store#36, коммитbf3ef02. Не мержу и не закрываю.