]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Use a better index for hashed_url
authorJeremy Benoist <jeremy.benoist@gmail.com>
Mon, 1 Apr 2019 11:51:57 +0000 (13:51 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Mon, 1 Apr 2019 11:51:57 +0000 (13:51 +0200)
It'll most often be used in addition to the `user_id`.
Also, automatically generate the hash when saving the url.
Switch from `md5` to `sha1`.

app/DoctrineMigrations/Version20190401105353.php
src/Wallabag/CoreBundle/Command/GenerateUrlHashesCommand.php
src/Wallabag/CoreBundle/DataFixtures/EntryFixtures.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Helper/ContentProxy.php
tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
tests/Wallabag/CoreBundle/Command/GenerateUrlHashesCommandTest.php

index 4afc8b15d831328971346f82b6324207e20e43ee..c1c220537e21be19530301e84adbb52b7af79a2e 100644 (file)
@@ -20,7 +20,7 @@ class Version20190401105353 extends WallabagMigration
         $this->skipIf($entryTable->hasColumn('hashed_url'), 'It seems that you already played this migration.');
 
         $entryTable->addColumn('hashed_url', 'text', [
-            'length' => 32,
+            'length' => 40,
             'notnull' => false,
         ]);
 
@@ -28,6 +28,8 @@ class Version20190401105353 extends WallabagMigration
         if ('sqlite' !== $this->connection->getDatabasePlatform()->getName()) {
             $this->addSql('UPDATE ' . $this->getTable('entry') . ' SET hashed_url = MD5(url)');
         }
+
+        $entryTable->addIndex(['user_id', 'hashed_url'], 'hashed_url_user_id');
     }
 
     /**
@@ -39,6 +41,7 @@ class Version20190401105353 extends WallabagMigration
 
         $this->skipIf(!$entryTable->hasColumn('hashed_url'), 'It seems that you already played this migration.');
 
+        $entryTable->dropIndex('hashed_url_user_id');
         $entryTable->dropColumn('hashed_url');
     }
 }
index fb5983902ee3b13b462ad115dfff1d082b275fa0..685e1672f17eb9712dc4966772c0e21b913bfb58 100644 (file)
@@ -69,7 +69,7 @@ class GenerateUrlHashesCommand extends ContainerAwareCommand
 
         $i = 1;
         foreach ($entries as $entry) {
-            $entry->setHashedUrl(hash('md5', $entry->getUrl()));
+            $entry->setHashedUrl(hash('sha1', $entry->getUrl()));
             $em->persist($entry);
 
             if (0 === ($i % 20)) {
index 1b18cad6638f70be33e7bbeab6f3857bc8b14022..024fcfdc8d75edcf5a26837b576b2cd54c291335 100644 (file)
@@ -89,7 +89,6 @@ class EntryFixtures extends Fixture implements DependentFixtureInterface
         foreach ($entries as $reference => $item) {
             $entry = new Entry($this->getReference($item['user']));
             $entry->setUrl($item['url']);
-            $entry->setHashedUrl(hash('md5', $item['url']));
             $entry->setReadingTime($item['reading_time']);
             $entry->setDomainName($item['domain']);
             $entry->setMimetype($item['mime']);
index a04f101f4165c7cf8d9d449795ee0ed1ad0ee018..faf4d259801e32a20f9b222f0a509fb6db4d194a 100644 (file)
@@ -26,7 +26,7 @@ use Wallabag\UserBundle\Entity\User;
  *     indexes={
  *         @ORM\Index(name="created_at", columns={"created_at"}),
  *         @ORM\Index(name="uid", columns={"uid"}),
- *         @ORM\Index(name="hashed_url", columns={"hashed_url"})
+ *         @ORM\Index(name="hashed_url_user_id", columns={"user_id", "hashed_url"})
  *     }
  * )
  * @ORM\HasLifecycleCallbacks()
@@ -79,7 +79,7 @@ class Entry
     /**
      * @var string
      *
-     * @ORM\Column(name="hashed_url", type="string", length=32, nullable=true)
+     * @ORM\Column(name="hashed_url", type="string", length=40, nullable=true)
      */
     private $hashedUrl;
 
@@ -324,6 +324,7 @@ class Entry
     public function setUrl($url)
     {
         $this->url = $url;
+        $this->hashedUrl = hash('sha1', $url);
 
         return $this;
     }
index 0534d27b22ca58fe48c88a3d34a8835bac864bfe..31953f12d3ef947babfdd1d860c63939d3643abc 100644 (file)
@@ -248,8 +248,6 @@ class ContentProxy
     {
         $this->updateOriginUrl($entry, $content['url']);
 
-        $entry->setHashedUrl(hash('md5', $entry->getUrl()));
-
         $this->setEntryDomainName($entry);
 
         if (!empty($content['title'])) {
index fc4dc9d9218cdd8886526e2dcd41aa9103b274b6..34de8ec8caa954e317f15fe2550ed6512cd507db 100644 (file)
@@ -973,7 +973,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
 
     public function dataForEntriesExistWithUrl()
     {
-        $url = hash('md5', 'http://0.0.0.0/entry2');
+        $url = hash('sha1', 'http://0.0.0.0/entry2');
 
         return [
             'with_id' => [
@@ -1047,37 +1047,37 @@ class EntryRestControllerTest extends WallabagApiTestCase
     {
         $url1 = 'http://0.0.0.0/entry2';
         $url2 = 'http://0.0.0.0/entry10';
-        $this->client->request('GET', '/api/entries/exists?hashed_urls[]=' . hash('md5', $url1) . '&hashed_urls[]=' . hash('md5', $url2) . '&return_id=1');
+        $this->client->request('GET', '/api/entries/exists?hashed_urls[]=' . hash('sha1', $url1) . '&hashed_urls[]=' . hash('sha1', $url2) . '&return_id=1');
 
         $this->assertSame(200, $this->client->getResponse()->getStatusCode());
 
         $content = json_decode($this->client->getResponse()->getContent(), true);
 
-        $this->assertArrayHasKey(hash('md5', $url1), $content);
-        $this->assertArrayHasKey(hash('md5', $url2), $content);
-        $this->assertSame(2, $content[hash('md5', $url1)]);
-        $this->assertNull($content[hash('md5', $url2)]);
+        $this->assertArrayHasKey(hash('sha1', $url1), $content);
+        $this->assertArrayHasKey(hash('sha1', $url2), $content);
+        $this->assertSame(2, $content[hash('sha1', $url1)]);
+        $this->assertNull($content[hash('sha1', $url2)]);
     }
 
     public function testGetEntriesExistsWithManyUrlsHashedReturnBool()
     {
         $url1 = 'http://0.0.0.0/entry2';
         $url2 = 'http://0.0.0.0/entry10';
-        $this->client->request('GET', '/api/entries/exists?hashed_urls[]=' . hash('md5', $url1) . '&hashed_urls[]=' . hash('md5', $url2));
+        $this->client->request('GET', '/api/entries/exists?hashed_urls[]=' . hash('sha1', $url1) . '&hashed_urls[]=' . hash('sha1', $url2));
 
         $this->assertSame(200, $this->client->getResponse()->getStatusCode());
 
         $content = json_decode($this->client->getResponse()->getContent(), true);
 
-        $this->assertArrayHasKey(hash('md5', $url1), $content);
-        $this->assertArrayHasKey(hash('md5', $url2), $content);
-        $this->assertTrue($content[hash('md5', $url1)]);
-        $this->assertFalse($content[hash('md5', $url2)]);
+        $this->assertArrayHasKey(hash('sha1', $url1), $content);
+        $this->assertArrayHasKey(hash('sha1', $url2), $content);
+        $this->assertTrue($content[hash('sha1', $url1)]);
+        $this->assertFalse($content[hash('sha1', $url2)]);
     }
 
     public function testGetEntriesExistsWhichDoesNotExists()
     {
-        $this->client->request('GET', '/api/entries/exists?hashed_url=' . hash('md5', 'http://google.com/entry2'));
+        $this->client->request('GET', '/api/entries/exists?hashed_url=' . hash('sha1', 'http://google.com/entry2'));
 
         $this->assertSame(200, $this->client->getResponse()->getStatusCode());
 
index cc1e3fbc734138a1254594bfb532443a2be8fcb8..17eed210b275c2387766bfeb776e18cf29827600 100644 (file)
@@ -72,11 +72,8 @@ class GenerateUrlHashesCommandTest extends WallabagCoreTestCase
         $entry1->setUrl($url);
 
         $em->persist($entry1);
-
         $em->flush();
 
-        $this->assertNull($entry1->getHashedUrl());
-
         $application = new Application($this->getClient()->getKernel());
         $application->add(new GenerateUrlHashesCommand());
 
@@ -92,7 +89,7 @@ class GenerateUrlHashesCommandTest extends WallabagCoreTestCase
 
         $entry = $em->getRepository('WallabagCoreBundle:Entry')->findOneByUrl($url);
 
-        $this->assertSame($entry->getHashedUrl(), hash('md5', $url));
+        $this->assertSame($entry->getHashedUrl(), hash('sha1', $url));
 
         $query = $em->createQuery('DELETE FROM Wallabag\CoreBundle\Entity\Entry e WHERE e.url = :url');
         $query->setParameter('url', $url);