xref: /plugin/struct/meta/CSVPageImporter.php (revision 1fc2361fe236472e7585162e283a99db231aaf7e)
1*1fc2361fSSzymon Olewniczak<?php
2*1fc2361fSSzymon Olewniczak
3*1fc2361fSSzymon Olewniczaknamespace dokuwiki\plugin\struct\meta;
4*1fc2361fSSzymon Olewniczakuse dokuwiki\plugin\struct\types\Page;
5*1fc2361fSSzymon Olewniczak
6*1fc2361fSSzymon Olewniczakclass CSVPageImporter extends CSVImporter {
7*1fc2361fSSzymon Olewniczak    /**
8*1fc2361fSSzymon Olewniczak     * Chceck if schema is page schema
9*1fc2361fSSzymon Olewniczak     *
10*1fc2361fSSzymon Olewniczak     * @throws StructException
11*1fc2361fSSzymon Olewniczak     * @param string $table
12*1fc2361fSSzymon Olewniczak     * @param string $file
13*1fc2361fSSzymon Olewniczak     */
14*1fc2361fSSzymon Olewniczak    public function __construct($table, $file) {
15*1fc2361fSSzymon Olewniczak        parent::__construct($table, $file);
16*1fc2361fSSzymon Olewniczak
17*1fc2361fSSzymon Olewniczak        if($this->schema->isLookup()) throw new StructException($table.' is not a page schema');
18*1fc2361fSSzymon Olewniczak    }
19*1fc2361fSSzymon Olewniczak
20*1fc2361fSSzymon Olewniczak    /**
21*1fc2361fSSzymon Olewniczak     * Import page schema only when the pid header is present.
22*1fc2361fSSzymon Olewniczak     */
23*1fc2361fSSzymon Olewniczak    protected function readHeaders() {
24*1fc2361fSSzymon Olewniczak
25*1fc2361fSSzymon Olewniczak        //add pid to struct
26*1fc2361fSSzymon Olewniczak        $pageType = new Page(null, 'pid');
27*1fc2361fSSzymon Olewniczak        $this->columns[] = new Column(0, $pageType);
28*1fc2361fSSzymon Olewniczak
29*1fc2361fSSzymon Olewniczak        parent::readHeaders();
30*1fc2361fSSzymon Olewniczak
31*1fc2361fSSzymon Olewniczak        if(!in_array('pid', $this->header)) throw new StructException('There is no "pid" header in the CSV. Schema not imported.');
32*1fc2361fSSzymon Olewniczak    }
33*1fc2361fSSzymon Olewniczak
34*1fc2361fSSzymon Olewniczak    /**
35*1fc2361fSSzymon Olewniczak     * Creates the insert string for the single value table
36*1fc2361fSSzymon Olewniczak     *
37*1fc2361fSSzymon Olewniczak     * @return string
38*1fc2361fSSzymon Olewniczak     */
39*1fc2361fSSzymon Olewniczak    protected function getSQLforAllValues() {
40*1fc2361fSSzymon Olewniczak        $colnames = array();
41*1fc2361fSSzymon Olewniczak        foreach($this->columns as $i => $col) {
42*1fc2361fSSzymon Olewniczak            $colnames[] = 'col' . $col->getColref();
43*1fc2361fSSzymon Olewniczak        }
44*1fc2361fSSzymon Olewniczak        //replace first column with pid
45*1fc2361fSSzymon Olewniczak        $colnames[0] = 'pid';
46*1fc2361fSSzymon Olewniczak        //insert rev at the end
47*1fc2361fSSzymon Olewniczak        $colnames[] = 'rev';
48*1fc2361fSSzymon Olewniczak
49*1fc2361fSSzymon Olewniczak        $placeholds = join(', ', array_fill(0, count($colnames), '?'));
50*1fc2361fSSzymon Olewniczak        $colnames = join(', ', $colnames);
51*1fc2361fSSzymon Olewniczak        $table = $this->schema->getTable();
52*1fc2361fSSzymon Olewniczak
53*1fc2361fSSzymon Olewniczak        //replace previous data
54*1fc2361fSSzymon Olewniczak        return "REPLACE INTO data_$table ($colnames, latest) VALUES ($placeholds, 1)";
55*1fc2361fSSzymon Olewniczak    }
56*1fc2361fSSzymon Olewniczak
57*1fc2361fSSzymon Olewniczak    /**
58*1fc2361fSSzymon Olewniczak     * Add the revision.
59*1fc2361fSSzymon Olewniczak     *
60*1fc2361fSSzymon Olewniczak     * @param string[] $values
61*1fc2361fSSzymon Olewniczak     * @param          $line
62*1fc2361fSSzymon Olewniczak     * @param string   $single
63*1fc2361fSSzymon Olewniczak     * @param string   $multi
64*1fc2361fSSzymon Olewniczak     */
65*1fc2361fSSzymon Olewniczak    protected function saveLine($values, $line, $single, $multi) {
66*1fc2361fSSzymon Olewniczak        //read the lastest revision of inserted page
67*1fc2361fSSzymon Olewniczak        $values[] = @filemtime(wikiFN($values[0]));
68*1fc2361fSSzymon Olewniczak        parent::saveLine($values, $line, $single, $multi);
69*1fc2361fSSzymon Olewniczak    }
70*1fc2361fSSzymon Olewniczak
71*1fc2361fSSzymon Olewniczak    /**
72*1fc2361fSSzymon Olewniczak     * In the paga schemas primary key is a touple of (pid, rev)
73*1fc2361fSSzymon Olewniczak     *
74*1fc2361fSSzymon Olewniczak     * @param string[] $values
75*1fc2361fSSzymon Olewniczak     * @param string   $single
76*1fc2361fSSzymon Olewniczak     * @return array(pid, rev)
77*1fc2361fSSzymon Olewniczak     */
78*1fc2361fSSzymon Olewniczak    protected function insertIntoSingle($values, $single) {
79*1fc2361fSSzymon Olewniczak        parent::insertIntoSingle($values, $single);
80*1fc2361fSSzymon Olewniczak        $pid = $values[0];
81*1fc2361fSSzymon Olewniczak        $rev = $values[count($values) - 1];
82*1fc2361fSSzymon Olewniczak        //primary key is touple of (pid, rev)
83*1fc2361fSSzymon Olewniczak        return array($pid, $rev);
84*1fc2361fSSzymon Olewniczak    }
85*1fc2361fSSzymon Olewniczak
86*1fc2361fSSzymon Olewniczak    /**
87*1fc2361fSSzymon Olewniczak     * Add pid and rev to insert query parameters
88*1fc2361fSSzymon Olewniczak     *
89*1fc2361fSSzymon Olewniczak     * @param string $multi
90*1fc2361fSSzymon Olewniczak     * @param string $pk
91*1fc2361fSSzymon Olewniczak     * @param string $column
92*1fc2361fSSzymon Olewniczak     * @param string $row
93*1fc2361fSSzymon Olewniczak     * @param string $value
94*1fc2361fSSzymon Olewniczak     */
95*1fc2361fSSzymon Olewniczak    protected function insertIntoMulti($multi, $pk, $column, $row, $value) {
96*1fc2361fSSzymon Olewniczak        list($pid, $rev) = $pk;
97*1fc2361fSSzymon Olewniczak        $this->sqlite->query($multi, array($pid, $rev, $column->getColref(), $row + 1, $value));
98*1fc2361fSSzymon Olewniczak    }
99*1fc2361fSSzymon Olewniczak
100*1fc2361fSSzymon Olewniczak    /**
101*1fc2361fSSzymon Olewniczak     * In page schemas we use REPLACE instead of INSERT to prevent ambiguity
102*1fc2361fSSzymon Olewniczak     *
103*1fc2361fSSzymon Olewniczak     * @return string
104*1fc2361fSSzymon Olewniczak     */
105*1fc2361fSSzymon Olewniczak    protected function getSQLforMultiValue() {
106*1fc2361fSSzymon Olewniczak        $table = $this->schema->getTable();
107*1fc2361fSSzymon Olewniczak        /** @noinspection SqlResolve */
108*1fc2361fSSzymon Olewniczak        return "REPLACE INTO multi_$table (pid, rev, colref, row, value, latest) VALUES (?,?,?,?,?,1)";
109*1fc2361fSSzymon Olewniczak    }
110*1fc2361fSSzymon Olewniczak
111*1fc2361fSSzymon Olewniczak    /**
112*1fc2361fSSzymon Olewniczak     * Check if page id realy exists
113*1fc2361fSSzymon Olewniczak     *
114*1fc2361fSSzymon Olewniczak     * @param Column $col
115*1fc2361fSSzymon Olewniczak     * @param mixed  $rawvalue
116*1fc2361fSSzymon Olewniczak     * @return bool
117*1fc2361fSSzymon Olewniczak     */
118*1fc2361fSSzymon Olewniczak    protected function validateValue(Column $col, &$rawvalue) {
119*1fc2361fSSzymon Olewniczak        //check if page id exists
120*1fc2361fSSzymon Olewniczak        if($col->getLabel() == 'pid') {
121*1fc2361fSSzymon Olewniczak            $rawvalue = cleanID($rawvalue);
122*1fc2361fSSzymon Olewniczak            if(page_exists($rawvalue)) {
123*1fc2361fSSzymon Olewniczak                return true;
124*1fc2361fSSzymon Olewniczak            }
125*1fc2361fSSzymon Olewniczak            $this->errors[] = 'Page "'.$rawvalue.'" does not exists. Skipping the row.';
126*1fc2361fSSzymon Olewniczak            return false;
127*1fc2361fSSzymon Olewniczak        }
128*1fc2361fSSzymon Olewniczak
129*1fc2361fSSzymon Olewniczak        return parent::validateValue($col, $rawvalue);
130*1fc2361fSSzymon Olewniczak    }
131*1fc2361fSSzymon Olewniczak}
132