]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/CoreBundle/Command/ImportCommand.php
first draft for json import, needed for wallabag v1 migration
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Command / ImportCommand.php
CommitLineData
56ea1de9
NL
1<?php
2
3namespace Wallabag\CoreBundle\Command;
4
5use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
6use Symfony\Component\Console\Input\InputInterface;
7use Symfony\Component\Console\Output\OutputInterface;
8use Symfony\Component\Console\Helper\ProgressBar;
9use Wallabag\CoreBundle\Entity\Entry;
10use Wallabag\CoreBundle\Tools\Utils;
11
12class ImportCommand extends ContainerAwareCommand
13{
14 protected function configure()
15 {
16 $this
17 ->setName('import:json')
18 ->setDescription('Import entries from JSON file');
19 }
20
21 protected function execute(InputInterface $input, OutputInterface $output)
22 {
23 $now = new \DateTime();
24 $output->writeln('<comment>Start : '.$now->format('d-m-Y G:i:s').' ---</comment>');
25
26 // Importing CSV on DB via Doctrine ORM
27 $this->import($input, $output);
28
29 $now = new \DateTime();
30 $output->writeln('<comment>End : '.$now->format('d-m-Y G:i:s').' ---</comment>');
31 }
32
33 protected function import(InputInterface $input, OutputInterface $output)
34 {
35 // Getting php array of data from CSV
36 $data = $this->get($input, $output);
37
38 $em = $this->getContainer()->get('doctrine')->getManager();
39 // Turning off doctrine default logs queries for saving memory
40 $em->getConnection()->getConfiguration()->setSQLLogger(null);
41
42 // Define the size of record, the frequency for persisting the data and the current index of records
43 $size = count($data);
44 $batchSize = 20;
45 $i = 1;
46
47 $progress = new ProgressBar($output, $size);
48 $progress->start();
49
50 $user = $em->getRepository('WallabagCoreBundle:User')
51 ->findOneById(1);
52
53 foreach ($data as $object) {
54 $array = (array) $object;
55 $entry = $em->getRepository('WallabagCoreBundle:Entry')
56 ->findOneByUrl($array['url']);
57
58 if (!is_object($entry)) {
59 $entry = new Entry($user);
60 $entry->setUrl($array['url']);
61 }
62
63 $entry->setTitle($array['title']);
64 $entry->setArchived($array['is_read']);
65 $entry->setStarred($array['is_fav']);
66 $entry->setContent($array['content']);
67 $entry->setReadingTime(Utils::getReadingTime($array['content']));
68
69 $em->persist($entry);
70
71 if (($i % $batchSize) === 0) {
72 $em->flush();
73 $progress->advance($batchSize);
74
75 $now = new \DateTime();
76 $output->writeln(' of entries imported ... | '.$now->format('d-m-Y G:i:s'));
77 }
78 ++$i;
79 }
80
81 $em->flush();
82 $em->clear();
83 $progress->finish();
84 }
85
86 protected function convert($filename)
87 {
88 if (!file_exists($filename) || !is_readable($filename)) {
89 return false;
90 }
91
92 $header = null;
93 $data = array();
94
95 if (($handle = fopen($filename, 'r')) !== false) {
96 while (($row = fgets($handle)) !== false) {
97 $data = json_decode($row);
98 }
99 fclose($handle);
100 }
101
102 return $data;
103 }
104
105 protected function get(InputInterface $input, OutputInterface $output)
106 {
107 $fileName = 'web/uploads/import/import.json';
108 $data = $this->convert($fileName);
109
110 return $data;
111 }
112}