Skip to content

Commit 375baa1

Browse files
Merge pull request #318 from utopia-php/feat-internal-id-support-old-version
2 parents c1ed979 + 7ca5ac3 commit 375baa1

File tree

5 files changed

+74
-6
lines changed

5 files changed

+74
-6
lines changed

src/Database/Adapter/MariaDB.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -496,12 +496,23 @@ public function createDocument(string $collection, Document $document): Document
496496
$bindIndex++;
497497
}
498498

499+
// Insert manual id if set
500+
if (!empty($document->getInternalId())) {
501+
$bindKey = '_id';
502+
$columns .= " _id" . ' = :' . $bindKey . ',';
503+
}
504+
499505
$stmt = $this->getPDO()
500506
->prepare("INSERT INTO {$this->getSQLTable($name)}
501507
SET {$columns} _uid = :_uid");
502508

503509
$stmt->bindValue(':_uid', $document->getId(), PDO::PARAM_STR);
504510

511+
// Bind manual internal id if set
512+
if (!empty($document->getInternalId())) {
513+
$stmt->bindValue(':_id', $document->getInternalId(), PDO::PARAM_STR);
514+
}
515+
505516
$attributeIndex = 0;
506517
foreach ($attributes as $attribute => $value) {
507518
if (is_array($value)) { // arrays & objects should be saved as strings
@@ -531,11 +542,7 @@ public function createDocument(string $collection, Document $document): Document
531542
try {
532543
$stmt->execute();
533544

534-
$statment = $this->getPDO()->prepare("select last_insert_id() as id");
535-
$statment->execute();
536-
$last = $statment->fetch();
537-
$document['$internalId'] = $last['id'];
538-
545+
$document['$internalId'] = $this->getDocument($collection, $document->getId())->getInternalId();
539546
if (isset($stmtPermissions)) {
540547
$stmtPermissions->execute();
541548
}

src/Database/Adapter/Mongo/MongoDBAdapter.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,11 @@ public function createDocument(string $collection, Document $document): Document
386386

387387
$record = $this->replaceChars('$', '_', $document->getArrayCopy());
388388

389+
// Insert manual id if set
390+
if (!empty($internalId)) {
391+
$record['_id'] = $internalId;
392+
}
393+
389394
$this->client->insert($name, $record);
390395

391396
return $document;

src/Database/Adapter/SQLite.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,12 +319,23 @@ public function createDocument(string $collection, Document $document): Document
319319
$bindIndex++;
320320
}
321321

322+
// Insert manual id if set
323+
if (!empty($document->getInternalId())) {
324+
$values[] = '_id';
325+
$columns[] = "_id";
326+
}
327+
322328
$stmt = $this->getPDO()
323329
->prepare("INSERT INTO `{$this->getNamespace()}_{$name}`
324330
(".implode(', ', $columns).") VALUES (:".implode(', :', $values).");");
325331

326332
$stmt->bindValue(':_uid', $document->getId(), PDO::PARAM_STR);
327333

334+
// Bind manual internal id if set
335+
if (!empty($document->getInternalId())) {
336+
$stmt->bindValue(':_id', $document->getInternalId(), PDO::PARAM_STR);
337+
}
338+
328339
$attributeIndex = 0;
329340
foreach ($attributes as $attribute => $value) {
330341
if (is_array($value)) { // arrays & objects should be saved as strings

src/Database/Validator/Structure.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class Structure extends Validator
3434
[
3535
'$id' => '$internalId',
3636
'type' => Database::VAR_STRING,
37-
'size' => 64,
37+
'size' => 0,
3838
'required' => false,
3939
'signed' => true,
4040
'array' => false,

tests/Database/Base.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,50 @@ public function testCreateDocument()
605605
$this->assertEquals([], $document->getAttribute('empty'));
606606
$this->assertEquals('Works', $document->getAttribute('with-dash'));
607607

608+
// Test create document with manual internal id
609+
$manualIdDocument = static::getDatabase()->createDocument('documents', new Document([
610+
'$internalId' => '56000',
611+
'$permissions' => [
612+
Permission::read(Role::any()),
613+
Permission::read(Role::user(ID::custom('1'))),
614+
Permission::read(Role::user(ID::custom('2'))),
615+
Permission::create(Role::any()),
616+
Permission::create(Role::user(ID::custom('1x'))),
617+
Permission::create(Role::user(ID::custom('2x'))),
618+
Permission::update(Role::any()),
619+
Permission::update(Role::user(ID::custom('1x'))),
620+
Permission::update(Role::user(ID::custom('2x'))),
621+
Permission::delete(Role::any()),
622+
Permission::delete(Role::user(ID::custom('1x'))),
623+
Permission::delete(Role::user(ID::custom('2x'))),
624+
],
625+
'string' => 'text📝',
626+
'integer' => 5,
627+
'bigint' => 8589934592, // 2^33
628+
'float' => 5.55,
629+
'boolean' => true,
630+
'colors' => ['pink', 'green', 'blue'],
631+
'empty' => [],
632+
'with-dash' => 'Works',
633+
]));
634+
635+
$this->assertEquals('56000', $manualIdDocument->getInternalId());
636+
$this->assertNotEmpty(true, $manualIdDocument->getId());
637+
$this->assertIsString($manualIdDocument->getAttribute('string'));
638+
$this->assertEquals('text📝', $manualIdDocument->getAttribute('string')); // Also makes sure an emoji is working
639+
$this->assertIsInt($manualIdDocument->getAttribute('integer'));
640+
$this->assertEquals(5, $manualIdDocument->getAttribute('integer'));
641+
$this->assertIsInt($manualIdDocument->getAttribute('bigint'));
642+
$this->assertEquals(8589934592, $manualIdDocument->getAttribute('bigint'));
643+
$this->assertIsFloat($manualIdDocument->getAttribute('float'));
644+
$this->assertEquals(5.55, $manualIdDocument->getAttribute('float'));
645+
$this->assertIsBool($manualIdDocument->getAttribute('boolean'));
646+
$this->assertEquals(true, $manualIdDocument->getAttribute('boolean'));
647+
$this->assertIsArray($manualIdDocument->getAttribute('colors'));
648+
$this->assertEquals(['pink', 'green', 'blue'], $manualIdDocument->getAttribute('colors'));
649+
$this->assertEquals([], $manualIdDocument->getAttribute('empty'));
650+
$this->assertEquals('Works', $manualIdDocument->getAttribute('with-dash'));
651+
608652
return $document;
609653
}
610654

@@ -2636,6 +2680,7 @@ public function testExceptionDuplicate(Document $document)
26362680
public function testExceptionCaseInsensitiveDuplicate(Document $document)
26372681
{
26382682
$document->setAttribute('$id', 'caseSensitive');
2683+
$document->setAttribute('$internalId', '200');
26392684
static::getDatabase()->createDocument($document->getCollection(), $document);
26402685

26412686
$document->setAttribute('$id', 'CaseSensitive');

0 commit comments

Comments
 (0)