Use DSN for project database

This commit is contained in:
Jake Barnby
2024-05-06 17:33:36 +12:00
parent c4deb0ba93
commit db94070162
8 changed files with 77 additions and 46 deletions
+8 -5
View File
@@ -16,6 +16,7 @@ use Utopia\Config\Config;
use Utopia\Database\Database;
use Utopia\Database\Document;
use Utopia\Database\Validator\Authorization;
use Utopia\DSN\DSN;
use Utopia\Logger\Log;
use Utopia\Platform\Service;
use Utopia\Pools\Group;
@@ -99,16 +100,18 @@ CLI::setResource('getProjectDB', function (Group $pools, Database $dbForConsole,
return $dbForConsole;
}
$databaseName = $project->getAttribute('database');
$dsn = new DSN($project->getAttribute('database'));
$databaseName = empty($dsn->getHost()) ? $dsn->getPath() : $dsn->getHost();
if (isset($databases[$databaseName])) {
$database = $databases[$databaseName];
if ($project->getAttribute('database') === DATABASE_SHARED_TABLES) {
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$database
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
@@ -128,11 +131,11 @@ CLI::setResource('getProjectDB', function (Group $pools, Database $dbForConsole,
$databases[$databaseName] = $database;
if ($project->getAttribute('database') === DATABASE_SHARED_TABLES) {
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$database
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
+27 -10
View File
@@ -30,6 +30,7 @@ use Utopia\Database\Query;
use Utopia\Database\Validator\Datetime as DatetimeValidator;
use Utopia\Database\Validator\UID;
use Utopia\Domains\Validator\PublicDomain;
use Utopia\DSN\DSN;
use Utopia\Locale\Locale;
use Utopia\Pools\Group;
use Utopia\System\System;
@@ -142,9 +143,9 @@ App::post('/v1/projects')
$databaseOverride = App::getEnv('_APP_DATABASE_OVERRIDE');
$index = \array_search($databaseOverride, $databases);
if ($index !== false) {
$database = $databases[$index];
$dsn = $databases[$index];
} else {
$database = $databases[array_rand($databases)];
$dsn = $databases[array_rand($databases)];
}
if ($projectId === 'console') {
@@ -156,7 +157,14 @@ App::post('/v1/projects')
!\mt_rand(0, 19)
&& App::getEnv('_APP_EDITION', 'self-hosted') !== 'self-hosted'
) {
$database = DATABASE_SHARED_TABLES;
$schema = 'appwrite';
$database = 'appwrite';
$namespace = App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', '');
$dsn = $schema . '://' . DATABASE_SHARED_TABLES . '?database=' . $database;
if (!empty($namespace)) {
$dsn .= '&namespace=' . $namespace;
}
}
// TODO: Allow overriding in development mode. Temporary until all projects are using shared tables.
@@ -165,7 +173,14 @@ App::post('/v1/projects')
&& App::getEnv('_APP_EDITION', 'self-hosted') !== 'self-hosted'
&& $request->getHeader('x-appwrite-share-tables', false)
) {
$database = DATABASE_SHARED_TABLES;
$schema = 'appwrite';
$database = 'appwrite';
$namespace = App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', '');
$dsn = $schema . '://' . DATABASE_SHARED_TABLES . '?database=' . $database;
if (!empty($namespace)) {
$dsn .= '&namespace=' . $namespace;
}
}
try {
@@ -199,19 +214,21 @@ App::post('/v1/projects')
'keys' => null,
'auths' => $auths,
'search' => implode(' ', [$projectId, $name]),
'database' => $database,
'database' => $dsn,
]));
} catch (Duplicate) {
throw new Exception(Exception::PROJECT_ALREADY_EXISTS);
}
$dbForProject = new Database($pools->get($database)->pop()->getResource(), $cache);
$dsn = new DSN($dsn);
$databaseName = empty($dsn->getHost()) ? $dsn->getPath() : $dsn->getHost();
$dbForProject = new Database($pools->get($databaseName)->pop()->getResource(), $cache);
if ($database === DATABASE_SHARED_TABLES) {
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$dbForProject
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$dbForProject
->setSharedTables(false)
@@ -224,8 +241,8 @@ App::post('/v1/projects')
$audit = new Audit($dbForProject);
$audit->setup();
$adapter = new TimeLimit('', 0, 1, $dbForProject);
$adapter->setup();
$abuse = new TimeLimit('', 0, 1, $dbForProject);
$abuse->setup();
/** @var array $collections */
$collections = Config::getParam('collections', [])['projects'] ?? [];
+9 -6
View File
@@ -1314,11 +1314,13 @@ App::setResource('dbForProject', function (Group $pools, Database $dbForConsole,
->setMetadata('project', $project->getId())
->setTimeout(APP_DATABASE_TIMEOUT_MILLISECONDS);
if ($project->getAttribute('database') === DATABASE_SHARED_TABLES) {
$dsn = new DSN($project->getAttribute('database'));
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$database
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
@@ -1354,19 +1356,20 @@ App::setResource('getProjectDB', function (Group $pools, Database $dbForConsole,
return $dbForConsole;
}
$databaseName = $project->getAttribute('database');
$dsn = new DSN($project->getAttribute('database'));
$databaseName = empty($dsn->getHost()) ? $dsn->getPath() : $dsn->getHost();
$configure = (function (Database $database) use ($project) {
$configure = (function (Database $database) use ($project, $dsn) {
$database
->setMetadata('host', \gethostname())
->setMetadata('project', $project->getId())
->setTimeout(APP_DATABASE_TIMEOUT_MILLISECONDS);
if ($project->getAttribute('database') === DATABASE_SHARED_TABLES) {
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$database
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
+10 -7
View File
@@ -26,6 +26,7 @@ use Utopia\Database\Helpers\ID;
use Utopia\Database\Helpers\Role;
use Utopia\Database\Query;
use Utopia\Database\Validator\Authorization;
use Utopia\DSN\DSN;
use Utopia\Logger\Log;
use Utopia\System\System;
use Utopia\WebSocket\Adapter;
@@ -77,19 +78,21 @@ if (!function_exists("getProjectDB")) {
return getConsoleDB();
}
$dbAdapter = $pools
->get($project->getAttribute('database'))
$dsn = new DSN($project->getAttribute('database'));
$databaseName = empty($dsn->getHost()) ? $dsn->getPath() : $dsn->getHost();
$adapter = $pools
->get($databaseName)
->pop()
->getResource()
;
->getResource();
$database = new Database($dbAdapter, getCache());
$database = new Database($adapter, getCache());
if ($project->getAttribute('database') === DATABASE_SHARED_TABLES) {
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$database
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
+11 -7
View File
@@ -25,6 +25,7 @@ use Utopia\Database\Database;
use Utopia\Database\DateTime;
use Utopia\Database\Document;
use Utopia\Database\Validator\Authorization;
use Utopia\DSN\DSN;
use Utopia\Logger\Log;
use Utopia\Logger\Logger;
use Utopia\Platform\Service;
@@ -79,11 +80,13 @@ Server::setResource('dbForProject', function (Cache $cache, Registry $register,
$database = new Database($adapter, $cache);
if ($project->getAttribute('database') === DATABASE_SHARED_TABLES) {
$dsn = new DSN($project->getAttribute('database'));
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$database
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
@@ -102,16 +105,17 @@ Server::setResource('getProjectDB', function (Group $pools, Database $dbForConso
return $dbForConsole;
}
$databaseName = $project->getAttribute('database');
$dsn = new DSN($project->getAttribute('database'));
$databaseName = empty($dsn->getHost()) ? $dsn->getPath() : $dsn->getHost();
if (isset($databases[$databaseName])) {
$database = $databases[$databaseName];
if ($project->getAttribute('database') === DATABASE_SHARED_TABLES) {
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$database
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
@@ -131,11 +135,11 @@ Server::setResource('getProjectDB', function (Group $pools, Database $dbForConso
$databases[$databaseName] = $database;
if ($project->getAttribute('database') === DATABASE_SHARED_TABLES) {
if ($dsn->getHost() === DATABASE_SHARED_TABLES) {
$database
->setSharedTables(true)
->setTenant($project->getInternalId())
->setNamespace(App::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''));
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
+1 -1
View File
@@ -52,7 +52,7 @@
"utopia-php/config": "0.2.*",
"utopia-php/database": "0.49.*",
"utopia-php/domains": "0.5.*",
"utopia-php/dsn": "0.2.*",
"utopia-php/dsn": "dev-feat-allow-nullable-scheme",
"utopia-php/framework": "0.33.*",
"utopia-php/fetch": "0.2.*",
"utopia-php/image": "0.6.*",
Generated
+10 -8
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "28ecd4705def24ce61eee0f6676439d6",
"content-hash": "7276ce4fa8a3c75f95f952153fdca69f",
"packages": [
{
"name": "adhocore/jwt",
@@ -1672,16 +1672,16 @@
},
{
"name": "utopia-php/dsn",
"version": "0.2.0",
"version": "dev-feat-allow-nullable-scheme",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/dsn.git",
"reference": "c11f37a12c3f6aaf9fea97ca7cb363dcc93668d7"
"reference": "09521c1fb6dc5488df5e89eeb6b3ca5e736fd97c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/dsn/zipball/c11f37a12c3f6aaf9fea97ca7cb363dcc93668d7",
"reference": "c11f37a12c3f6aaf9fea97ca7cb363dcc93668d7",
"url": "https://api.github.com/repos/utopia-php/dsn/zipball/09521c1fb6dc5488df5e89eeb6b3ca5e736fd97c",
"reference": "09521c1fb6dc5488df5e89eeb6b3ca5e736fd97c",
"shasum": ""
},
"require": {
@@ -1713,9 +1713,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/dsn/issues",
"source": "https://github.com/utopia-php/dsn/tree/0.2.0"
"source": "https://github.com/utopia-php/dsn/tree/feat-allow-nullable-scheme"
},
"time": "2023-11-02T12:01:43+00:00"
"time": "2024-05-06T05:15:19+00:00"
},
{
"name": "utopia-php/fetch",
@@ -5505,7 +5505,9 @@
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"stability-flags": {
"utopia-php/dsn": 20
},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
+1 -2
View File
@@ -10,8 +10,6 @@ x-logging: &x-logging
max-file: "5"
max-size: "10m"
version: "3"
services:
traefik:
image: traefik:2.11
@@ -94,6 +92,7 @@ services:
- app/http.php
environment:
- _APP_ENV
- _APP_EDITION
- _APP_WORKER_PER_CORE
- _APP_LOCALE
- _APP_CONSOLE_WHITELIST_ROOT