mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2024-12-22 13:12:41 +00:00
Merge from master
This commit is contained in:
commit
7d19a5add0
9 changed files with 88 additions and 66 deletions
|
@ -32,9 +32,10 @@ abstract class AbstractException extends \Exception {
|
|||
"Db/Exception.paramTypeUnknown" => 10222,
|
||||
"Db/Exception.paramTypeMissing" => 10223,
|
||||
"Db/Exception.engineErrorGeneral" => 10224, // this symbol may have engine-specific duplicates to accomodate engine-specific error string construction
|
||||
"Db/Exception.unknownSavepointStatus" => 10225,
|
||||
"Db/ExceptionSavepoint.invalid" => 10226,
|
||||
"Db/ExceptionSavepoint.stale" => 10227,
|
||||
"Db/Exception.savepointStatusUnknown" => 10225,
|
||||
"Db/Exception.savepointInvalid" => 10226,
|
||||
"Db/Exception.savepointStale" => 10227,
|
||||
"Db/Exception.resultReused" => 10227,
|
||||
"Db/ExceptionInput.missing" => 10231,
|
||||
"Db/ExceptionInput.whitespace" => 10232,
|
||||
"Db/ExceptionInput.tooLong" => 10233,
|
||||
|
|
|
@ -60,9 +60,9 @@ abstract class AbstractDriver implements Driver {
|
|||
break;
|
||||
case self::TR_COMMIT:
|
||||
case self::TR_ROLLBACK: //@codeCoverageIgnore
|
||||
throw new ExceptionSavepoint("stale", ['action' => "commit", 'index' => $index]);
|
||||
throw new Exception("savepointStale", ['action' => "commit", 'index' => $index]);
|
||||
default:
|
||||
throw new Exception("unknownSavepointStatus", $this->transStatus[$index]); //@codeCoverageIgnore
|
||||
throw new Exception("savepointStatusUnknown", $this->transStatus[$index]); // @codeCoverageIgnore
|
||||
}
|
||||
if ($index==$this->transDepth) {
|
||||
while ($this->transDepth > 0 && $this->transStatus[$this->transDepth] > self::TR_PEND) {
|
||||
|
@ -76,7 +76,7 @@ abstract class AbstractDriver implements Driver {
|
|||
}
|
||||
return $out;
|
||||
} else {
|
||||
throw new ExceptionSavepoint("invalid", ['action' => "commit", 'index' => $index]);
|
||||
throw new Exception("savepointInvalid", ['action' => "commit", 'index' => $index]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,9 +106,9 @@ abstract class AbstractDriver implements Driver {
|
|||
break;
|
||||
case self::TR_COMMIT:
|
||||
case self::TR_ROLLBACK: //@codeCoverageIgnore
|
||||
throw new ExceptionSavepoint("stale", ['action' => "rollback", 'index' => $index]);
|
||||
throw new Exception("savepointStale", ['action' => "rollback", 'index' => $index]);
|
||||
default:
|
||||
throw new Exception("unknownSavepointStatus", $this->transStatus[$index]); //@codeCoverageIgnore
|
||||
throw new Exception("savepointStatusUnknown", $this->transStatus[$index]); // @codeCoverageIgnore
|
||||
}
|
||||
if ($index==$this->transDepth) {
|
||||
while ($this->transDepth > 0 && $this->transStatus[$this->transDepth] > self::TR_PEND) {
|
||||
|
@ -122,7 +122,7 @@ abstract class AbstractDriver implements Driver {
|
|||
}
|
||||
return $out;
|
||||
} else {
|
||||
throw new ExceptionSavepoint("invalid", ['action' => "rollback", 'index' => $index]);
|
||||
throw new Exception("savepointInvalid", ['action' => "rollback", 'index' => $index]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
55
lib/Db/AbstractResult.php
Normal file
55
lib/Db/AbstractResult.php
Normal file
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
namespace JKingWeb\Arsse\Db;
|
||||
|
||||
abstract class AbstractResult implements Result {
|
||||
protected $pos = 0;
|
||||
protected $cur = null;
|
||||
|
||||
// actual public methods
|
||||
|
||||
public function getValue() {
|
||||
$this->next();
|
||||
if ($this->valid()) {
|
||||
$keys = array_keys($this->cur);
|
||||
return $this->cur[array_shift($keys)];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRow() {
|
||||
$this->next();
|
||||
return ($this->valid() ? $this->cur : null);
|
||||
}
|
||||
|
||||
public function getAll(): array {
|
||||
return iterator_to_array($this, false);
|
||||
}
|
||||
|
||||
abstract public function changes();
|
||||
|
||||
abstract public function lastId();
|
||||
|
||||
// PHP iterator methods
|
||||
|
||||
abstract public function valid();
|
||||
|
||||
public function next() {
|
||||
$this->cur = null;
|
||||
$this->pos += 1;
|
||||
}
|
||||
|
||||
public function current() {
|
||||
return $this->cur;
|
||||
}
|
||||
|
||||
public function key() {
|
||||
return $this->pos;
|
||||
}
|
||||
|
||||
public function rewind() {
|
||||
if ($this->pos) {
|
||||
throw new Exception("resultReused");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
namespace JKingWeb\Arsse\Db;
|
||||
|
||||
class ExceptionSavepoint extends \JKingWeb\Arsse\AbstractException {
|
||||
}
|
|
@ -2,7 +2,9 @@
|
|||
declare(strict_types=1);
|
||||
namespace JKingWeb\Arsse\Db\SQLite3;
|
||||
|
||||
class Result implements \JKingWeb\Arsse\Db\Result {
|
||||
use JKingWeb\Arsse\Db\Exception;
|
||||
|
||||
class Result extends \JKingWeb\Arsse\Db\AbstractResult {
|
||||
protected $st;
|
||||
protected $set;
|
||||
protected $pos = 0;
|
||||
|
@ -12,28 +14,6 @@ class Result implements \JKingWeb\Arsse\Db\Result {
|
|||
|
||||
// actual public methods
|
||||
|
||||
public function getValue() {
|
||||
$this->next();
|
||||
if ($this->valid()) {
|
||||
$keys = array_keys($this->cur);
|
||||
return $this->cur[array_shift($keys)];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRow() {
|
||||
$this->next();
|
||||
return ($this->valid() ? $this->cur : null);
|
||||
}
|
||||
|
||||
public function getAll(): array {
|
||||
$out = [];
|
||||
foreach ($this as $row) {
|
||||
$out [] = $row;
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
public function changes() {
|
||||
return $this->rows;
|
||||
}
|
||||
|
@ -65,23 +45,4 @@ class Result implements \JKingWeb\Arsse\Db\Result {
|
|||
$this->cur = $this->set->fetchArray(\SQLITE3_ASSOC);
|
||||
return ($this->cur !== false);
|
||||
}
|
||||
|
||||
public function next() {
|
||||
$this->cur = null;
|
||||
$this->pos += 1;
|
||||
}
|
||||
|
||||
public function current() {
|
||||
return $this->cur;
|
||||
}
|
||||
|
||||
public function key() {
|
||||
return $this->pos;
|
||||
}
|
||||
|
||||
public function rewind() {
|
||||
$this->pos = 0;
|
||||
$this->cur = null;
|
||||
$this->set->reset();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -134,7 +134,10 @@ return [
|
|||
other {Automatic updating of the {driver_name} database failed because its version, {current}, is newer than the requested version, {target}}
|
||||
}',
|
||||
'Exception.JKingWeb/Arsse/Db/Exception.engineErrorGeneral' => '{0}',
|
||||
'Exception.JKingWeb/Arsse/Db/Exception.unknownSavepointStatus' => 'Savepoint status code {0} not implemented',
|
||||
'Exception.JKingWeb/Arsse/Db/Exception.savepointStatusUnknown' => 'Savepoint status code {0} not implemented',
|
||||
'Exception.JKingWeb/Arsse/Db/Exception.savepointInvalid' => 'Tried to {action} invalid savepoint {index}',
|
||||
'Exception.JKingWeb/Arsse/Db/Exception.savepointStale' => 'Tried to {action} stale savepoint {index}',
|
||||
'Exception.JKingWeb/Arsse/Db/Exception.resultReused' => 'Result set already iterated',
|
||||
'Exception.JKingWeb/Arsse/Db/ExceptionInput.missing' => 'Required field "{field}" missing while performing action "{action}"',
|
||||
'Exception.JKingWeb/Arsse/Db/ExceptionInput.whitespace' => 'Field "{field}" of action "{action}" may not contain only whitespace',
|
||||
'Exception.JKingWeb/Arsse/Db/ExceptionInput.tooLong' => 'Field "{field}" of action "{action}" has a maximum length of {max}',
|
||||
|
@ -147,8 +150,6 @@ return [
|
|||
'Exception.JKingWeb/Arsse/Db/ExceptionInput.engineConstraintViolation' => '{0}',
|
||||
'Exception.JKingWeb/Arsse/Db/ExceptionInput.engineTypeViolation' => '{0}',
|
||||
'Exception.JKingWeb/Arsse/Db/ExceptionTimeout.general' => '{0}',
|
||||
'Exception.JKingWeb/Arsse/Db/ExceptionSavepoint.invalid' => 'Tried to {action} invalid savepoint {index}',
|
||||
'Exception.JKingWeb/Arsse/Db/ExceptionSavepoint.stale' => 'Tried to {action} stale savepoint {index}',
|
||||
'Exception.JKingWeb/Arsse/User/Exception.alreadyExists' => 'Could not perform action "{action}" because the user {user} already exists',
|
||||
'Exception.JKingWeb/Arsse/User/Exception.doesNotExist' => 'Could not perform action "{action}" because the user {user} does not exist',
|
||||
'Exception.JKingWeb/Arsse/User/Exception.authMissing' => 'Please log in to proceed',
|
||||
|
|
|
@ -117,14 +117,14 @@ class TestDbDriverSQLite3 extends Test\AbstractTest {
|
|||
public function testReleaseASavepoint() {
|
||||
$this->assertEquals(1, $this->drv->savepointCreate());
|
||||
$this->assertEquals(true, $this->drv->savepointRelease());
|
||||
$this->assertException("invalid", "Db", "ExceptionSavepoint");
|
||||
$this->assertException("savepointInvalid", "Db");
|
||||
$this->drv->savepointRelease();
|
||||
}
|
||||
|
||||
public function testUndoASavepoint() {
|
||||
$this->assertEquals(1, $this->drv->savepointCreate());
|
||||
$this->assertEquals(true, $this->drv->savepointUndo());
|
||||
$this->assertException("invalid", "Db", "ExceptionSavepoint");
|
||||
$this->assertException("savepointInvalid", "Db");
|
||||
$this->drv->savepointUndo();
|
||||
}
|
||||
|
||||
|
@ -141,7 +141,7 @@ class TestDbDriverSQLite3 extends Test\AbstractTest {
|
|||
$this->assertTrue($this->drv->savepointRelease(6));
|
||||
$this->assertEquals(3, $this->drv->savepointCreate());
|
||||
$this->assertTrue($this->drv->savepointRelease(2));
|
||||
$this->assertException("stale", "Db", "ExceptionSavepoint");
|
||||
$this->assertException("savepointStale", "Db");
|
||||
$this->drv->savepointRelease(2);
|
||||
}
|
||||
|
||||
|
@ -152,7 +152,7 @@ class TestDbDriverSQLite3 extends Test\AbstractTest {
|
|||
$this->assertEquals(4, $this->drv->savepointCreate());
|
||||
$this->assertTrue($this->drv->savepointRelease(2));
|
||||
$this->assertFalse($this->drv->savepointUndo(3));
|
||||
$this->assertException("stale", "Db", "ExceptionSavepoint");
|
||||
$this->assertException("savepointStale", "Db");
|
||||
$this->drv->savepointUndo(2);
|
||||
}
|
||||
|
||||
|
|
|
@ -51,10 +51,11 @@ class TestDbResultSQLite3 extends Test\AbstractTest {
|
|||
foreach ($test as $row) {
|
||||
$rows[] = $row['col'];
|
||||
}
|
||||
$this->assertEquals([1,2,3], $rows);
|
||||
$this->assertException("resultReused", "Db");
|
||||
foreach ($test as $row) {
|
||||
$rows[] = $row['col'];
|
||||
}
|
||||
$this->assertEquals([1,2,3,1,2,3], $rows);
|
||||
}
|
||||
|
||||
public function testGetSingleValues() {
|
||||
|
@ -85,6 +86,15 @@ class TestDbResultSQLite3 extends Test\AbstractTest {
|
|||
$this->assertEquals($rows[0], $test->getRow());
|
||||
$this->assertEquals($rows[1], $test->getRow());
|
||||
$this->assertSame(null, $test->getRow());
|
||||
}
|
||||
|
||||
public function testGetAllRows() {
|
||||
$set = $this->c->query("SELECT '2112' as album, '2112' as track union select 'Clockwork Angels' as album, 'The Wreckers' as track");
|
||||
$rows = [
|
||||
['album' => '2112', 'track' => '2112'],
|
||||
['album' => 'Clockwork Angels', 'track' => 'The Wreckers'],
|
||||
];
|
||||
$test = new Db\SQLite3\Result($set);
|
||||
$this->assertEquals($rows, $test->getAll());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ class TestTransaction extends Test\AbstractTest {
|
|||
}
|
||||
|
||||
public function testIgnoreRollbackErrors() {
|
||||
Phake::when($this->drv)->savepointUndo->thenThrow(new Db\ExceptionSavepoint("stale"));
|
||||
Phake::when($this->drv)->savepointUndo->thenThrow(new Db\Exception("savepointStale"));
|
||||
$tr1 = new Transaction($this->drv);
|
||||
$tr2 = new Transaction($this->drv);
|
||||
unset($tr1, $tr2); // no exception should bubble up
|
||||
|
|
Loading…
Reference in a new issue