add : faster permalinks creation

fix : bad label escaping
This commit is contained in:
jygaulier
2020-11-18 11:12:16 +01:00
parent 9c804638fe
commit ebfaedb427
2 changed files with 32 additions and 30 deletions

View File

@@ -256,8 +256,7 @@ class BuildPermalinks extends Command
$s .= " WHERE " . $w; $s .= " WHERE " . $w;
} }
$s .= " ORDER BY record_id ASC"; $sqlSelect = "SELECT s.record_id, GROUP_CONCAT(s.subdef_id) AS subdef_ids FROM " . $s . " GROUP BY record_id";
$sqlSelect = "SELECT s.record_id, s.subdef_id, s.name FROM " . $s;
if ($this->show_sql) { if ($this->show_sql) {
$this->output->writeln($sqlSelect); $this->output->writeln($sqlSelect);
} }
@@ -271,7 +270,6 @@ class BuildPermalinks extends Command
} }
else { else {
$stmt = $this->connection->executeQuery($sqlSelect); $stmt = $this->connection->executeQuery($sqlSelect);
$record = $last_rid = null;
$time_start = microtime(true); $time_start = microtime(true);
$duration = 0.0; $duration = 0.0;
$n_created = 0; $n_created = 0;
@@ -279,12 +277,9 @@ class BuildPermalinks extends Command
$app = $this->getContainer(); $app = $this->getContainer();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$record_id = $row['record_id']; $record_id = $row['record_id'];
$subdef_id = $row['subdef_id']; $subdef_ids = $row['subdef_ids'];
$name = $row['name']; $record = $this->databox->get_record($record_id);
if($record_id !== $last_rid) {
$last_rid = $record_id;
$record = $this->databox->get_record($record_id);
}
if($record) { if($record) {
try { try {
/* /*
@@ -295,8 +290,8 @@ class BuildPermalinks extends Command
/* /*
* todo : use permalink adapter * todo : use permalink adapter
*/ */
media_Permalink_Adapter::createFromRecord($app, $record, $subdef_id); $subdef_ids = explode(',', $subdef_ids);
$n_created++; $n_created += media_Permalink_Adapter::createFromRecord($app, $record, $subdef_ids);
} }
catch (\Exception $e) { catch (\Exception $e) {
// cant get record ? ignore // cant get record ? ignore
@@ -304,8 +299,7 @@ class BuildPermalinks extends Command
} }
$duration = microtime(true) - $time_start ; $duration = microtime(true) - $time_start ;
if($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) { if($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
$name = substr($name, 0, 20); $lmax = max($lmax, strlen($msg = sprintf("rid: %-6s %4.1f\r", $record_id, $n_created / $duration)));
$lmax = max($lmax, strlen($msg = sprintf("rid: %-6s %-20s %10.1f\r", $record_id, $name, $n_created / $duration)));
$output->write($msg, $this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE); $output->write($msg, $this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE);
} }
} }
@@ -313,7 +307,7 @@ class BuildPermalinks extends Command
$output->write(str_repeat(' ', $lmax) . "\r"); // clear the line $output->write(str_repeat(' ', $lmax) . "\r"); // clear the line
$duration = max(.000001, $duration); // avoid division by 0 (anyway n_created is 0 in this case) $duration = max(.000001, $duration); // avoid division by 0 (anyway n_created is 0 in this case)
$output->writeln(sprintf("%s permalinks created in %.2f seconds : %.1f p/s", $n_created, $duration, $n_created / $duration )); $output->writeln(sprintf("%s permalinks created in %.1f seconds : %.1f p/s", $n_created, $duration, $n_created / $duration ));
} }
} }

View File

@@ -377,35 +377,43 @@ class media_Permalink_Adapter implements cache_cacheableInterface
/** /**
* @param Application $app * @param Application $app
* @param record_adapter $record * @param record_adapter $record
* @param int $subdef_id * @param int[] $subdef_ids
* @throws DBALException * @return int
*/ */
public static function createFromRecord(Application $app, record_adapter $record, $subdef_id) public static function createFromRecord(Application $app, record_adapter $record, $subdef_ids)
{ {
/** @var Generator $generator */ /** @var Generator $generator */
$generator = $app['random.medium']; $generator = $app['random.medium'];
/** @var unicode $unicode */ /** @var unicode $unicode */
$unicode = $app['unicode']; $unicode = $app['unicode'];
$params = [
'subdef_id' => $subdef_id,
'token' => $generator->generateString(64, TokenManipulator::LETTERS_AND_NUMBERS),
'label' => self::cleanLabel($unicode, $record->get_title(['removeExtension' => true])),
];
$connection = $record->getDatabox()->get_connection(); $connection = $record->getDatabox()->get_connection();
$sql = "INSERT INTO permalinks (subdef_id, token, activated, created_on, last_modified, label)\n"
. " VALUES (:subdef_id, :token, 1, NOW(), NOW(), :label)";
$statement = $connection->prepare($sql); $n_created = 0;
try { // build a multi-rows insert
$statement->execute($params); $inserts = '';
// constant part values
$insk = ", 1, NOW(), NOW(), " . $connection->quote(self::cleanLabel($unicode, $record->get_title(['removeExtension' => true])));
// multiple rows
foreach($subdef_ids as $subdef_id) {
$inserts .= ($inserts ? ',' : '') . '('
. $connection->quote($subdef_id) . ', '
. $connection->quote($generator->generateString(64, TokenManipulator::LETTERS_AND_NUMBERS))
. $insk . ')';
} }
catch(Exception $e) { $sql = "INSERT INTO permalinks (subdef_id, token, activated, created_on, last_modified, label)\n"
. " VALUES " . $inserts;
try {
$connection->exec($sql);
$n_created += count($subdef_ids);
}
catch (Exception $e) {
// we ignore this because somebody else might have created this plink // we ignore this because somebody else might have created this plink
// between the test of "to be created" and here // between the test of "to be created" and here
} }
$statement->closeCursor();
return $n_created;
} }
/** /**
@@ -552,7 +560,7 @@ SQL;
private static function cleanLabel(unicode $unicode, $label) private static function cleanLabel(unicode $unicode, $label)
{ {
$label = $unicode->remove_nonazAZ09( $label = $unicode->remove_nonazAZ09(
preg_replace("/\\s\\s+/", '-', trim($label)) preg_replace("/\\s+/", '-', trim($label))
); );
return $label ? $label : 'untitled'; return $label ? $label : 'untitled';