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