Merge pull request #2702 from wallabag/add-index-uuid

Added index on entry.uuid
This commit is contained in:
Nicolas Lœuillet 2016-12-29 10:54:07 +01:00 committed by GitHub
commit 8527238846
6 changed files with 85 additions and 29 deletions

View file

@ -27,8 +27,7 @@ build: ## Run grunt
@grunt @grunt
test: ## Launch wallabag testsuite test: ## Launch wallabag testsuite
@if [ ! -d "vendor/phpunit" ]; then composer install; fi @ant prepare && bin/simple-phpunit -v
@ant prepare && vendor/phpunit/phpunit/phpunit -v
release: ## Create a package. Need a VERSION parameter (eg: `make release VERSION=master`). release: ## Create a package. Need a VERSION parameter (eg: `make release VERSION=master`).
ifndef VERSION ifndef VERSION

View file

@ -31,10 +31,11 @@ class Version20160410190541 extends AbstractMigration implements ContainerAwareI
{ {
$entryTable = $schema->getTable($this->getTable('entry')); $entryTable = $schema->getTable($this->getTable('entry'));
$this->skipIf($entryTable->hasColumn('uuid'), 'It seems that you already played this migration.'); $this->skipIf($entryTable->hasColumn('uid'), 'It seems that you already played this migration.');
$entryTable->addColumn('uuid', 'guid', [ $entryTable->addColumn('uid', 'string', [
'notnull' => false, 'notnull' => false,
'length' => 23,
]); ]);
$this->addSql('INSERT INTO '.$this->getTable('craue_config_setting')." (name, value, section) VALUES ('share_public', '1', 'entry')"); $this->addSql('INSERT INTO '.$this->getTable('craue_config_setting')." (name, value, section) VALUES ('share_public', '1', 'entry')");
} }
@ -45,7 +46,7 @@ class Version20160410190541 extends AbstractMigration implements ContainerAwareI
public function down(Schema $schema) public function down(Schema $schema)
{ {
$entryTable = $schema->getTable($this->getTable('entry')); $entryTable = $schema->getTable($this->getTable('entry'));
$entryTable->dropColumn('uuid'); $entryTable->dropColumn('uid');
$this->addSql('DELETE FROM '.$this->getTable('craue_config_setting')." WHERE name = 'share_public'"); $this->addSql('DELETE FROM '.$this->getTable('craue_config_setting')." WHERE name = 'share_public'");
} }

View file

@ -0,0 +1,53 @@
<?php
namespace Application\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Added index on wallabag_entry.uid
*/
class Version20161214094403 extends AbstractMigration implements ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
private $container;
private $indexName = 'IDX_entry_uid';
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
private function getTable($tableName)
{
return $this->container->getParameter('database_table_prefix').$tableName;
}
/**
* @param Schema $schema
*/
public function up(Schema $schema)
{
$entryTable = $schema->getTable($this->getTable('entry'));
$this->skipIf($entryTable->hasIndex($this->indexName), 'It seems that you already played this migration.');
$entryTable->addIndex(['uid'], $this->indexName);
}
/**
* @param Schema $schema
*/
public function down(Schema $schema)
{
$entryTable = $schema->getTable($this->getTable('entry'));
$this->skipIf(false === $entryTable->hasIndex($this->indexName), 'It seems that you already played this migration.');
$entryTable->dropIndex($this->indexName);
}
}

View file

@ -539,8 +539,8 @@ class EntryController extends Controller
{ {
$this->checkUserAction($entry); $this->checkUserAction($entry);
if (null === $entry->getUuid()) { if (null === $entry->getUid()) {
$entry->generateUuid(); $entry->generateUid();
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$em->persist($entry); $em->persist($entry);
@ -548,7 +548,7 @@ class EntryController extends Controller
} }
return $this->redirect($this->generateUrl('share_entry', [ return $this->redirect($this->generateUrl('share_entry', [
'uuid' => $entry->getUuid(), 'uid' => $entry->getUid(),
])); ]));
} }
@ -565,7 +565,7 @@ class EntryController extends Controller
{ {
$this->checkUserAction($entry); $this->checkUserAction($entry);
$entry->cleanUuid(); $entry->cleanUid();
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$em->persist($entry); $em->persist($entry);
@ -581,7 +581,7 @@ class EntryController extends Controller
* *
* @param Entry $entry * @param Entry $entry
* *
* @Route("/share/{uuid}", requirements={"uuid" = ".+"}, name="share_entry") * @Route("/share/{uid}", requirements={"uid" = ".+"}, name="share_entry")
* @Cache(maxage="25200", smaxage="25200", public=true) * @Cache(maxage="25200", smaxage="25200", public=true)
* *
* @return \Symfony\Component\HttpFoundation\Response * @return \Symfony\Component\HttpFoundation\Response

View file

@ -22,7 +22,10 @@ use Wallabag\AnnotationBundle\Entity\Annotation;
* @ORM\Table( * @ORM\Table(
* name="`entry`", * name="`entry`",
* options={"collate"="utf8mb4_unicode_ci", "charset"="utf8mb4"}, * options={"collate"="utf8mb4_unicode_ci", "charset"="utf8mb4"},
* indexes={@ORM\Index(name="created_at", columns={"created_at"})} * indexes={
* @ORM\Index(name="created_at", columns={"created_at"}),
* @ORM\Index(name="uid", columns={"uid"})
* }
* ) * )
* @ORM\HasLifecycleCallbacks() * @ORM\HasLifecycleCallbacks()
* @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())") * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())")
@ -44,11 +47,11 @@ class Entry
/** /**
* @var string * @var string
* *
* @ORM\Column(name="uuid", type="text", nullable=true) * @ORM\Column(name="uid", type="string", length=23, nullable=true)
* *
* @Groups({"entries_for_user", "export_all"}) * @Groups({"entries_for_user", "export_all"})
*/ */
private $uuid; private $uid;
/** /**
* @var string * @var string
@ -649,34 +652,34 @@ class Entry
/** /**
* @return string * @return string
*/ */
public function getUuid() public function getUid()
{ {
return $this->uuid; return $this->uid;
} }
/** /**
* @param string $uuid * @param string $uid
* *
* @return Entry * @return Entry
*/ */
public function setUuid($uuid) public function setUid($uid)
{ {
$this->uuid = $uuid; $this->uid = $uid;
return $this; return $this;
} }
public function generateUuid() public function generateUid()
{ {
if (null === $this->uuid) { if (null === $this->uid) {
// @see http://blog.kevingomez.fr/til/2015/07/26/why-is-uniqid-slow/ for true parameter // @see http://blog.kevingomez.fr/til/2015/07/26/why-is-uniqid-slow/ for true parameter
$this->uuid = uniqid('', true); $this->uid = uniqid('', true);
} }
} }
public function cleanUuid() public function cleanUid()
{ {
$this->uuid = null; $this->uid = null;
} }
/** /**

View file

@ -810,15 +810,15 @@ class EntryControllerTest extends WallabagCoreTestCase
->getRepository('WallabagCoreBundle:Entry') ->getRepository('WallabagCoreBundle:Entry')
->findOneByUser($this->getLoggedInUserId()); ->findOneByUser($this->getLoggedInUserId());
// no uuid // no uid
$client->request('GET', '/share/'.$content->getUuid()); $client->request('GET', '/share/'.$content->getUid());
$this->assertEquals(404, $client->getResponse()->getStatusCode()); $this->assertEquals(404, $client->getResponse()->getStatusCode());
// generating the uuid // generating the uid
$client->request('GET', '/share/'.$content->getId()); $client->request('GET', '/share/'.$content->getId());
$this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals(302, $client->getResponse()->getStatusCode());
// follow link with uuid // follow link with uid
$crawler = $client->followRedirect(); $crawler = $client->followRedirect();
$this->assertEquals(200, $client->getResponse()->getStatusCode()); $this->assertEquals(200, $client->getResponse()->getStatusCode());
$this->assertContains('max-age=25200', $client->getResponse()->headers->get('cache-control')); $this->assertContains('max-age=25200', $client->getResponse()->headers->get('cache-control'));
@ -832,7 +832,7 @@ class EntryControllerTest extends WallabagCoreTestCase
// sharing is now disabled // sharing is now disabled
$client->getContainer()->get('craue_config')->set('share_public', 0); $client->getContainer()->get('craue_config')->set('share_public', 0);
$client->request('GET', '/share/'.$content->getUuid()); $client->request('GET', '/share/'.$content->getUid());
$this->assertEquals(404, $client->getResponse()->getStatusCode()); $this->assertEquals(404, $client->getResponse()->getStatusCode());
$client->request('GET', '/view/'.$content->getId()); $client->request('GET', '/view/'.$content->getId());
@ -843,7 +843,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals(302, $client->getResponse()->getStatusCode());
// share is now disable // share is now disable
$client->request('GET', '/share/'.$content->getUuid()); $client->request('GET', '/share/'.$content->getUid());
$this->assertEquals(404, $client->getResponse()->getStatusCode()); $this->assertEquals(404, $client->getResponse()->getStatusCode());
} }