xref: /plugin/struct/meta/CSVPageImporter.php (revision e53295c50fccd6c704766be3b2ac38c83bde3cba)
11fc2361fSSzymon Olewniczak<?php
21fc2361fSSzymon Olewniczak
31fc2361fSSzymon Olewniczaknamespace dokuwiki\plugin\struct\meta;
41fc2361fSSzymon Olewniczakuse dokuwiki\plugin\struct\types\Page;
51fc2361fSSzymon Olewniczak
61fc2361fSSzymon Olewniczakclass CSVPageImporter extends CSVImporter {
7*e53295c5SSzymon Olewniczak
8*e53295c5SSzymon Olewniczak    protected $importedPids = array();
9*e53295c5SSzymon Olewniczak
101fc2361fSSzymon Olewniczak    /**
111fc2361fSSzymon Olewniczak     * Chceck if schema is page schema
121fc2361fSSzymon Olewniczak     *
131fc2361fSSzymon Olewniczak     * @throws StructException
141fc2361fSSzymon Olewniczak     * @param string $table
151fc2361fSSzymon Olewniczak     * @param string $file
161fc2361fSSzymon Olewniczak     */
171fc2361fSSzymon Olewniczak    public function __construct($table, $file) {
181fc2361fSSzymon Olewniczak        parent::__construct($table, $file);
191fc2361fSSzymon Olewniczak
201fc2361fSSzymon Olewniczak        if($this->schema->isLookup()) throw new StructException($table.' is not a page schema');
211fc2361fSSzymon Olewniczak    }
221fc2361fSSzymon Olewniczak
231fc2361fSSzymon Olewniczak    /**
241fc2361fSSzymon Olewniczak     * Import page schema only when the pid header is present.
251fc2361fSSzymon Olewniczak     */
261fc2361fSSzymon Olewniczak    protected function readHeaders() {
271fc2361fSSzymon Olewniczak
281fc2361fSSzymon Olewniczak        //add pid to struct
291fc2361fSSzymon Olewniczak        $pageType = new Page(null, 'pid');
301fc2361fSSzymon Olewniczak        $this->columns[] = new Column(0, $pageType);
311fc2361fSSzymon Olewniczak
321fc2361fSSzymon Olewniczak        parent::readHeaders();
331fc2361fSSzymon Olewniczak
341fc2361fSSzymon Olewniczak        if(!in_array('pid', $this->header)) throw new StructException('There is no "pid" header in the CSV. Schema not imported.');
351fc2361fSSzymon Olewniczak    }
361fc2361fSSzymon Olewniczak
371fc2361fSSzymon Olewniczak    /**
381fc2361fSSzymon Olewniczak     * Creates the insert string for the single value table
391fc2361fSSzymon Olewniczak     *
401fc2361fSSzymon Olewniczak     * @return string
411fc2361fSSzymon Olewniczak     */
421fc2361fSSzymon Olewniczak    protected function getSQLforAllValues() {
431fc2361fSSzymon Olewniczak        $colnames = array();
441fc2361fSSzymon Olewniczak        foreach($this->columns as $i => $col) {
451fc2361fSSzymon Olewniczak            $colnames[] = 'col' . $col->getColref();
461fc2361fSSzymon Olewniczak        }
471fc2361fSSzymon Olewniczak        //replace first column with pid
481fc2361fSSzymon Olewniczak        $colnames[0] = 'pid';
491fc2361fSSzymon Olewniczak        //insert rev at the end
501fc2361fSSzymon Olewniczak        $colnames[] = 'rev';
511fc2361fSSzymon Olewniczak
521fc2361fSSzymon Olewniczak        $placeholds = join(', ', array_fill(0, count($colnames), '?'));
531fc2361fSSzymon Olewniczak        $colnames = join(', ', $colnames);
541fc2361fSSzymon Olewniczak        $table = $this->schema->getTable();
551fc2361fSSzymon Olewniczak
56*e53295c5SSzymon Olewniczak        return "INSERT INTO data_$table ($colnames, latest) VALUES ($placeholds, 1)";
571fc2361fSSzymon Olewniczak    }
581fc2361fSSzymon Olewniczak
591fc2361fSSzymon Olewniczak    /**
601fc2361fSSzymon Olewniczak     * Add the revision.
611fc2361fSSzymon Olewniczak     *
621fc2361fSSzymon Olewniczak     * @param string[] $values
631fc2361fSSzymon Olewniczak     * @param          $line
641fc2361fSSzymon Olewniczak     * @param string   $single
651fc2361fSSzymon Olewniczak     * @param string   $multi
661fc2361fSSzymon Olewniczak     */
671fc2361fSSzymon Olewniczak    protected function saveLine($values, $line, $single, $multi) {
68*e53295c5SSzymon Olewniczak        //create new page revision
69*e53295c5SSzymon Olewniczak        $pid = $values[0];
70*e53295c5SSzymon Olewniczak        $helper = plugin_load('helper', 'struct');
71*e53295c5SSzymon Olewniczak        $revision = $helper->createPageRevision($pid, 'CSV data imported');
72*e53295c5SSzymon Olewniczak        p_get_metadata($pid); // reparse the metadata of the page top update the titles/rev/lasteditor table
73*e53295c5SSzymon Olewniczak
74*e53295c5SSzymon Olewniczak        // make sure this schema is assigned
75*e53295c5SSzymon Olewniczak        /** @noinspection PhpUndefinedVariableInspection */
76*e53295c5SSzymon Olewniczak        Assignments::getInstance()->assignPageSchema(
77*e53295c5SSzymon Olewniczak            $pid,
78*e53295c5SSzymon Olewniczak            $this->schema->getTable()
79*e53295c5SSzymon Olewniczak        );
80*e53295c5SSzymon Olewniczak
81*e53295c5SSzymon Olewniczak        //add page revision to values
82*e53295c5SSzymon Olewniczak        $values[] = $revision;
83*e53295c5SSzymon Olewniczak
841fc2361fSSzymon Olewniczak        parent::saveLine($values, $line, $single, $multi);
851fc2361fSSzymon Olewniczak    }
861fc2361fSSzymon Olewniczak
871fc2361fSSzymon Olewniczak    /**
881fc2361fSSzymon Olewniczak     * In the paga schemas primary key is a touple of (pid, rev)
891fc2361fSSzymon Olewniczak     *
901fc2361fSSzymon Olewniczak     * @param string[] $values
911fc2361fSSzymon Olewniczak     * @param string   $single
921fc2361fSSzymon Olewniczak     * @return array(pid, rev)
931fc2361fSSzymon Olewniczak     */
941fc2361fSSzymon Olewniczak    protected function insertIntoSingle($values, $single) {
951fc2361fSSzymon Olewniczak        $pid = $values[0];
961fc2361fSSzymon Olewniczak        $rev = $values[count($values) - 1];
97*e53295c5SSzymon Olewniczak
98*e53295c5SSzymon Olewniczak        //update latest
99*e53295c5SSzymon Olewniczak        $table = $this->schema->getTable();
100*e53295c5SSzymon Olewniczak        $this->sqlite->query("UPDATE data_$table SET latest = 0 WHERE latest = 1 AND pid = ?", array($pid));
101*e53295c5SSzymon Olewniczak
102*e53295c5SSzymon Olewniczak        //insert into table
103*e53295c5SSzymon Olewniczak        parent::insertIntoSingle($values, $single);
104*e53295c5SSzymon Olewniczak
1051fc2361fSSzymon Olewniczak        //primary key is touple of (pid, rev)
1061fc2361fSSzymon Olewniczak        return array($pid, $rev);
1071fc2361fSSzymon Olewniczak    }
1081fc2361fSSzymon Olewniczak
1091fc2361fSSzymon Olewniczak    /**
1101fc2361fSSzymon Olewniczak     * Add pid and rev to insert query parameters
1111fc2361fSSzymon Olewniczak     *
1121fc2361fSSzymon Olewniczak     * @param string $multi
1131fc2361fSSzymon Olewniczak     * @param string $pk
1141fc2361fSSzymon Olewniczak     * @param string $column
1151fc2361fSSzymon Olewniczak     * @param string $row
1161fc2361fSSzymon Olewniczak     * @param string $value
1171fc2361fSSzymon Olewniczak     */
1181fc2361fSSzymon Olewniczak    protected function insertIntoMulti($multi, $pk, $column, $row, $value) {
1191fc2361fSSzymon Olewniczak        list($pid, $rev) = $pk;
120*e53295c5SSzymon Olewniczak
121*e53295c5SSzymon Olewniczak        //update latest
122*e53295c5SSzymon Olewniczak        $table = $this->schema->getTable();
123*e53295c5SSzymon Olewniczak        $this->sqlite->query("UPDATE multi_$table SET latest = 0 WHERE latest = 1 AND pid = ?", array($pid));
124*e53295c5SSzymon Olewniczak
1251fc2361fSSzymon Olewniczak        $this->sqlite->query($multi, array($pid, $rev, $column->getColref(), $row + 1, $value));
1261fc2361fSSzymon Olewniczak    }
1271fc2361fSSzymon Olewniczak
1281fc2361fSSzymon Olewniczak    /**
1291fc2361fSSzymon Olewniczak     * In page schemas we use REPLACE instead of INSERT to prevent ambiguity
1301fc2361fSSzymon Olewniczak     *
1311fc2361fSSzymon Olewniczak     * @return string
1321fc2361fSSzymon Olewniczak     */
1331fc2361fSSzymon Olewniczak    protected function getSQLforMultiValue() {
1341fc2361fSSzymon Olewniczak        $table = $this->schema->getTable();
1351fc2361fSSzymon Olewniczak        /** @noinspection SqlResolve */
136*e53295c5SSzymon Olewniczak        return "INSERT INTO multi_$table (pid, rev, colref, row, value, latest) VALUES (?,?,?,?,?,1)";
1371fc2361fSSzymon Olewniczak    }
1381fc2361fSSzymon Olewniczak
1391fc2361fSSzymon Olewniczak    /**
1401fc2361fSSzymon Olewniczak     * Check if page id realy exists
1411fc2361fSSzymon Olewniczak     *
1421fc2361fSSzymon Olewniczak     * @param Column $col
1431fc2361fSSzymon Olewniczak     * @param mixed  $rawvalue
1441fc2361fSSzymon Olewniczak     * @return bool
1451fc2361fSSzymon Olewniczak     */
1461fc2361fSSzymon Olewniczak    protected function validateValue(Column $col, &$rawvalue) {
147*e53295c5SSzymon Olewniczak        //check if page id exists and schema is bounded to the page
1481fc2361fSSzymon Olewniczak        if($col->getLabel() == 'pid') {
149*e53295c5SSzymon Olewniczak            $pid = cleanID($rawvalue);
150*e53295c5SSzymon Olewniczak            if (isset($this->importedPids[$pid])) {
151*e53295c5SSzymon Olewniczak                $this->errors[] = 'Page "'.$pid.'" already imported. Skipping the row.';
152*e53295c5SSzymon Olewniczak                return false;
153*e53295c5SSzymon Olewniczak            }
154*e53295c5SSzymon Olewniczak            if(page_exists($pid)) {
155*e53295c5SSzymon Olewniczak                //check if schema is assigned to page
156*e53295c5SSzymon Olewniczak                $tables = Assignments::getInstance()->getPageAssignments($pid, true);
157*e53295c5SSzymon Olewniczak                if (!in_array($this->schema->getTable(), $tables)) {
158*e53295c5SSzymon Olewniczak                    $this->errors[] = 'Schema not assigned to page "'.$pid.'"';
159*e53295c5SSzymon Olewniczak                    return false;
160*e53295c5SSzymon Olewniczak                }
161*e53295c5SSzymon Olewniczak                $this->importedPids[$pid] = true;
1621fc2361fSSzymon Olewniczak                return true;
1631fc2361fSSzymon Olewniczak            }
164*e53295c5SSzymon Olewniczak            $this->errors[] = 'Page "'.$pid.'" does not exists. Skipping the row.';
1651fc2361fSSzymon Olewniczak            return false;
1661fc2361fSSzymon Olewniczak        }
1671fc2361fSSzymon Olewniczak
1681fc2361fSSzymon Olewniczak        return parent::validateValue($col, $rawvalue);
1691fc2361fSSzymon Olewniczak    }
1701fc2361fSSzymon Olewniczak}
171