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