update project; fit neos/flow 4

This commit is contained in:
Robin Krahnen 2017-03-13 16:59:04 +01:00
parent 9b92e22589
commit 37d3856a3b
9 changed files with 84 additions and 77 deletions

View file

@ -1,13 +1,9 @@
<?php
namespace DigiComp\Sequence\Command;
/* *
* This script belongs to the FLOW3 package "DigiComp.Sequence". *
* *
* */
use TYPO3\Flow\Annotations as Flow;
use TYPO3\Flow\Cli\CommandController;
use DigiComp\Sequence\Service\SequenceGenerator;
use Neos\Flow\Annotations as Flow;
use Neos\Flow\Cli\CommandController;
/**
* A database agnostic SequenceNumber generator
@ -16,9 +12,8 @@ use TYPO3\Flow\Cli\CommandController;
*/
class SequenceCommandController extends CommandController
{
/**
* @var \DigiComp\Sequence\Service\SequenceGenerator
* @var SequenceGenerator
* @Flow\Inject
*/
protected $sequenceGenerator;
@ -34,5 +29,5 @@ class SequenceCommandController extends CommandController
$this->sequenceGenerator->advanceTo($to, $type);
}
//TODO: make clean up job to delete all but the biggest number to save resources
// TODO: make clean up job to delete all but the biggest number to save resources
}

View file

@ -1,13 +1,8 @@
<?php
namespace DigiComp\Sequence\Domain\Model;
/* *
* This script belongs to the FLOW3 package "DigiComp.Sequence". *
* *
* */
use TYPO3\Flow\Annotations as Flow;
use Doctrine\ORM\Mapping as ORM;
use Neos\Flow\Annotations as Flow;
/**
* SequenceInsert
@ -19,18 +14,17 @@ use Doctrine\ORM\Mapping as ORM;
*/
class Insert
{
/**
* @var int
* @ORM\Id
* @Flow\Identity
* @ORM\Id
*/
protected $number;
/**
* @var string
* @ORM\Id
* @Flow\Identity
* @ORM\Id
*/
protected $type;
@ -40,8 +34,16 @@ class Insert
*/
public function __construct($number, $type)
{
$this->setType($type);
$this->setNumber($number);
$this->setType($type);
}
/**
* @return int
*/
public function getNumber()
{
return $this->number;
}
/**
@ -53,11 +55,11 @@ class Insert
}
/**
* @return int
* @return string
*/
public function getNumber()
public function getType()
{
return $this->number;
return $this->type;
}
/**
@ -70,12 +72,4 @@ class Insert
}
$this->type = $type;
}
/**
* @return string
*/
public function getType()
{
return $this->type;
}
}

View file

@ -1,12 +1,7 @@
<?php
namespace DigiComp\Sequence\Service;
/* *
* This script belongs to the FLOW3 package "DigiComp.Sequence". *
* *
* */
use TYPO3\Flow\Annotations as Flow;
use Neos\Flow\Annotations as Flow;
/**
* SequenceException

View file

@ -1,18 +1,17 @@
<?php
namespace DigiComp\Sequence\Service;
/* *
* This script belongs to the FLOW3 package "DigiComp.Sequence". *
* *
* */
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\DBAL\DBALException;
use TYPO3\Flow\Annotations as Flow;
use Doctrine\ORM\EntityManager;
use Neos\Flow\Annotations as Flow;
use Neos\Flow\Log\SystemLoggerInterface;
use Neos\Flow\Reflection\ReflectionService;
use Neos\Utility\TypeHandling;
/**
* A SequenceNumber generator working for transactional databases
*
*
* Thoughts: We could make the step-range configurable, and if > 1 we could return new keys immediately for this
* request, as we "reserved" the space between.
*
@ -20,21 +19,20 @@ use TYPO3\Flow\Annotations as Flow;
*/
class SequenceGenerator
{
/**
* @var \Doctrine\Common\Persistence\ObjectManager
* @var ObjectManager
* @Flow\Inject
*/
protected $entityManager;
/**
* @var \TYPO3\Flow\Reflection\ReflectionService
* @var ReflectionService
* @Flow\Inject
*/
protected $reflectionService;
/**
* @var \TYPO3\Flow\Log\SystemLoggerInterface
* @var SystemLoggerInterface
* @Flow\Inject
*/
protected $systemLogger;
@ -42,7 +40,8 @@ class SequenceGenerator
/**
* @param string|object $type
*
* @throws \DigiComp\Sequence\Service\Exception
* @throws Exception
*
* @return int
*/
public function getNextNumberFor($type)
@ -50,18 +49,25 @@ class SequenceGenerator
$type = $this->inferTypeFromSource($type);
$count = $this->getLastNumberFor($type);
//TODO: Check for maximal tries, or similar
//TODO: Let increment be configurable per type
// TODO: Check for maximal tries, or similar
// TODO: Let increment be configurable per type
do {
$count = $count + 1;
} while (!$this->validateFreeNumber($count, $type));
$count++;
} while (! $this->validateFreeNumber($count, $type));
return $count;
}
/**
* @param int $count
* @param string|object $type
*
* @return bool
*/
protected function validateFreeNumber($count, $type)
{
/** @var $em EntityManager */
$em = $this->entityManager;
/** @var $em \Doctrine\ORM\EntityManager */
try {
$em->getConnection()->insert(
'digicomp_sequence_domain_model_insert',
@ -73,18 +79,27 @@ class SequenceGenerator
} catch (DBALException $e) {
if ($e->getPrevious() && $e->getPrevious() instanceof \PDOException) {
// Do nothing, new Doctrine handling hides the above error
} else {
}
else {
$this->systemLogger->logException($e);
}
} catch (\Exception $e) {
$this->systemLogger->logException($e);
}
return false;
}
/**
* @param int $to
* @param string|object $type
*
* @return bool
*/
public function advanceTo($to, $type)
{
$type = $this->inferTypeFromSource($type);
return ($this->validateFreeNumber($to, $type));
}
@ -95,16 +110,16 @@ class SequenceGenerator
*/
public function getLastNumberFor($type)
{
$type = $this->inferTypeFromSource($type);
/** @var $em \Doctrine\ORM\EntityManager */
/** @var $em EntityManager */
$em = $this->entityManager;
$result = $em->getConnection()->executeQuery(
'SELECT MAX(number) AS count FROM digicomp_sequence_domain_model_insert WHERE type=:type',
['type' => $type]
['type' => $this->inferTypeFromSource($type)]
);
$count = $result->fetchAll();
$count = $count[0]['count'];
return $count;
}
@ -112,15 +127,18 @@ class SequenceGenerator
* @param string|object $stringOrObject
*
* @throws Exception
*
* @return string
*/
protected function inferTypeFromSource($stringOrObject) {
protected function inferTypeFromSource($stringOrObject)
{
if (is_object($stringOrObject)) {
$stringOrObject = $this->reflectionService->getClassNameByObject($stringOrObject);
$stringOrObject = TypeHandling::getTypeForValue($stringOrObject);
}
if (!$stringOrObject) {
if (! $stringOrObject) {
throw new Exception('No Type given');
}
return $stringOrObject;
}
}

View file

@ -1,6 +1,6 @@
TYPO3:
Neos:
Flow:
persistence:
backendOptions:
driver: 'pdo_sqlite'
path: %FLOW_PATH_DATA%/Temporary/testing.db
path: '%FLOW_PATH_DATA%/Temporary/testing.db'

View file

@ -1,5 +1,5 @@
<?php
namespace TYPO3\Flow\Persistence\Doctrine\Migrations;
namespace Neos\Flow\Persistence\Doctrine\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration,
Doctrine\DBAL\Schema\Schema;

View file

@ -1,5 +1,5 @@
<?php
namespace TYPO3\Flow\Persistence\Doctrine\Migrations;
namespace Neos\Flow\Persistence\Doctrine\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;

View file

@ -2,11 +2,13 @@
namespace DigiComp\Sequence\Tests\Functional;
use DigiComp\Sequence\Service\SequenceGenerator;
use TYPO3\Flow\Tests\FunctionalTestCase;
use Neos\Flow\Tests\FunctionalTestCase;
class SequenceTest extends FunctionalTestCase
{
/**
* @var bool
*/
protected static $testablePersistenceEnabled = true;
/**
@ -20,12 +22,13 @@ class SequenceTest extends FunctionalTestCase
$this->assertEquals(0, $number);
$this->assertEquals(1, $sequenceGenerator->getNextNumberFor($sequenceGenerator));
$pids = [];
$pIds = [];
for ($i = 0; $i < 10; $i++) {
$pid = pcntl_fork();
if ($pid) {
$pids[] = $pid;
} else {
$pId = pcntl_fork();
if ($pId) {
$pIds[] = $pId;
}
else {
for ($j = 0; $j < 10; $j++) {
$sequenceGenerator->getNextNumberFor($sequenceGenerator);
}
@ -33,10 +36,12 @@ class SequenceTest extends FunctionalTestCase
exit;
}
}
foreach ($pids as $pid) {
foreach ($pIds as $pId) {
$status = 0;
pcntl_waitpid($pid, $status);
pcntl_waitpid($pId, $status);
}
$this->assertEquals(101, $sequenceGenerator->getLastNumberFor($sequenceGenerator));
}

View file

@ -1,6 +1,6 @@
{
"name": "digicomp/sequence",
"type": "typo3-flow-package",
"type": "neos-package",
"description": "Sequence is a very simple database agnostic but database based sequence generator",
"keywords": ["flow", "neos", "doctrine", "sequence"],
"authors": [