Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/Database/Adapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Utopia\Database\Exception\Conflict as ConflictException;
use Utopia\Database\Exception\Duplicate as DuplicateException;
use Utopia\Database\Exception\Limit as LimitException;
use Utopia\Database\Exception\NotSupported as NotSupportedException;
use Utopia\Database\Exception\Relationship as RelationshipException;
use Utopia\Database\Exception\Restricted as RestrictedException;
use Utopia\Database\Exception\Timeout as TimeoutException;
Expand Down Expand Up @@ -1519,4 +1520,32 @@ public function getSupportForRegex(): bool
{
return $this->getSupportForPCRERegex() || $this->getSupportForPOSIXRegex();
}

/**
* Get the adapter name for error messages
*
* @return string
*/
abstract public function getAdapterName(): string;

/**
* Check if the adapter supports a specific capability
*
* @param Capability $capability
* @return bool
*/
abstract public function supports(Capability $capability): bool;

/**
* Require that a capability is supported, throwing an exception if not
*
* @param Capability $capability
* @throws NotSupportedException
*/
public function requireSupport(Capability $capability): void
{
if (!$this->supports($capability)) {
throw new NotSupportedException($capability->value, $this->getAdapterName());
}
}
}
5 changes: 5 additions & 0 deletions src/Database/Adapter/MariaDB.php
Original file line number Diff line number Diff line change
Expand Up @@ -2283,4 +2283,9 @@ public function getSupportForPOSIXRegex(): bool
{
return false;
}

public function getAdapterName(): string
{
return 'MariaDB';
}
}
59 changes: 59 additions & 0 deletions src/Database/Adapter/Mongo.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use MongoDB\BSON\UTCDateTime;
use stdClass;
use Utopia\Database\Adapter;
use Utopia\Database\Capability;
use Utopia\Database\Change;
use Utopia\Database\Database;
use Utopia\Database\DateTime;
Expand Down Expand Up @@ -3467,4 +3468,62 @@ public function getSupportForTrigramIndex(): bool
{
return false;
}

public function getAdapterName(): string
{
return 'MongoDB';
}

public function supports(Capability $capability): bool
{
return match ($capability) {
Capability::Schemas => $this->getSupportForSchemas(),
Capability::Attributes => $this->getSupportForAttributes(),
Capability::SchemaAttributes => $this->getSupportForSchemaAttributes(),
Capability::Index => $this->getSupportForIndex(),
Capability::IndexArray => $this->getSupportForIndexArray(),
Capability::CastIndexArray => $this->getSupportForCastIndexArray(),
Capability::UniqueIndex => $this->getSupportForUniqueIndex(),
Capability::FulltextIndex => $this->getSupportForFulltextIndex(),
Capability::FulltextWildcardIndex => $this->getSupportForFulltextWildcardIndex(),
Capability::MultipleFulltextIndexes => $this->getSupportForMultipleFulltextIndexes(),
Capability::TrigramIndex => $this->getSupportForTrigramIndex(),
Capability::IdenticalIndexes => $this->getSupportForIdenticalIndexes(),
Capability::Casting => $this->getSupportForCasting(),
Capability::NumericCasting => false,
Capability::InternalCasting => $this->getSupportForInternalCasting(),
Capability::UTCCasting => $this->getSupportForUTCCasting(),
Capability::QueryContains => $this->getSupportForQueryContains(),
Capability::JSONOverlaps => false,
Capability::Timeouts => $this->getSupportForTimeouts(),
Capability::Relationships => $this->getSupportForRelationships(),
Capability::UpdateLock => $this->getSupportForUpdateLock(),
Capability::BatchOperations => $this->getSupportForBatchOperations(),
Capability::AttributeResizing => $this->getSupportForAttributeResizing(),
Capability::GetConnectionId => $this->getSupportForGetConnectionId(),
Capability::Upserts => $this->getSupportForUpserts(),
Capability::Vectors => $this->getSupportForVectors(),
Capability::CacheSkipOnFailure => $this->getSupportForCacheSkipOnFailure(),
Capability::Reconnection => $this->getSupportForReconnection(),
Capability::Hostname => $this->getSupportForHostname(),
Capability::BatchCreateAttributes => $this->getSupportForBatchCreateAttributes(),
Capability::SpatialAttributes => $this->getSupportForSpatialAttributes(),
Capability::SpatialIndexNull => $this->getSupportForSpatialIndexNull(),
Capability::SpatialIndexOrder => $this->getSupportForSpatialIndexOrder(),
Capability::SpatialAxisOrder => $this->getSupportForSpatialAxisOrder(),
Capability::OptionalSpatialAttributeWithExistingRows => $this->getSupportForOptionalSpatialAttributeWithExistingRows(),
Capability::BoundaryInclusiveContains => $this->getSupportForBoundaryInclusiveContains(),
Capability::DistanceBetweenMultiDimensionGeometryInMeters => $this->getSupportForDistanceBetweenMultiDimensionGeometryInMeters(),
Capability::Object => $this->getSupportForObject(),
Capability::ObjectIndexes => $this->getSupportForObjectIndexes(),
Capability::Operators => $this->getSupportForOperators(),
Capability::OrderRandom => $this->getSupportForOrderRandom(),
Capability::AlterLocks => $this->getSupportForAlterLocks(),
Capability::NonUtfCharacters => $this->getSupportNonUtfCharacters(),
Capability::IntegerBooleans => $this->getSupportForIntegerBooleans(),
Capability::PCRERegex => $this->getSupportForPCRERegex(),
Capability::POSIXRegex => $this->getSupportForPOSIXRegex(),
Capability::Regex => $this->getSupportForRegex(),
};
}
}
5 changes: 5 additions & 0 deletions src/Database/Adapter/MySQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -319,4 +319,9 @@ protected function getOperatorSQL(string $column, \Utopia\Database\Operator $ope
// For all other operators, use parent implementation
return parent::getOperatorSQL($column, $operator, $bindIndex);
}

public function getAdapterName(): string
{
return 'MySQL';
}
}
11 changes: 11 additions & 0 deletions src/Database/Adapter/Pool.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Utopia\Database\Adapter;

use Utopia\Database\Adapter;
use Utopia\Database\Capability;
use Utopia\Database\Database;
use Utopia\Database\Document;
use Utopia\Database\Exception as DatabaseException;
Expand Down Expand Up @@ -642,4 +643,14 @@ public function getSupportNonUtfCharacters(): bool
{
return $this->delegate(__FUNCTION__, \func_get_args());
}

public function getAdapterName(): string
{
return $this->delegate(__FUNCTION__, \func_get_args());
}

public function supports(Capability $capability): bool
{
return $this->delegate(__FUNCTION__, \func_get_args());
}
}
5 changes: 5 additions & 0 deletions src/Database/Adapter/Postgres.php
Original file line number Diff line number Diff line change
Expand Up @@ -2842,4 +2842,9 @@ protected function getSQLTable(string $name): string

return "{$this->quote($this->getDatabase())}.{$this->quote($table)}";
}

public function getAdapterName(): string
{
return 'PostgreSQL';
}
}
59 changes: 59 additions & 0 deletions src/Database/Adapter/SQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use PDOException;
use Swoole\Database\PDOStatementProxy;
use Utopia\Database\Adapter;
use Utopia\Database\Capability;
use Utopia\Database\Change;
use Utopia\Database\Database;
use Utopia\Database\DateTime;
Expand Down Expand Up @@ -3574,4 +3575,62 @@ public function getLockType(): string

return '';
}

public function getAdapterName(): string
{
return 'SQL';
}

public function supports(Capability $capability): bool
{
return match ($capability) {
Capability::Schemas => $this->getSupportForSchemas(),
Capability::Attributes => $this->getSupportForAttributes(),
Capability::SchemaAttributes => $this->getSupportForSchemaAttributes(),
Capability::Index => $this->getSupportForIndex(),
Capability::IndexArray => $this->getSupportForIndexArray(),
Capability::CastIndexArray => $this->getSupportForCastIndexArray(),
Capability::UniqueIndex => $this->getSupportForUniqueIndex(),
Capability::FulltextIndex => $this->getSupportForFulltextIndex(),
Capability::FulltextWildcardIndex => $this->getSupportForFulltextWildcardIndex(),
Capability::MultipleFulltextIndexes => $this->getSupportForMultipleFulltextIndexes(),
Capability::TrigramIndex => $this->getSupportForTrigramIndex(),
Capability::IdenticalIndexes => $this->getSupportForIdenticalIndexes(),
Capability::Casting => $this->getSupportForCasting(),
Capability::NumericCasting => $this->getSupportForNumericCasting(),
Capability::InternalCasting => $this->getSupportForInternalCasting(),
Capability::UTCCasting => $this->getSupportForUTCCasting(),
Capability::QueryContains => $this->getSupportForQueryContains(),
Capability::JSONOverlaps => $this->getSupportForJSONOverlaps(),
Capability::Timeouts => $this->getSupportForTimeouts(),
Capability::Relationships => $this->getSupportForRelationships(),
Capability::UpdateLock => $this->getSupportForUpdateLock(),
Capability::BatchOperations => $this->getSupportForBatchOperations(),
Capability::AttributeResizing => $this->getSupportForAttributeResizing(),
Capability::GetConnectionId => $this->getSupportForGetConnectionId(),
Capability::Upserts => $this->getSupportForUpserts(),
Capability::Vectors => $this->getSupportForVectors(),
Capability::CacheSkipOnFailure => $this->getSupportForCacheSkipOnFailure(),
Capability::Reconnection => $this->getSupportForReconnection(),
Capability::Hostname => $this->getSupportForHostname(),
Capability::BatchCreateAttributes => $this->getSupportForBatchCreateAttributes(),
Capability::SpatialAttributes => $this->getSupportForSpatialAttributes(),
Capability::SpatialIndexNull => $this->getSupportForSpatialIndexNull(),
Capability::SpatialIndexOrder => $this->getSupportForSpatialIndexOrder(),
Capability::SpatialAxisOrder => $this->getSupportForSpatialAxisOrder(),
Capability::OptionalSpatialAttributeWithExistingRows => $this->getSupportForOptionalSpatialAttributeWithExistingRows(),
Capability::BoundaryInclusiveContains => $this->getSupportForBoundaryInclusiveContains(),
Capability::DistanceBetweenMultiDimensionGeometryInMeters => $this->getSupportForDistanceBetweenMultiDimensionGeometryInMeters(),
Capability::Object => $this->getSupportForObject(),
Capability::ObjectIndexes => $this->getSupportForObjectIndexes(),
Capability::Operators => $this->getSupportForOperators(),
Capability::OrderRandom => $this->getSupportForOrderRandom(),
Capability::AlterLocks => $this->getSupportForAlterLocks(),
Capability::NonUtfCharacters => $this->getSupportNonUtfCharacters(),
Capability::IntegerBooleans => $this->getSupportForIntegerBooleans(),
Capability::PCRERegex => $this->getSupportForPCRERegex(),
Capability::POSIXRegex => $this->getSupportForPOSIXRegex(),
Capability::Regex => $this->getSupportForRegex(),
};
}
}
5 changes: 5 additions & 0 deletions src/Database/Adapter/SQLite.php
Original file line number Diff line number Diff line change
Expand Up @@ -1913,4 +1913,9 @@ public function getSupportForPOSIXRegex(): bool
{
return false;
}

public function getAdapterName(): string
{
return 'SQLite';
}
}
58 changes: 58 additions & 0 deletions src/Database/Capability.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

namespace Utopia\Database;

/**
* Enum representing database adapter capabilities.
* Used to check if an adapter supports a specific feature.
*/
enum Capability: string
{
case Schemas = 'schemas';
case Attributes = 'attributes';
case SchemaAttributes = 'schema_attributes';
case Index = 'index';
case IndexArray = 'index_array';
case CastIndexArray = 'cast_index_array';
case UniqueIndex = 'unique_index';
case FulltextIndex = 'fulltext_index';
case FulltextWildcardIndex = 'fulltext_wildcard_index';
case MultipleFulltextIndexes = 'multiple_fulltext_indexes';
case TrigramIndex = 'trigram_index';
case IdenticalIndexes = 'identical_indexes';
case Casting = 'casting';
case NumericCasting = 'numeric_casting';
case InternalCasting = 'internal_casting';
case UTCCasting = 'utc_casting';
case QueryContains = 'query_contains';
case JSONOverlaps = 'json_overlaps';
case Timeouts = 'timeouts';
case Relationships = 'relationships';
case UpdateLock = 'update_lock';
case BatchOperations = 'batch_operations';
case AttributeResizing = 'attribute_resizing';
case GetConnectionId = 'get_connection_id';
case Upserts = 'upserts';
case Vectors = 'vectors';
case CacheSkipOnFailure = 'cache_skip_on_failure';
case Reconnection = 'reconnection';
case Hostname = 'hostname';
case BatchCreateAttributes = 'batch_create_attributes';
case SpatialAttributes = 'spatial_attributes';
case SpatialIndexNull = 'spatial_index_null';
case SpatialIndexOrder = 'spatial_index_order';
case SpatialAxisOrder = 'spatial_axis_order';
case OptionalSpatialAttributeWithExistingRows = 'optional_spatial_attribute_with_existing_rows';
case BoundaryInclusiveContains = 'boundary_inclusive_contains';
case DistanceBetweenMultiDimensionGeometryInMeters = 'distance_between_multi_dimension_geometry_in_meters';
case Object = 'object';
case ObjectIndexes = 'object_indexes';
case Operators = 'operators';
case OrderRandom = 'order_random';
case AlterLocks = 'alter_locks';
case NonUtfCharacters = 'non_utf_characters';
case IntegerBooleans = 'integer_booleans';
case PCRERegex = 'pcre_regex';
case POSIXRegex = 'posix_regex';
case Regex = 'regex';
}
11 changes: 11 additions & 0 deletions src/Database/Database.php
Original file line number Diff line number Diff line change
Expand Up @@ -1493,6 +1493,17 @@ public function getAdapter(): Adapter
return $this->adapter;
}

/**
* Check if the adapter supports a specific capability
*
* @param Capability $capability
* @return bool
*/
public function supports(Capability $capability): bool
{
return $this->adapter->supports($capability);
}

/**
* Run a callback inside a transaction.
*
Expand Down
13 changes: 13 additions & 0 deletions src/Database/Exception/NotSupported.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Utopia\Database\Exception;

use Utopia\Database\Exception;

class NotSupported extends Exception
{
public function __construct(string $capability, string $adapter)
{
parent::__construct("Capability '{$capability}' is not supported by adapter '{$adapter}'");
}
}
Loading