One Hat Cyber Team
Your IP:
216.73.216.161
Server IP:
198.54.114.155
Server:
Linux server71.web-hosting.com 4.18.0-513.18.1.lve.el8.x86_64 #1 SMP Thu Feb 22 12:55:50 UTC 2024 x86_64
Server Software:
LiteSpeed
PHP Version:
5.6.40
Create File
|
Create Folder
Execute
Dir :
~
/
proc
/
self
/
root
/
home
/
fluxyjvi
/
www
/
assets
/
images
/
Edit File:
ORM.tar
Mandango/EntityPopulator.php 0000644 00000006341 15107542735 0012200 0 ustar 00 <?php namespace Faker\ORM\Mandango; use Faker\Provider\Base; use Mandango\Mandango; /** * Service class for populating a table through a Mandango ActiveRecord class. */ class EntityPopulator { protected $class; protected $columnFormatters = []; /** * @param string $class A Mandango ActiveRecord classname */ public function __construct($class) { $this->class = $class; } /** * @return string */ public function getClass() { return $this->class; } public function setColumnFormatters($columnFormatters) { $this->columnFormatters = $columnFormatters; } /** * @return array */ public function getColumnFormatters() { return $this->columnFormatters; } public function mergeColumnFormattersWith($columnFormatters) { $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } /** * @return array */ public function guessColumnFormatters(\Faker\Generator $generator, Mandango $mandango) { $formatters = []; $nameGuesser = new \Faker\Guesser\Name($generator); $columnTypeGuesser = new \Faker\ORM\Mandango\ColumnTypeGuesser($generator); $metadata = $mandango->getMetadata($this->class); // fields foreach ($metadata['fields'] as $fieldName => $field) { if ($formatter = $nameGuesser->guessFormat($fieldName)) { $formatters[$fieldName] = $formatter; continue; } if ($formatter = $columnTypeGuesser->guessFormat($field)) { $formatters[$fieldName] = $formatter; continue; } } // references foreach (array_merge($metadata['referencesOne'], $metadata['referencesMany']) as $referenceName => $reference) { if (!isset($reference['class'])) { continue; } $referenceClass = $reference['class']; $formatters[$referenceName] = static function ($insertedEntities) use ($referenceClass) { if (isset($insertedEntities[$referenceClass])) { return Base::randomElement($insertedEntities[$referenceClass]); } return null; }; } return $formatters; } /** * Insert one new record using the Entity class. */ public function execute(Mandango $mandango, $insertedEntities) { $metadata = $mandango->getMetadata($this->class); $obj = $mandango->create($this->class); foreach ($this->columnFormatters as $column => $format) { if (null !== $format) { $value = is_callable($format) ? $format($insertedEntities, $obj) : $format; if (isset($metadata['fields'][$column]) || isset($metadata['referencesOne'][$column])) { $obj->set($column, $value); } if (isset($metadata['referencesMany'][$column])) { $adder = 'add' . ucfirst($column); $obj->$adder($value); } } } $mandango->persist($obj); return $obj; } } Mandango/Populator.php 0000644 00000003567 15107542735 0011012 0 ustar 00 <?php namespace Faker\ORM\Mandango; use Mandango\Mandango; /** * Service class for populating a database using Mandango. * A Populator can populate several tables using ActiveRecord classes. */ class Populator { protected $generator; protected $mandango; protected $entities = []; protected $quantities = []; public function __construct(\Faker\Generator $generator, Mandango $mandango) { $this->generator = $generator; $this->mandango = $mandango; } /** * Add an order for the generation of $number records for $entity. * * @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel\EntityPopulator instance * @param int $number The number of entities to populate */ public function addEntity($entity, $number, $customColumnFormatters = []) { if (!$entity instanceof \Faker\ORM\Mandango\EntityPopulator) { $entity = new \Faker\ORM\Mandango\EntityPopulator($entity); } $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator, $this->mandango)); if ($customColumnFormatters) { $entity->mergeColumnFormattersWith($customColumnFormatters); } $class = $entity->getClass(); $this->entities[$class] = $entity; $this->quantities[$class] = $number; } /** * Populate the database using all the Entity classes previously added. * * @return array A list of the inserted entities. */ public function execute() { $insertedEntities = []; foreach ($this->quantities as $class => $number) { for ($i = 0; $i < $number; ++$i) { $insertedEntities[$class][] = $this->entities[$class]->execute($this->mandango, $insertedEntities); } } $this->mandango->flush(); return $insertedEntities; } } Mandango/ColumnTypeGuesser.php 0000644 00000002527 15107542735 0012455 0 ustar 00 <?php namespace Faker\ORM\Mandango; use Faker\Generator; class ColumnTypeGuesser { /** * @var Generator */ protected $generator; public function __construct(Generator $generator) { $this->generator = $generator; } /** * @return \Closure|null */ public function guessFormat($field) { $generator = $this->generator; switch ($field['type']) { case 'boolean': return static function () use ($generator) { return $generator->boolean; }; case 'integer': return static function () use ($generator) { return $generator->numberBetween(0, 4294967295); }; case 'float': return static function () use ($generator) { return $generator->randomFloat(); }; case 'string': return static function () use ($generator) { return $generator->text(255); }; case 'date': return static function () use ($generator) { return $generator->dateTime; }; default: // no smart way to guess what the user expects here return null; } } } Propel/EntityPopulator.php 0000644 00000013121 15107542735 0011707 0 ustar 00 <?php namespace Faker\ORM\Propel; use Faker\Provider\Base; /** * Service class for populating a table through a Propel ActiveRecord class. */ class EntityPopulator { protected $class; protected $columnFormatters = []; protected $modifiers = []; /** * @param string $class A Propel ActiveRecord classname */ public function __construct($class) { $this->class = $class; } /** * @return string */ public function getClass() { return $this->class; } public function setColumnFormatters($columnFormatters) { $this->columnFormatters = $columnFormatters; } /** * @return array */ public function getColumnFormatters() { return $this->columnFormatters; } public function mergeColumnFormattersWith($columnFormatters) { $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } /** * @return array */ public function guessColumnFormatters(\Faker\Generator $generator) { $formatters = []; $class = $this->class; $peerClass = $class::PEER; $tableMap = $peerClass::getTableMap(); $nameGuesser = new \Faker\Guesser\Name($generator); $columnTypeGuesser = new \Faker\ORM\Propel\ColumnTypeGuesser($generator); foreach ($tableMap->getColumns() as $columnMap) { // skip behavior columns, handled by modifiers if ($this->isColumnBehavior($columnMap)) { continue; } if ($columnMap->isForeignKey()) { $relatedClass = $columnMap->getRelation()->getForeignTable()->getClassname(); $formatters[$columnMap->getPhpName()] = static function ($inserted) use ($relatedClass, $generator) { return isset($inserted[$relatedClass]) ? $generator->randomElement($inserted[$relatedClass]) : null; }; continue; } if ($columnMap->isPrimaryKey()) { continue; } if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName(), $columnMap->getSize())) { $formatters[$columnMap->getPhpName()] = $formatter; continue; } if ($formatter = $columnTypeGuesser->guessFormat($columnMap)) { $formatters[$columnMap->getPhpName()] = $formatter; continue; } } return $formatters; } /** * @return bool */ protected function isColumnBehavior(\ColumnMap $columnMap) { foreach ($columnMap->getTable()->getBehaviors() as $name => $params) { $columnName = Base::toLower($columnMap->getName()); switch ($name) { case 'nested_set': $columnNames = [$params['left_column'], $params['right_column'], $params['level_column']]; if (in_array($columnName, $columnNames, false)) { return true; } break; case 'timestampable': $columnNames = [$params['create_column'], $params['update_column']]; if (in_array($columnName, $columnNames, false)) { return true; } break; } } return false; } public function setModifiers($modifiers) { $this->modifiers = $modifiers; } /** * @return array */ public function getModifiers() { return $this->modifiers; } public function mergeModifiersWith($modifiers) { $this->modifiers = array_merge($this->modifiers, $modifiers); } /** * @return array */ public function guessModifiers(\Faker\Generator $generator) { $modifiers = []; $class = $this->class; $peerClass = $class::PEER; $tableMap = $peerClass::getTableMap(); foreach ($tableMap->getBehaviors() as $name => $params) { switch ($name) { case 'nested_set': $modifiers['nested_set'] = static function ($obj, $inserted) use ($class, $generator): void { if (isset($inserted[$class])) { $queryClass = $class . 'Query'; $parent = $queryClass::create()->findPk($generator->randomElement($inserted[$class])); $obj->insertAsLastChildOf($parent); } else { $obj->makeRoot(); } }; break; case 'sortable': $modifiers['sortable'] = static function ($obj, $inserted) use ($class, $generator): void { $obj->insertAtRank($generator->numberBetween(1, count($inserted[$class] ?? []) + 1)); }; break; } } return $modifiers; } /** * Insert one new record using the Entity class. */ public function execute($con, $insertedEntities) { $obj = new $this->class(); foreach ($this->getColumnFormatters() as $column => $format) { if (null !== $format) { $obj->setByName($column, is_callable($format) ? $format($insertedEntities, $obj) : $format); } } foreach ($this->getModifiers() as $modifier) { $modifier($obj, $insertedEntities); } $obj->save($con); return $obj->getPrimaryKey(); } } Propel/Populator.php 0000644 00000005321 15107542735 0010515 0 ustar 00 <?php namespace Faker\ORM\Propel; /** * Service class for populating a database using the Propel ORM. * A Populator can populate several tables using ActiveRecord classes. */ class Populator { protected $generator; protected $entities = []; protected $quantities = []; public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } /** * Add an order for the generation of $number records for $entity. * * @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel\EntityPopulator instance * @param int $number The number of entities to populate */ public function addEntity($entity, $number, $customColumnFormatters = [], $customModifiers = []) { if (!$entity instanceof \Faker\ORM\Propel\EntityPopulator) { $entity = new \Faker\ORM\Propel\EntityPopulator($entity); } $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator)); if ($customColumnFormatters) { $entity->mergeColumnFormattersWith($customColumnFormatters); } $entity->setModifiers($entity->guessModifiers($this->generator)); if ($customModifiers) { $entity->mergeModifiersWith($customModifiers); } $class = $entity->getClass(); $this->entities[$class] = $entity; $this->quantities[$class] = $number; } /** * Populate the database using all the Entity classes previously added. * * @param PropelPDO $con A Propel connection object * * @return array A list of the inserted PKs */ public function execute($con = null) { if (null === $con) { $con = $this->getConnection(); } $isInstancePoolingEnabled = \Propel::isInstancePoolingEnabled(); \Propel::disableInstancePooling(); $insertedEntities = []; $con->beginTransaction(); foreach ($this->quantities as $class => $number) { for ($i = 0; $i < $number; ++$i) { $insertedEntities[$class][] = $this->entities[$class]->execute($con, $insertedEntities); } } $con->commit(); if ($isInstancePoolingEnabled) { \Propel::enableInstancePooling(); } return $insertedEntities; } protected function getConnection() { // use the first connection available $class = key($this->entities); if (!$class) { throw new \RuntimeException('No class found from entities. Did you add entities to the Populator ?'); } $peer = $class::PEER; return \Propel::getConnection($peer::DATABASE_NAME, \Propel::CONNECTION_WRITE); } } Propel/ColumnTypeGuesser.php 0000644 00000006715 15107542735 0012175 0 ustar 00 <?php namespace Faker\ORM\Propel; class ColumnTypeGuesser { protected $generator; public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } /** * @return \Closure|null */ public function guessFormat(\ColumnMap $column) { $generator = $this->generator; if ($column->isTemporal()) { if ($column->isEpochTemporal()) { return static function () use ($generator) { return $generator->dateTime; }; } return static function () use ($generator) { return $generator->dateTimeAD; }; } $type = $column->getType(); switch ($type) { case \PropelColumnTypes::BOOLEAN: case \PropelColumnTypes::BOOLEAN_EMU: return static function () use ($generator) { return $generator->boolean; }; case \PropelColumnTypes::NUMERIC: case \PropelColumnTypes::DECIMAL: $size = $column->getSize(); return static function () use ($generator, $size) { return $generator->randomNumber($size + 2) / 100; }; case \PropelColumnTypes::TINYINT: return static function () use ($generator) { return $generator->numberBetween(0, 127); }; case \PropelColumnTypes::SMALLINT: return static function () use ($generator) { return $generator->numberBetween(0, 32767); }; case \PropelColumnTypes::INTEGER: return static function () use ($generator) { return $generator->numberBetween(0, 2147483647); }; case \PropelColumnTypes::BIGINT: return static function () use ($generator) { return $generator->numberBetween(0, PHP_INT_MAX); }; case \PropelColumnTypes::FLOAT: case \PropelColumnTypes::DOUBLE: case \PropelColumnTypes::REAL: return static function () use ($generator) { return $generator->randomFloat(); }; case \PropelColumnTypes::CHAR: case \PropelColumnTypes::VARCHAR: case \PropelColumnTypes::BINARY: case \PropelColumnTypes::VARBINARY: $size = $column->getSize(); return static function () use ($generator, $size) { return $generator->text($size); }; case \PropelColumnTypes::LONGVARCHAR: case \PropelColumnTypes::LONGVARBINARY: case \PropelColumnTypes::CLOB: case \PropelColumnTypes::CLOB_EMU: case \PropelColumnTypes::BLOB: return static function () use ($generator) { return $generator->text; }; case \PropelColumnTypes::ENUM: $valueSet = $column->getValueSet(); return static function () use ($generator, $valueSet) { return $generator->randomElement($valueSet); }; case \PropelColumnTypes::OBJECT: case \PropelColumnTypes::PHP_ARRAY: default: // no smart way to guess what the user expects here return null; } } } Spot/EntityPopulator.php 0000644 00000011731 15107542735 0011400 0 ustar 00 <?php namespace Faker\ORM\Spot; use Faker\Generator; use Faker\Guesser\Name; use Spot\Locator; use Spot\Mapper; use Spot\Relation\BelongsTo; /** * Service class for populating a table through a Spot Entity class. */ class EntityPopulator { /** * When fetching existing data - fetch only few first rows. */ public const RELATED_FETCH_COUNT = 10; /** * @var Mapper */ protected $mapper; /** * @var Locator */ protected $locator; /** * @var array */ protected $columnFormatters = []; /** * @var array */ protected $modifiers = []; /** * @var bool */ protected $useExistingData = false; /** * @param bool $useExistingData */ public function __construct(Mapper $mapper, Locator $locator, $useExistingData = false) { $this->mapper = $mapper; $this->locator = $locator; $this->useExistingData = $useExistingData; } /** * @return string */ public function getMapper() { return $this->mapper; } public function setColumnFormatters($columnFormatters) { $this->columnFormatters = $columnFormatters; } /** * @return array */ public function getColumnFormatters() { return $this->columnFormatters; } public function mergeColumnFormattersWith($columnFormatters) { $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } public function setModifiers(array $modifiers) { $this->modifiers = $modifiers; } /** * @return array */ public function getModifiers() { return $this->modifiers; } public function mergeModifiersWith(array $modifiers) { $this->modifiers = array_merge($this->modifiers, $modifiers); } /** * @return array */ public function guessColumnFormatters(Generator $generator) { $formatters = []; $nameGuesser = new Name($generator); $columnTypeGuesser = new ColumnTypeGuesser($generator); $fields = $this->mapper->fields(); foreach ($fields as $fieldName => $field) { if ($field['primary'] === true) { continue; } if ($formatter = $nameGuesser->guessFormat($fieldName)) { $formatters[$fieldName] = $formatter; continue; } if ($formatter = $columnTypeGuesser->guessFormat($field)) { $formatters[$fieldName] = $formatter; continue; } } $entityName = $this->mapper->entity(); $entity = $this->mapper->build([]); $relations = $entityName::relations($this->mapper, $entity); foreach ($relations as $relation) { // We don't need any other relation here. if ($relation instanceof BelongsTo) { $fieldName = $relation->localKey(); $entityName = $relation->entityName(); $field = $fields[$fieldName]; $required = $field['required']; $locator = $this->locator; $formatters[$fieldName] = function ($inserted) use ($required, $entityName, $locator, $generator) { if (!empty($inserted[$entityName])) { return $generator->randomElement($inserted[$entityName])->get('id'); } if ($required && $this->useExistingData) { // We did not add anything like this, but it's required, // So let's find something existing in DB. $mapper = $locator->mapper($entityName); $records = $mapper->all()->limit(self::RELATED_FETCH_COUNT)->toArray(); if (empty($records)) { return null; } return $generator->randomElement($records)['id']; } return null; }; } } return $formatters; } /** * Insert one new record using the Entity class. * * @return string */ public function execute($insertedEntities) { $obj = $this->mapper->build([]); $this->fillColumns($obj, $insertedEntities); $this->callMethods($obj, $insertedEntities); $this->mapper->insert($obj); return $obj; } private function fillColumns($obj, $insertedEntities): void { foreach ($this->columnFormatters as $field => $format) { if (null !== $format) { $value = is_callable($format) ? $format($insertedEntities, $obj) : $format; $obj->set($field, $value); } } } private function callMethods($obj, $insertedEntities): void { foreach ($this->getModifiers() as $modifier) { $modifier($obj, $insertedEntities); } } } Spot/Populator.php 0000644 00000005031 15107542735 0010177 0 ustar 00 <?php namespace Faker\ORM\Spot; use Spot\Locator; /** * Service class for populating a database using the Spot ORM. */ class Populator { protected $generator; protected $locator; protected $entities = []; protected $quantities = []; /** * Populator constructor. */ public function __construct(\Faker\Generator $generator, Locator $locator = null) { $this->generator = $generator; $this->locator = $locator; } /** * Add an order for the generation of $number records for $entity. * * @param string $entityName Name of Entity object to generate * @param int $number The number of entities to populate * @param array $customColumnFormatters * @param array $customModifiers * @param bool $useExistingData Should we use existing rows (e.g. roles) to populate relations? */ public function addEntity( $entityName, $number, $customColumnFormatters = [], $customModifiers = [], $useExistingData = false ) { $mapper = $this->locator->mapper($entityName); if (null === $mapper) { throw new \InvalidArgumentException('No mapper can be found for entity ' . $entityName); } $entity = new EntityPopulator($mapper, $this->locator, $useExistingData); $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator)); if ($customColumnFormatters) { $entity->mergeColumnFormattersWith($customColumnFormatters); } $entity->mergeModifiersWith($customModifiers); $this->entities[$entityName] = $entity; $this->quantities[$entityName] = $number; } /** * Populate the database using all the Entity classes previously added. * * @param Locator $locator A Spot locator * * @return array A list of the inserted PKs */ public function execute($locator = null) { if (null === $locator) { $locator = $this->locator; } if (null === $locator) { throw new \InvalidArgumentException('No entity manager passed to Spot Populator.'); } $insertedEntities = []; foreach ($this->quantities as $entityName => $number) { for ($i = 0; $i < $number; ++$i) { $insertedEntities[$entityName][] = $this->entities[$entityName]->execute( $insertedEntities, ); } } return $insertedEntities; } } Spot/ColumnTypeGuesser.php 0000644 00000004350 15107542735 0011652 0 ustar 00 <?php namespace Faker\ORM\Spot; use Faker\Generator; class ColumnTypeGuesser { protected $generator; /** * ColumnTypeGuesser constructor. */ public function __construct(Generator $generator) { $this->generator = $generator; } /** * @return \Closure|null */ public function guessFormat(array $field) { $generator = $this->generator; $type = $field['type']; switch ($type) { case 'boolean': return static function () use ($generator) { return $generator->boolean; }; case 'decimal': $size = $field['precision'] ?? 2; return static function () use ($generator, $size) { return $generator->randomNumber($size + 2) / 100; }; case 'smallint': return static function () use ($generator) { return $generator->numberBetween(0, 65535); }; case 'integer': return static function () use ($generator) { return $generator->numberBetween(0, 2147483647); }; case 'bigint': return static function () use ($generator) { return $generator->numberBetween(0, PHP_INT_MAX); }; case 'float': return static function () use ($generator) { return $generator->randomFloat(null, 0, 4294967295); }; case 'string': $size = $field['length'] ?? 255; return static function () use ($generator, $size) { return $generator->text($size); }; case 'text': return static function () use ($generator) { return $generator->text; }; case 'datetime': case 'date': case 'time': return static function () use ($generator) { return $generator->datetime; }; default: // no smart way to guess what the user expects here return null; } } } Propel2/EntityPopulator.php 0000644 00000013276 15107542735 0012004 0 ustar 00 <?php namespace Faker\ORM\Propel2; use Faker\Provider\Base; use Propel\Runtime\Map\ColumnMap; /** * Service class for populating a table through a Propel ActiveRecord class. */ class EntityPopulator { protected $class; protected $columnFormatters = []; protected $modifiers = []; /** * @param string $class A Propel ActiveRecord classname */ public function __construct($class) { $this->class = $class; } /** * @return string */ public function getClass() { return $this->class; } public function setColumnFormatters($columnFormatters) { $this->columnFormatters = $columnFormatters; } /** * @return array */ public function getColumnFormatters() { return $this->columnFormatters; } public function mergeColumnFormattersWith($columnFormatters) { $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } /** * @return array */ public function guessColumnFormatters(\Faker\Generator $generator) { $formatters = []; $class = $this->class; $peerClass = $class::TABLE_MAP; $tableMap = $peerClass::getTableMap(); $nameGuesser = new \Faker\Guesser\Name($generator); $columnTypeGuesser = new \Faker\ORM\Propel2\ColumnTypeGuesser($generator); foreach ($tableMap->getColumns() as $columnMap) { // skip behavior columns, handled by modifiers if ($this->isColumnBehavior($columnMap)) { continue; } if ($columnMap->isForeignKey()) { $relatedClass = $columnMap->getRelation()->getForeignTable()->getClassname(); $formatters[$columnMap->getPhpName()] = static function ($inserted) use ($relatedClass, $generator) { $relatedClass = trim($relatedClass, '\\'); return isset($inserted[$relatedClass]) ? $generator->randomElement($inserted[$relatedClass]) : null; }; continue; } if ($columnMap->isPrimaryKey()) { continue; } if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName(), $columnMap->getSize())) { $formatters[$columnMap->getPhpName()] = $formatter; continue; } if ($formatter = $columnTypeGuesser->guessFormat($columnMap)) { $formatters[$columnMap->getPhpName()] = $formatter; continue; } } return $formatters; } /** * @return bool */ protected function isColumnBehavior(ColumnMap $columnMap) { foreach ($columnMap->getTable()->getBehaviors() as $name => $params) { $columnName = Base::toLower($columnMap->getName()); switch ($name) { case 'nested_set': $columnNames = [$params['left_column'], $params['right_column'], $params['level_column']]; if (in_array($columnName, $columnNames, false)) { return true; } break; case 'timestampable': $columnNames = [$params['create_column'], $params['update_column']]; if (in_array($columnName, $columnNames, false)) { return true; } break; } } return false; } public function setModifiers($modifiers) { $this->modifiers = $modifiers; } /** * @return array */ public function getModifiers() { return $this->modifiers; } public function mergeModifiersWith($modifiers) { $this->modifiers = array_merge($this->modifiers, $modifiers); } /** * @return array */ public function guessModifiers(\Faker\Generator $generator) { $modifiers = []; $class = $this->class; $peerClass = $class::TABLE_MAP; $tableMap = $peerClass::getTableMap(); foreach ($tableMap->getBehaviors() as $name => $params) { switch ($name) { case 'nested_set': $modifiers['nested_set'] = static function ($obj, $inserted) use ($class, $generator): void { if (isset($inserted[$class])) { $queryClass = $class . 'Query'; $parent = $queryClass::create()->findPk($generator->randomElement($inserted[$class])); $obj->insertAsLastChildOf($parent); } else { $obj->makeRoot(); } }; break; case 'sortable': $modifiers['sortable'] = static function ($obj, $inserted) use ($class, $generator): void { $obj->insertAtRank($generator->numberBetween(1, count($inserted[$class] ?? []) + 1)); }; break; } } return $modifiers; } /** * Insert one new record using the Entity class. */ public function execute($con, $insertedEntities) { $obj = new $this->class(); foreach ($this->getColumnFormatters() as $column => $format) { if (null !== $format) { $obj->setByName($column, is_callable($format) ? $format($insertedEntities, $obj) : $format); } } foreach ($this->getModifiers() as $modifier) { $modifier($obj, $insertedEntities); } $obj->save($con); return $obj->getPrimaryKey(); } } Propel2/Populator.php 0000644 00000005503 15107542735 0010601 0 ustar 00 <?php namespace Faker\ORM\Propel2; use Propel\Runtime\Propel; use Propel\Runtime\ServiceContainer\ServiceContainerInterface; /** * Service class for populating a database using the Propel ORM. * A Populator can populate several tables using ActiveRecord classes. */ class Populator { protected $generator; protected $entities = []; protected $quantities = []; public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } /** * Add an order for the generation of $number records for $entity. * * @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel2\EntityPopulator instance * @param int $number The number of entities to populate */ public function addEntity($entity, $number, $customColumnFormatters = [], $customModifiers = []) { if (!$entity instanceof \Faker\ORM\Propel2\EntityPopulator) { $entity = new \Faker\ORM\Propel2\EntityPopulator($entity); } $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator)); if ($customColumnFormatters) { $entity->mergeColumnFormattersWith($customColumnFormatters); } $entity->setModifiers($entity->guessModifiers($this->generator)); if ($customModifiers) { $entity->mergeModifiersWith($customModifiers); } $class = $entity->getClass(); $this->entities[$class] = $entity; $this->quantities[$class] = $number; } /** * Populate the database using all the Entity classes previously added. * * @param PropelPDO $con A Propel connection object * * @return array A list of the inserted PKs */ public function execute($con = null) { if (null === $con) { $con = $this->getConnection(); } $isInstancePoolingEnabled = Propel::isInstancePoolingEnabled(); Propel::disableInstancePooling(); $insertedEntities = []; $con->beginTransaction(); foreach ($this->quantities as $class => $number) { for ($i = 0; $i < $number; ++$i) { $insertedEntities[$class][] = $this->entities[$class]->execute($con, $insertedEntities); } } $con->commit(); if ($isInstancePoolingEnabled) { Propel::enableInstancePooling(); } return $insertedEntities; } protected function getConnection() { // use the first connection available $class = key($this->entities); if (!$class) { throw new \RuntimeException('No class found from entities. Did you add entities to the Populator ?'); } $peer = $class::TABLE_MAP; return Propel::getConnection($peer::DATABASE_NAME, ServiceContainerInterface::CONNECTION_WRITE); } } Propel2/ColumnTypeGuesser.php 0000644 00000006672 15107542735 0012261 0 ustar 00 <?php namespace Faker\ORM\Propel2; use Propel\Generator\Model\PropelTypes; use Propel\Runtime\Map\ColumnMap; class ColumnTypeGuesser { protected $generator; public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } /** * @return \Closure|null */ public function guessFormat(ColumnMap $column) { $generator = $this->generator; if ($column->isTemporal()) { if ($column->getType() == PropelTypes::BU_DATE || $column->getType() == PropelTypes::BU_TIMESTAMP) { return static function () use ($generator) { return $generator->dateTime; }; } return static function () use ($generator) { return $generator->dateTimeAD; }; } $type = $column->getType(); switch ($type) { case PropelTypes::BOOLEAN: case PropelTypes::BOOLEAN_EMU: return static function () use ($generator) { return $generator->boolean; }; case PropelTypes::NUMERIC: case PropelTypes::DECIMAL: $size = $column->getSize(); return static function () use ($generator, $size) { return $generator->randomNumber($size + 2) / 100; }; case PropelTypes::TINYINT: return static function () use ($generator) { return $generator->numberBetween(0, 127); }; case PropelTypes::SMALLINT: return static function () use ($generator) { return $generator->numberBetween(0, 32767); }; case PropelTypes::INTEGER: return static function () use ($generator) { return $generator->numberBetween(0, 2147483647); }; case PropelTypes::BIGINT: return static function () use ($generator) { return $generator->numberBetween(0, PHP_INT_MAX); }; case PropelTypes::FLOAT: case PropelTypes::DOUBLE: case PropelTypes::REAL: return static function () use ($generator) { return $generator->randomFloat(); }; case PropelTypes::CHAR: case PropelTypes::VARCHAR: case PropelTypes::BINARY: case PropelTypes::VARBINARY: $size = $column->getSize(); return static function () use ($generator, $size) { return $generator->text($size); }; case PropelTypes::LONGVARCHAR: case PropelTypes::LONGVARBINARY: case PropelTypes::CLOB: case PropelTypes::CLOB_EMU: case PropelTypes::BLOB: return static function () use ($generator) { return $generator->text; }; case PropelTypes::ENUM: $valueSet = $column->getValueSet(); return static function () use ($generator, $valueSet) { return $generator->randomElement($valueSet); }; case PropelTypes::OBJECT: case PropelTypes::PHP_ARRAY: default: // no smart way to guess what the user expects here return null; } } } Doctrine/EntityPopulator.php 0000644 00000016315 15107542735 0012225 0 ustar 00 <?php namespace Faker\ORM\Doctrine; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\Common\Persistence\ObjectManager; require_once 'backward-compatibility.php'; /** * Service class for populating a table through a Doctrine Entity class. */ class EntityPopulator { /** * @var ClassMetadata */ protected $class; /** * @var array */ protected $columnFormatters = []; /** * @var array */ protected $modifiers = []; public function __construct(ClassMetadata $class) { $this->class = $class; } /** * @return string */ public function getClass() { return $this->class->getName(); } public function setColumnFormatters($columnFormatters) { $this->columnFormatters = $columnFormatters; } /** * @return array */ public function getColumnFormatters() { return $this->columnFormatters; } public function mergeColumnFormattersWith($columnFormatters) { $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } public function setModifiers(array $modifiers) { $this->modifiers = $modifiers; } /** * @return array */ public function getModifiers() { return $this->modifiers; } public function mergeModifiersWith(array $modifiers) { $this->modifiers = array_merge($this->modifiers, $modifiers); } /** * @return array */ public function guessColumnFormatters(\Faker\Generator $generator) { $formatters = []; $nameGuesser = new \Faker\Guesser\Name($generator); $columnTypeGuesser = new ColumnTypeGuesser($generator); foreach ($this->class->getFieldNames() as $fieldName) { if ($this->class->isIdentifier($fieldName) || !$this->class->hasField($fieldName)) { continue; } $size = $this->class->fieldMappings[$fieldName]['length'] ?? null; if ($formatter = $nameGuesser->guessFormat($fieldName, $size)) { $formatters[$fieldName] = $formatter; continue; } if ($formatter = $columnTypeGuesser->guessFormat($fieldName, $this->class)) { $formatters[$fieldName] = $formatter; continue; } } foreach ($this->class->getAssociationNames() as $assocName) { if ($this->class->isCollectionValuedAssociation($assocName)) { continue; } $relatedClass = $this->class->getAssociationTargetClass($assocName); $unique = $optional = false; if ($this->class instanceof \Doctrine\ORM\Mapping\ClassMetadata) { $mappings = $this->class->getAssociationMappings(); foreach ($mappings as $mapping) { if ($mapping['targetEntity'] == $relatedClass) { if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_ONE) { $unique = true; $optional = $mapping['joinColumns'][0]['nullable'] ?? false; break; } } } } elseif ($this->class instanceof \Doctrine\ODM\MongoDB\Mapping\ClassMetadata) { $mappings = $this->class->associationMappings; foreach ($mappings as $mapping) { if ($mapping['targetDocument'] == $relatedClass) { if ($mapping['type'] == \Doctrine\ODM\MongoDB\Mapping\ClassMetadata::ONE && $mapping['association'] == \Doctrine\ODM\MongoDB\Mapping\ClassMetadata::REFERENCE_ONE) { $unique = true; $optional = $mapping['nullable'] ?? false; break; } } } } $index = 0; $formatters[$assocName] = static function ($inserted) use ($relatedClass, &$index, $unique, $optional, $generator) { if (isset($inserted[$relatedClass])) { if ($unique) { $related = null; if (isset($inserted[$relatedClass][$index]) || !$optional) { $related = $inserted[$relatedClass][$index]; } ++$index; return $related; } return $generator->randomElement($inserted[$relatedClass]); } return null; }; } return $formatters; } /** * Insert one new record using the Entity class. * * @param bool $generateId * * @return EntityPopulator */ public function execute(ObjectManager $manager, $insertedEntities, $generateId = false) { $obj = $this->class->newInstance(); $this->fillColumns($obj, $insertedEntities); $this->callMethods($obj, $insertedEntities); if ($generateId) { $idsName = $this->class->getIdentifier(); foreach ($idsName as $idName) { $id = $this->generateId($obj, $idName, $manager); $this->class->reflFields[$idName]->setValue($obj, $id); } } $manager->persist($obj); return $obj; } private function fillColumns($obj, $insertedEntities): void { foreach ($this->columnFormatters as $field => $format) { if (null !== $format) { // Add some extended debugging information to any errors thrown by the formatter try { $value = is_callable($format) ? $format($insertedEntities, $obj) : $format; } catch (\InvalidArgumentException $ex) { throw new \InvalidArgumentException(sprintf( 'Failed to generate a value for %s::%s: %s', get_class($obj), $field, $ex->getMessage(), )); } // Try a standard setter if it's available, otherwise fall back on reflection $setter = sprintf('set%s', ucfirst($field)); if (is_callable([$obj, $setter])) { $obj->$setter($value); } else { $this->class->reflFields[$field]->setValue($obj, $value); } } } } private function callMethods($obj, $insertedEntities): void { foreach ($this->getModifiers() as $modifier) { $modifier($obj, $insertedEntities); } } /** * @return int */ private function generateId($obj, $column, ObjectManager $manager) { $repository = $manager->getRepository(get_class($obj)); $result = $repository->createQueryBuilder('e') ->select(sprintf('e.%s', $column)) ->getQuery() ->execute(); $ids = array_map('current', $result->toArray()); do { $id = mt_rand(); } while (in_array($id, $ids, false)); return $id; } } Doctrine/Populator.php 0000644 00000006767 15107542735 0011042 0 ustar 00 <?php namespace Faker\ORM\Doctrine; use Doctrine\Common\Persistence\ObjectManager; use Faker\Generator; require_once 'backward-compatibility.php'; /** * Service class for populating a database using the Doctrine ORM or ODM. * A Populator can populate several tables using ActiveRecord classes. */ class Populator { /** * @var int */ protected $batchSize; /** * @var Generator */ protected $generator; /** * @var ObjectManager|null */ protected $manager; /** * @var array */ protected $entities = []; /** * @var array */ protected $quantities = []; /** * @var array */ protected $generateId = []; /** * Populator constructor. * * @param int $batchSize */ public function __construct(Generator $generator, ObjectManager $manager = null, $batchSize = 1000) { $this->generator = $generator; $this->manager = $manager; $this->batchSize = $batchSize; } /** * Add an order for the generation of $number records for $entity. * * @param mixed $entity A Doctrine classname, or a \Faker\ORM\Doctrine\EntityPopulator instance * @param int $number The number of entities to populate */ public function addEntity($entity, $number, $customColumnFormatters = [], $customModifiers = [], $generateId = false) { if (!$entity instanceof \Faker\ORM\Doctrine\EntityPopulator) { if (null === $this->manager) { throw new \InvalidArgumentException('No entity manager passed to Doctrine Populator.'); } $entity = new \Faker\ORM\Doctrine\EntityPopulator($this->manager->getClassMetadata($entity)); } $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator)); if ($customColumnFormatters) { $entity->mergeColumnFormattersWith($customColumnFormatters); } $entity->mergeModifiersWith($customModifiers); $this->generateId[$entity->getClass()] = $generateId; $class = $entity->getClass(); $this->entities[$class] = $entity; $this->quantities[$class] = $number; } /** * Populate the database using all the Entity classes previously added. * * Please note that large amounts of data will result in more memory usage since the the Populator will return * all newly created primary keys after executing. * * @param ObjectManager|null $entityManager A Doctrine connection object * * @return array A list of the inserted PKs */ public function execute($entityManager = null) { if (null === $entityManager) { $entityManager = $this->manager; } if (null === $entityManager) { throw new \InvalidArgumentException('No entity manager passed to Doctrine Populator.'); } $insertedEntities = []; foreach ($this->quantities as $class => $number) { $generateId = $this->generateId[$class]; for ($i = 0; $i < $number; ++$i) { $insertedEntities[$class][] = $this->entities[$class]->execute( $entityManager, $insertedEntities, $generateId, ); if (count($insertedEntities) % $this->batchSize === 0) { $entityManager->flush(); } } $entityManager->flush(); } return $insertedEntities; } } Doctrine/ColumnTypeGuesser.php 0000644 00000005172 15107542735 0012477 0 ustar 00 <?php namespace Faker\ORM\Doctrine; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Faker\Generator; require_once 'backward-compatibility.php'; class ColumnTypeGuesser { protected $generator; public function __construct(Generator $generator) { $this->generator = $generator; } /** * @return \Closure|null */ public function guessFormat($fieldName, ClassMetadata $class) { $generator = $this->generator; $type = $class->getTypeOfField($fieldName); switch ($type) { case 'boolean': return static function () use ($generator) { return $generator->boolean; }; case 'decimal': $size = $class->fieldMappings[$fieldName]['precision'] ?? 2; return static function () use ($generator, $size) { return $generator->randomNumber($size + 2) / 100; }; case 'smallint': return static function () use ($generator) { return $generator->numberBetween(0, 65535); }; case 'integer': return static function () use ($generator) { return $generator->numberBetween(0, 2147483647); }; case 'bigint': return static function () use ($generator) { return $generator->numberBetween(0, PHP_INT_MAX); }; case 'float': return static function () use ($generator) { return $generator->randomFloat(); }; case 'string': $size = $class->fieldMappings[$fieldName]['length'] ?? 255; return static function () use ($generator, $size) { return $generator->text($size); }; case 'text': return static function () use ($generator) { return $generator->text; }; case 'datetime': case 'date': case 'time': return static function () use ($generator) { return $generator->datetime; }; case 'datetime_immutable': case 'date_immutable': case 'time_immutable': return static function () use ($generator) { return \DateTimeImmutable::createFromMutable($generator->datetime); }; default: // no smart way to guess what the user expects here return null; } } } Doctrine/backward-compatibility.php 0000644 00000000626 15107542735 0013466 0 ustar 00 <?php declare(strict_types=1); if (!class_exists('Doctrine\Common\Persistence\Mapping\ClassMetadata')) { class_alias(\Doctrine\Persistence\Mapping\ClassMetadata::class, 'Doctrine\Common\Persistence\Mapping\ClassMetadata'); } if (!class_exists('Doctrine\Common\Persistence\ObjectManager')) { class_alias(\Doctrine\Persistence\ObjectManager::class, 'Doctrine\Common\Persistence\ObjectManager'); } CakePHP/EntityPopulator.php 0000644 00000010766 15107542735 0011675 0 ustar 00 <?php namespace Faker\ORM\CakePHP; use Cake\ORM\TableRegistry; class EntityPopulator { protected $class; protected $connectionName; protected $columnFormatters = []; protected $modifiers = []; public function __construct($class) { $this->class = $class; } /** * @param string $name */ public function __get($name) { return $this->{$name}; } /** * @param string $name */ public function __set($name, $value) { $this->{$name} = $value; } public function mergeColumnFormattersWith($columnFormatters) { $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); } public function mergeModifiersWith($modifiers) { $this->modifiers = array_merge($this->modifiers, $modifiers); } /** * @return array */ public function guessColumnFormatters($populator) { $formatters = []; $class = $this->class; $table = $this->getTable($class); $schema = $table->schema(); $pk = $schema->primaryKey(); $guessers = $populator->getGuessers() + ['ColumnTypeGuesser' => new ColumnTypeGuesser($populator->getGenerator())]; $isForeignKey = static function ($column) use ($table) { foreach ($table->associations()->type('BelongsTo') as $assoc) { if ($column == $assoc->foreignKey()) { return true; } } return false; }; foreach ($schema->columns() as $column) { if ($column == $pk[0] || $isForeignKey($column)) { continue; } foreach ($guessers as $guesser) { if ($formatter = $guesser->guessFormat($column, $table)) { $formatters[$column] = $formatter; break; } } } return $formatters; } /** * @return array */ public function guessModifiers() { $modifiers = []; $table = $this->getTable($this->class); $belongsTo = $table->associations()->type('BelongsTo'); foreach ($belongsTo as $assoc) { $modifiers['belongsTo' . $assoc->name()] = function ($data, $insertedEntities) use ($assoc) { $table = $assoc->target(); $foreignModel = $table->alias(); $foreignKeys = []; if (!empty($insertedEntities[$foreignModel])) { $foreignKeys = $insertedEntities[$foreignModel]; } else { $foreignKeys = $table->find('all') ->select(['id']) ->map(static function ($row) { return $row->id; }) ->toArray(); } if (empty($foreignKeys)) { throw new \Exception(sprintf('%s belongsTo %s, which seems empty at this point.', $this->getTable($this->class)->table(), $assoc->table())); } $foreignKey = $foreignKeys[array_rand($foreignKeys)]; $data[$assoc->foreignKey()] = $foreignKey; return $data; }; } // TODO check if TreeBehavior attached to modify lft/rgt cols return $modifiers; } /** * @param array $options */ public function execute($class, $insertedEntities, $options = []) { $table = $this->getTable($class); $entity = $table->newEntity(); foreach ($this->columnFormatters as $column => $format) { if (null !== $format) { $entity->{$column} = is_callable($format) ? $format($insertedEntities, $table) : $format; } } foreach ($this->modifiers as $modifier) { $entity = $modifier($entity, $insertedEntities); } if (!$entity = $table->save($entity, $options)) { throw new \RuntimeException("Failed saving $class record"); } $pk = $table->primaryKey(); if (is_string($pk)) { return $entity->{$pk}; } return $entity->{$pk[0]}; } public function setConnection($name) { $this->connectionName = $name; } protected function getTable($class) { $options = []; if (!empty($this->connectionName)) { $options['connection'] = $this->connectionName; } return TableRegistry::get($class, $options); } } CakePHP/Populator.php 0000644 00000004726 15107542735 0010477 0 ustar 00 <?php namespace Faker\ORM\CakePHP; class Populator { protected $generator; protected $entities = []; protected $quantities = []; protected $guessers = []; public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } /** * @return \Faker\Generator */ public function getGenerator() { return $this->generator; } /** * @return array */ public function getGuessers() { return $this->guessers; } /** * @return $this */ public function removeGuesser($name) { if ($this->guessers[$name]) { unset($this->guessers[$name]); } return $this; } /** * @throws \Exception * * @return $this */ public function addGuesser($class) { if (!is_object($class)) { $class = new $class($this->generator); } if (!method_exists($class, 'guessFormat')) { throw new \Exception('Missing required custom guesser method: ' . get_class($class) . '::guessFormat()'); } $this->guessers[get_class($class)] = $class; return $this; } /** * @param array $customColumnFormatters * @param array $customModifiers * * @return $this */ public function addEntity($entity, $number, $customColumnFormatters = [], $customModifiers = []) { if (!$entity instanceof EntityPopulator) { $entity = new EntityPopulator($entity); } $entity->columnFormatters = $entity->guessColumnFormatters($this); if ($customColumnFormatters) { $entity->mergeColumnFormattersWith($customColumnFormatters); } $entity->modifiers = $entity->guessModifiers($this); if ($customModifiers) { $entity->mergeModifiersWith($customModifiers); } $class = $entity->class; $this->entities[$class] = $entity; $this->quantities[$class] = $number; return $this; } /** * @param array $options * * @return array */ public function execute($options = []) { $insertedEntities = []; foreach ($this->quantities as $class => $number) { for ($i = 0; $i < $number; ++$i) { $insertedEntities[$class][] = $this->entities[$class]->execute($class, $insertedEntities, $options); } } return $insertedEntities; } } CakePHP/ColumnTypeGuesser.php 0000644 00000004255 15107542735 0012144 0 ustar 00 <?php namespace Faker\ORM\CakePHP; class ColumnTypeGuesser { protected $generator; public function __construct(\Faker\Generator $generator) { $this->generator = $generator; } /** * @return \Closure|null */ public function guessFormat($column, $table) { $generator = $this->generator; $schema = $table->schema(); switch ($schema->columnType($column)) { case 'boolean': return static function () use ($generator) { return $generator->boolean; }; case 'integer': return static function () use ($generator) { return $generator->numberBetween(0, 2147483647); }; case 'biginteger': return static function () use ($generator) { return $generator->numberBetween(0, PHP_INT_MAX); }; case 'decimal': case 'float': return static function () use ($generator) { return $generator->randomFloat(); }; case 'uuid': return static function () use ($generator) { return $generator->uuid(); }; case 'string': if (method_exists($schema, 'getColumn')) { $columnData = $schema->getColumn($column); } else { $columnData = $schema->column($column); } $length = $columnData['length']; return static function () use ($generator, $length) { return $generator->text($length); }; case 'text': return static function () use ($generator) { return $generator->text(); }; case 'date': case 'datetime': case 'timestamp': case 'time': return static function () use ($generator) { return $generator->datetime(); }; case 'binary': default: return null; } } }
Simpan