Skip to content

Commit 2afeb37

Browse files
authored
Merge pull request php-service-bus#43 from mmasiukevich/develop
Returns the number of rows affected by the last DELETE, INSERT, or UP…
2 parents 3ff1a03 + a971837 commit 2afeb37

File tree

5 files changed

+127
-14
lines changed

5 files changed

+127
-14
lines changed

doc/sagas.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -30,29 +30,29 @@
3030

3131
#### Конфигурация
3232
Конфигурация саг указывается в аннотациях [@SagaHeader](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Annotations/SagaHeader.php) и [@SagaEventListener](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Annotations/SagaEventListener.php) соответсвенно
33-
- **idClass**: Пространство имён класса идентификатора саги.
34-
- **expireDateModifier**: Интервал времени, в течение которого сага будет считаться открытой
35-
- **containingIdProperty**: Поле, в которм будет передаваться идентификатор саги. В нашем примере это поле называется *operationId*. Для того, что бы привязать событие к конкретной саге (ведь одно и то же событие может ждать несколько саг), нужно передавать идентификатор. Данная опция указывает на то, какое свойство события содержит этот идентификатор. Параметр можно переопределить в рамках конкретного слушателя, указав в аннотации @SagaEventListener нужное значение.
33+
- ```idClass```: Пространство имён класса идентификатора саги.
34+
- ```expireDateModifier```: Интервал времени, в течение которого сага будет считаться открытой
35+
- ```containingIdProperty```: Поле, в которм будет передаваться идентификатор саги. В нашем примере это поле называется *operationId*. Для того, что бы привязать событие к конкретной саге (ведь одно и то же событие может ждать несколько саг), нужно передавать идентификатор. Данная опция указывает на то, какое свойство события содержит этот идентификатор. Параметр можно переопределить в рамках конкретного слушателя, указав в аннотации @SagaEventListener нужное значение.
3636

3737
Каждый слушатель именуется по следующему шаблону: ```on{EventName}```, где *on* - префикс, а *{EventName}* базовое название класса (без указания пространства имён)
3838

3939
#### Жизненный цикл
40-
Выполнение саги начинается с команды [start](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L133), которая будет вызвана автоматически (пример создания ниже). В рамках саги доступны методы (имеют protected область видимости):
41-
- [fire](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L191): Отправляет в транспорт команду
42-
- [raise](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L174): Отправляет в транспорт событие
43-
- [makeCompleted](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L209): Закрывает сагу, помечая её, как успешную
44-
- [makeFailed](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L228): Завершает сагу, помечая её, как неуспешную
40+
Выполнение саги начинается с команды [start()](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L133), которая будет вызвана автоматически (пример создания ниже). В рамках саги доступны методы (имеют protected область видимости):
41+
- [fire()](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L191): Отправляет в транспорт команду
42+
- [raise()](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L174): Отправляет в транспорт событие
43+
- [makeCompleted()](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L209): Закрывает сагу, помечая её, как успешную
44+
- [makeFailed()](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Saga.php#L228): Завершает сагу, помечая её, как неуспешную
4545

4646
При изменениях статуса в транспорт будут отправлены события:
47-
- [SagaCreated](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Contract/SagaCreated.php): Сага была создана
48-
- [SagaStatusChanged](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Contract/SagaStatusChanged.php): Изменился статус саги
49-
- [SagaClosed](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Contract/SagaClosed.php): Обработка саги завершена
47+
- [SagaCreated()](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Contract/SagaCreated.php): Сага была создана
48+
- [SagaStatusChanged()](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Contract/SagaStatusChanged.php): Изменился статус саги
49+
- [SagaClosed()](https://github.com/mmasiukevich/service-bus/blob/master/src/Sagas/Contract/SagaClosed.php): Обработка саги завершена
5050

5151
#### Создание
5252
Для операций с сагами есть специальный провайдер - [SagaProvider](https://github.com/mmasiukevich/service-bus/blob/master/src/SagaProvider.php), имеющий несколько методов (каждый метод возвращает объект [Promise](https://github.com/amphp/amp/blob/master/lib/Promise.php))
53-
- [start](https://github.com/mmasiukevich/service-bus/blob/master/src/SagaProvider.php#L78): Создаёт и запускает новую сагу, передавая в неё команду
54-
- [obtain](https://github.com/mmasiukevich/service-bus/blob/master/src/SagaProvider.php#L126): Получает существующую сагу из базы данных
55-
- [save](https://github.com/mmasiukevich/service-bus/blob/master/src/SagaProvider.php#L161): Сохраняет все изменения в саге, а так же триггерит отправку сообщений в транспорт
53+
- [start()](https://github.com/mmasiukevich/service-bus/blob/master/src/SagaProvider.php#L78): Создаёт и запускает новую сагу, передавая в неё команду
54+
- [obtain()](https://github.com/mmasiukevich/service-bus/blob/master/src/SagaProvider.php#L126): Получает существующую сагу из базы данных
55+
- [save()](https://github.com/mmasiukevich/service-bus/blob/master/src/SagaProvider.php#L161): Сохраняет все изменения в саге, а так же триггерит отправку сообщений в транспорт
5656

5757
#### Примеры кода
5858

src/Storage/ResultSet.php

+9
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,13 @@ public function getCurrent();
5555
* @throws \Desperado\ServiceBus\Storage\Exceptions\ResultSetIterationFailed
5656
*/
5757
public function lastInsertId(?string $sequence = null);
58+
59+
/**
60+
* Returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement executed
61+
*
62+
* @return int
63+
*
64+
* @throws \Desperado\ServiceBus\Storage\Exceptions\ResultSetIterationFailed
65+
*/
66+
public function rowsCount(): int;
5867
}

src/Storage/SQL/AmpPostgreSQL/AmpPostgreSQLResultSet.php

+23
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Desperado\ServiceBus\Storage\SQL\AmpPostgreSQL;
1515

16+
use Amp\Postgres\PgSqlCommandResult;
1617
use Amp\Promise;
1718
use Amp\Sql\PooledResultSet;
1819
use Amp\Success;
@@ -106,4 +107,26 @@ public function lastInsertId(?string $sequence = null): ?string
106107
}
107108
// @codeCoverageIgnoreEnd
108109
}
110+
111+
/**
112+
* @inheritdoc
113+
*/
114+
public function rowsCount(): int
115+
{
116+
try
117+
{
118+
if($this->originalResultSet instanceof PgSqlCommandResult)
119+
{
120+
return $this->originalResultSet->affectedRows();
121+
}
122+
123+
return 0;
124+
}
125+
// @codeCoverageIgnoreStart
126+
catch(\Throwable $throwable)
127+
{
128+
throw new ResultSetIterationFailed($throwable->getMessage(), $throwable->getCode(), $throwable);
129+
}
130+
// @codeCoverageIgnoreEnd
131+
}
109132
}

src/Storage/SQL/DoctrineDBAL/DoctrineDBALResultSet.php

+16
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ final class DoctrineDBALResultSet implements ResultSet
5959
*/
6060
private $connection;
6161

62+
/**
63+
* Number of rows affected by the last DELETE, INSERT, or UPDATE statement
64+
*
65+
* @var int
66+
*/
67+
private $affectedRows;
68+
6269
/**
6370
* @param Connection $connection
6471
* @param Statement $wrappedStmt
@@ -67,6 +74,7 @@ public function __construct(Connection $connection, Statement $wrappedStmt)
6774
{
6875
$this->connection = $connection;
6976
$this->fetchResult = $wrappedStmt->fetchAll();
77+
$this->affectedRows = $wrappedStmt->rowCount();
7078
$this->resultsCount = \count($this->fetchResult);
7179
}
7280

@@ -105,4 +113,12 @@ public function lastInsertId(?string $sequence = null): ?string
105113
{
106114
return $this->connection->lastInsertId($sequence);
107115
}
116+
117+
/**
118+
* @inheritdoc
119+
*/
120+
public function rowsCount(): int
121+
{
122+
return $this->affectedRows;
123+
}
108124
}

tests/Storage/SQL/BaseStorageAdapterTest.php

+65
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,71 @@ public function uniqueKeyCheckFailed(): void
352352
wait(new Coroutine($handler($this)));
353353
}
354354

355+
/**
356+
* @test
357+
*
358+
* @return void
359+
*
360+
* @throws \Throwable
361+
*/
362+
public function rowsCount(): void
363+
{
364+
$handler = static function(BaseStorageAdapterTest $self): \Generator
365+
{
366+
try
367+
{
368+
$adapter = static::getAdapter();
369+
370+
/** @var \Desperado\ServiceBus\Storage\ResultSet $result */
371+
$result = yield $adapter->execute(
372+
'INSERT INTO storage_test_table (id, identifier_class) VALUES (?, ?), (?, ?)',
373+
[
374+
'77961031-fd0f-4946-b439-dfc2902b961a', 'SomeIdentifierClass',
375+
'77961031-fd0f-4946-b439-dfc2902b961d', 'SomeIdentifierClass'
376+
]
377+
);
378+
379+
static::assertSame(2, $result->rowsCount());
380+
381+
unset($result);
382+
383+
/** @var \Desperado\ServiceBus\Storage\ResultSet $result */
384+
$result = yield $adapter->execute(
385+
'DELETE FROM storage_test_table where id = \'77961031-fd0f-4946-b439-dfc2902b961d\''
386+
);
387+
388+
static::assertSame(1, $result->rowsCount());
389+
390+
unset($result);
391+
392+
yield $adapter->execute('DELETE FROM storage_test_table');
393+
394+
/** @var \Desperado\ServiceBus\Storage\ResultSet $result */
395+
$result = yield $adapter->execute('DELETE FROM storage_test_table');
396+
397+
static::assertSame(0, $result->rowsCount());
398+
399+
unset($result);
400+
401+
/** @var \Desperado\ServiceBus\Storage\ResultSet $result */
402+
$result = yield $adapter->execute(
403+
'SELECT * FROM storage_test_table where id = \'77961031-fd0f-4946-b439-dfc2902b961d\''
404+
);
405+
406+
static::assertSame(0, $result->rowsCount());
407+
408+
unset($result);
409+
}
410+
catch(\Throwable $throwable)
411+
{
412+
/** @noinspection StaticInvocationViaThisInspection */
413+
$self->fail($throwable->getMessage());
414+
}
415+
};
416+
417+
wait(new Coroutine($handler($this)));
418+
}
419+
355420
/**
356421
* @param StorageAdapter $adapter
357422
*

0 commit comments

Comments
 (0)