initial commit
This commit is contained in:
commit
1b83852d0a
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
.php_cs.cache
|
||||
.idea
|
||||
build
|
||||
composer.lock
|
||||
phpunit.xml
|
||||
vendor
|
||||
*.pid
|
21
README.md
Normal file
21
README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Amp SQL
|
||||
|
||||
## About
|
||||
|
||||
This package provides interfaces and common classes shared by [amp/mysql](https://github.com/amphp/mysql/) and [amp/postgres](https://github.com/amphp/postgres/).
|
||||
|
||||
## Requirements
|
||||
|
||||
- PHP 7.0+
|
||||
|
||||
## Versioning
|
||||
|
||||
`amphp/sql` follows the [semver](http://semver.org/) semantic versioning specification like all other `amphp` packages.
|
||||
|
||||
## Security
|
||||
|
||||
If you discover any security related issues, please email [`contact@amphp.org`](mailto:contact@amphp.org) instead of using the issue tracker.
|
||||
|
||||
## License
|
||||
|
||||
The MIT License (MIT). Please see [`LICENSE`](./LICENSE) for more information.
|
26
composer.json
Normal file
26
composer.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "amphp/sql",
|
||||
"description": "Asynchronous SQL client for Amp.",
|
||||
"keywords": [
|
||||
"database",
|
||||
"db",
|
||||
"sql",
|
||||
"asynchronous",
|
||||
"async"
|
||||
],
|
||||
"homepage": "http://amphp.org",
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"amphp/amp": "^2"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Amp\\Sql\\": "src"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"platform": {
|
||||
"php": "7.0.0"
|
||||
}
|
||||
}
|
||||
}
|
12
src/CommandResult.php
Normal file
12
src/CommandResult.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
interface CommandResult {
|
||||
/**
|
||||
* Returns the number of rows affected by the query.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function affectedRows(): int;
|
||||
}
|
30
src/Connection.php
Normal file
30
src/Connection.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
use Amp\Promise;
|
||||
|
||||
interface Connection extends Link {
|
||||
/**
|
||||
* @return bool False if the connection has been closed.
|
||||
*/
|
||||
public function isAlive(): bool;
|
||||
|
||||
/**
|
||||
* @return int Timestamp of the last time this connection was used.
|
||||
*/
|
||||
public function lastUsedAt(): int;
|
||||
|
||||
public function close();
|
||||
|
||||
public function query(string $query): Promise;
|
||||
|
||||
public function transaction(int $isolation = Transaction::COMMITTED): Promise;
|
||||
|
||||
public function prepare(string $query): Promise;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function execute(string $sql, array $params = []): Promise;
|
||||
}
|
6
src/ConnectionException.php
Normal file
6
src/ConnectionException.php
Normal file
@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
class ConnectionException extends FailureException {
|
||||
}
|
14
src/Connector.php
Normal file
14
src/Connector.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
use Amp\Promise;
|
||||
|
||||
interface Connector {
|
||||
/**
|
||||
* @param string $connectionString
|
||||
*
|
||||
* @return Promise<Connection>
|
||||
*/
|
||||
public function connect(string $connectionString): Promise;
|
||||
}
|
53
src/Executor.php
Normal file
53
src/Executor.php
Normal file
@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
use Amp\Promise;
|
||||
|
||||
interface Executor {
|
||||
/**
|
||||
* @param string $sql SQL query to execute.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\CommandResult|\Amp\Sql\ResultSet>
|
||||
*
|
||||
* @throws \Amp\Sql\FailureException If the operation fails due to unexpected condition.
|
||||
* @throws \Amp\Sql\ConnectionException If the connection to the database is lost.
|
||||
* @throws \Amp\Sql\QueryError If the operation fails due to an error in the query (such as a syntax error).
|
||||
*/
|
||||
public function query(string $sql): Promise;
|
||||
|
||||
/**
|
||||
* @param string $sql SQL query to prepare.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Mysql\Statement>
|
||||
*
|
||||
* @throws \Amp\Sql\FailureException If the operation fails due to unexpected condition.
|
||||
* @throws \Amp\Sql\ConnectionException If the connection to the database is lost.
|
||||
* @throws \Amp\Sql\QueryError If the operation fails due to an error in the query (such as a syntax error).
|
||||
*/
|
||||
public function prepare(string $sql): Promise;
|
||||
|
||||
/**
|
||||
* @param string $sql SQL query to prepare and execute.
|
||||
* @param mixed[] $params Query parameters.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\CommandResult|\Amp\Sql\ResultSet>
|
||||
*
|
||||
* @throws \Amp\Sql\FailureException If the operation fails due to unexpected condition.
|
||||
* @throws \Amp\Sql\ConnectionException If the connection to the database is lost.
|
||||
* @throws \Amp\Sql\QueryError If the operation fails due to an error in the query (such as a syntax error).
|
||||
*/
|
||||
public function execute(string $sql, array $params = []): Promise;
|
||||
|
||||
/**
|
||||
* Indicates if the connection to the database is still alive.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isAlive(): bool;
|
||||
|
||||
/**
|
||||
* Closes the executor. No further queries may be performed.
|
||||
*/
|
||||
public function close();
|
||||
}
|
6
src/FailureException.php
Normal file
6
src/FailureException.php
Normal file
@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
class FailureException extends \Exception {
|
||||
}
|
14
src/Link.php
Normal file
14
src/Link.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
use Amp\Promise;
|
||||
|
||||
interface Link extends Executor {
|
||||
/**
|
||||
* Starts a transaction on a single connection.
|
||||
*
|
||||
* @return \Amp\Promise
|
||||
*/
|
||||
public function transaction(): Promise;
|
||||
}
|
10
src/Operation.php
Normal file
10
src/Operation.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
interface Operation {
|
||||
/**
|
||||
* @param callable $onDestruct Callback executed when the operation completes or the object is destroyed.
|
||||
*/
|
||||
public function onDestruct(callable $onDestruct);
|
||||
}
|
40
src/Pool.php
Normal file
40
src/Pool.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
use Amp\Promise;
|
||||
|
||||
interface Pool extends Link
|
||||
{
|
||||
const DEFAULT_MAX_CONNECTIONS = 100;
|
||||
const DEFAULT_IDLE_TIMEOUT = 60;
|
||||
|
||||
public function getIdleTimeout(): int;
|
||||
|
||||
/**
|
||||
* @param int $timeout The maximum number of seconds a connection may be idle before being closed and removed
|
||||
* from the pool.
|
||||
*
|
||||
* @throws \Error If the timeout is less than 1.
|
||||
*/
|
||||
public function setIdleTimeout(int $timeout);
|
||||
|
||||
public function getMaxConnections(): int;
|
||||
|
||||
public function getConnectionCount(): int;
|
||||
|
||||
public function getIdleConnectionCount(): int;
|
||||
|
||||
/**
|
||||
* Extracts an idle connection from the pool. The connection is completely removed from the pool and cannot be
|
||||
* put back into the pool. Useful for operations where connection state must be changed.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\Connection>
|
||||
*/
|
||||
public function extractConnection(): Promise;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function transaction(int $isolation = Transaction::COMMITTED): Promise;
|
||||
}
|
6
src/PoolError.php
Normal file
6
src/PoolError.php
Normal file
@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
class PoolError extends \Error {
|
||||
}
|
30
src/QueryError.php
Normal file
30
src/QueryError.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
class QueryError extends \Error {
|
||||
protected $query = "";
|
||||
|
||||
public function __construct(string $message, string $query = "", \Throwable $previous = null) {
|
||||
if ($query != "") {
|
||||
$this->query = $query;
|
||||
}
|
||||
parent::__construct($message, 0, $previous);
|
||||
}
|
||||
|
||||
final public function getQuery(): string {
|
||||
return $this->query;
|
||||
}
|
||||
|
||||
public function __toString(): string {
|
||||
if ($this->query == "") {
|
||||
return parent::__toString();
|
||||
}
|
||||
|
||||
$msg = $this->message;
|
||||
$this->message .= "\nCurrent query was {$this->query}";
|
||||
$str = parent::__toString();
|
||||
$this->message = $msg;
|
||||
return $str;
|
||||
}
|
||||
}
|
19
src/ResultSet.php
Normal file
19
src/ResultSet.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
use Amp\Iterator;
|
||||
use Amp\Promise;
|
||||
|
||||
interface ResultSet extends Iterator {
|
||||
const FETCH_ARRAY = 0;
|
||||
const FETCH_ASSOC = 1;
|
||||
const FETCH_OBJECT = 2;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @param int $type Next row fetch type. Use the FETCH_* constants provided by this interface.
|
||||
*/
|
||||
public function advance(int $type = self::FETCH_ASSOC): Promise;
|
||||
}
|
29
src/Statement.php
Normal file
29
src/Statement.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
use Amp\Promise;
|
||||
|
||||
interface Statement {
|
||||
/**
|
||||
* @param mixed[] $params
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\CommandResult>
|
||||
*/
|
||||
public function execute(array $params = []): Promise;
|
||||
|
||||
/**
|
||||
* @return bool True if the statement can still be executed, false if the connection has died.
|
||||
*/
|
||||
public function isAlive(): bool;
|
||||
|
||||
/**
|
||||
* @return string The SQL string used to prepare the statement.
|
||||
*/
|
||||
public function getQuery(): string;
|
||||
|
||||
/**
|
||||
* @return int Timestamp of when the statement was last used.
|
||||
*/
|
||||
public function lastUsedAt(): int;
|
||||
}
|
106
src/Transaction.php
Normal file
106
src/Transaction.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
use Amp\Promise;
|
||||
|
||||
interface Transaction extends Operation {
|
||||
const UNCOMMITTED = 0;
|
||||
const COMMITTED = 1;
|
||||
const REPEATABLE = 2;
|
||||
const SERIALIZABLE = 4;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* Closes and commits all changes in the transaction.
|
||||
*/
|
||||
public function close();
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getIsolationLevel(): int;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isAlive(): bool;
|
||||
|
||||
/**
|
||||
* @return bool True if the transaction is active, false if it has been committed or rolled back.
|
||||
*/
|
||||
public function isActive(): bool;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @throws \Amp\Sql\TransactionError If the transaction has been committed or rolled back.
|
||||
*/
|
||||
public function query(string $sql): Promise;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @throws \Amp\Sql\TransactionError If the transaction has been committed or rolled back.
|
||||
*/
|
||||
public function prepare(string $sql): Promise;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @throws \Amp\Sql\TransactionError If the transaction has been committed or rolled back.
|
||||
*/
|
||||
public function execute(string $sql, array $params = []): Promise;
|
||||
|
||||
/**
|
||||
* Commits the transaction and makes it inactive.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\CommandResult>
|
||||
*
|
||||
* @throws \Amp\Sql\TransactionError If the transaction has been committed or rolled back.
|
||||
*/
|
||||
public function commit(): Promise;
|
||||
|
||||
/**
|
||||
* Rolls back the transaction and makes it inactive.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\CommandResult>
|
||||
*
|
||||
* @throws \Amp\Sql\TransactionError If the transaction has been committed or rolled back.
|
||||
*/
|
||||
public function rollback(): Promise;
|
||||
|
||||
/**
|
||||
* Creates a savepoint with the given identifier.
|
||||
*
|
||||
* @param string $identifier Savepoint identifier.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\CommandResult>
|
||||
*
|
||||
* @throws \Amp\Sql\TransactionError If the transaction has been committed or rolled back.
|
||||
*/
|
||||
public function savepoint(string $identifier): Promise;
|
||||
|
||||
/**
|
||||
* Rolls back to the savepoint with the given identifier.
|
||||
*
|
||||
* @param string $identifier Savepoint identifier.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\CommandResult>
|
||||
*
|
||||
* @throws \Amp\Sql\TransactionError If the transaction has been committed or rolled back.
|
||||
*/
|
||||
public function rollbackTo(string $identifier): Promise;
|
||||
|
||||
/**
|
||||
* Releases the savepoint with the given identifier.
|
||||
*
|
||||
* @param string $identifier Savepoint identifier.
|
||||
*
|
||||
* @return \Amp\Promise<\Amp\Sql\CommandResult>
|
||||
*
|
||||
* @throws \Amp\Sql\TransactionError If the transaction has been committed or rolled back.
|
||||
*/
|
||||
public function release(string $identifier): Promise;
|
||||
}
|
6
src/TransactionError.php
Normal file
6
src/TransactionError.php
Normal file
@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Sql;
|
||||
|
||||
class TransactionError extends \Error {
|
||||
}
|
Loading…
Reference in New Issue
Block a user