xref: /plugin/structpublish/meta/AccessTableStructpublish.php (revision 94eb396000baab7843bad88b47a92c9e19ed0a8a)
13231ebaeSAnna Dabrowska<?php
23231ebaeSAnna Dabrowska
33231ebaeSAnna Dabrowskanamespace dokuwiki\plugin\structpublish\meta;
43231ebaeSAnna Dabrowska
56a791fefSAnna Dabrowskause dokuwiki\plugin\struct\meta\AccessTable;
63231ebaeSAnna Dabrowskause dokuwiki\plugin\struct\meta\AccessTableSerial;
73231ebaeSAnna Dabrowska
83231ebaeSAnna Dabrowska/**
93231ebaeSAnna Dabrowska * Class AccessTableStructpublish
103231ebaeSAnna Dabrowska *
116a791fefSAnna Dabrowska * Load and save publish data
123231ebaeSAnna Dabrowska *
133231ebaeSAnna Dabrowska * @package dokuwiki\plugin\struct\meta
143231ebaeSAnna Dabrowska */
153231ebaeSAnna Dabrowskaclass AccessTableStructpublish extends AccessTableSerial
163231ebaeSAnna Dabrowska{
176a791fefSAnna Dabrowska    protected $published = 0;
186a791fefSAnna Dabrowska
193231ebaeSAnna Dabrowska    /**
208b0ba635SAndreas Gohr     * @param 0|1|bool $published
216a791fefSAnna Dabrowska     * @return void
226a791fefSAnna Dabrowska     */
236a791fefSAnna Dabrowska    public function setPublished($published)
246a791fefSAnna Dabrowska    {
258b0ba635SAndreas Gohr        $this->published = (int) $published;
266a791fefSAnna Dabrowska    }
276a791fefSAnna Dabrowska
288b0ba635SAndreas Gohr    /** @inheritDoc */
293231ebaeSAnna Dabrowska    protected function getSingleSql()
303231ebaeSAnna Dabrowska    {
313231ebaeSAnna Dabrowska        $cols = array_merge($this->getSingleNoninputCols(), $this->singleCols);
323231ebaeSAnna Dabrowska        $cols = join(',', $cols);
333231ebaeSAnna Dabrowska        $vals = array_merge($this->getSingleNoninputValues(), $this->singleValues);
343231ebaeSAnna Dabrowska        $rid = $this->getRid() ?: "(SELECT (COALESCE(MAX(rid), 0 ) + 1) FROM $this->stable)";
353231ebaeSAnna Dabrowska
363231ebaeSAnna Dabrowska        return "REPLACE INTO $this->stable (rid, $cols)
373231ebaeSAnna Dabrowska                      VALUES ($rid," . trim(str_repeat('?,', count($vals)), ',') . ');';
383231ebaeSAnna Dabrowska    }
393231ebaeSAnna Dabrowska
408b0ba635SAndreas Gohr    /** @inheritDoc */
413231ebaeSAnna Dabrowska    protected function getMultiSql()
423231ebaeSAnna Dabrowska    {
433231ebaeSAnna Dabrowska        return '';
443231ebaeSAnna Dabrowska    }
453231ebaeSAnna Dabrowska
468b0ba635SAndreas Gohr    /** @inheritDoc */
476a791fefSAnna Dabrowska    protected function getSingleNoninputCols()
486a791fefSAnna Dabrowska    {
496a791fefSAnna Dabrowska        return ['pid', 'rev', 'latest', 'published'];
506a791fefSAnna Dabrowska    }
516a791fefSAnna Dabrowska
528b0ba635SAndreas Gohr    /** @inheritDoc */
536a791fefSAnna Dabrowska    protected function getSingleNoninputValues()
546a791fefSAnna Dabrowska    {
556a791fefSAnna Dabrowska        return [$this->pid, AccessTable::DEFAULT_REV, AccessTable::DEFAULT_LATEST, $this->published];
566a791fefSAnna Dabrowska    }
576a791fefSAnna Dabrowska
586a791fefSAnna Dabrowska    /**
598b0ba635SAndreas Gohr     * @inheritdoc
603231ebaeSAnna Dabrowska     * @return int|bool
613231ebaeSAnna Dabrowska     */
623231ebaeSAnna Dabrowska    protected function getLastRevisionTimestamp()
633231ebaeSAnna Dabrowska    {
643231ebaeSAnna Dabrowska        $table = 'data_structpublish';
653231ebaeSAnna Dabrowska        $where = "WHERE pid = ?";
663231ebaeSAnna Dabrowska        $opts = [$this->pid];
673231ebaeSAnna Dabrowska        if ($this->ts) {
683231ebaeSAnna Dabrowska            $where .= " AND REV > 0 AND rev <= ?";
693231ebaeSAnna Dabrowska            $opts[] = $this->ts;
703231ebaeSAnna Dabrowska        }
713231ebaeSAnna Dabrowska
723231ebaeSAnna Dabrowska        /** @noinspection SqlResolve */
733231ebaeSAnna Dabrowska        $sql = "SELECT rev FROM $table $where ORDER BY rev DESC LIMIT 1";
74f734c62fSAnna Dabrowska        $ret = $this->sqlite->queryValue($sql, $opts);
75f734c62fSAnna Dabrowska
763231ebaeSAnna Dabrowska        // make sure we don't cast empty result to 0 (serial data has rev = 0)
778b0ba635SAndreas Gohr        if ($ret !== false) {
788b0ba635SAndreas Gohr            $ret = (int) $ret;
798b0ba635SAndreas Gohr        }
803231ebaeSAnna Dabrowska        return $ret;
813231ebaeSAnna Dabrowska    }
82*94eb3960SAnna Dabrowska
83*94eb3960SAnna Dabrowska    /**
84*94eb3960SAnna Dabrowska     * Remove latest status from previous publish data
85*94eb3960SAnna Dabrowska     * for the current page id and status
86*94eb3960SAnna Dabrowska     */
87*94eb3960SAnna Dabrowska    protected function beforeSave()
88*94eb3960SAnna Dabrowska    {
89*94eb3960SAnna Dabrowska        $statusCol = $this->schema->findColumn('status');
90*94eb3960SAnna Dabrowska        $statusColRef = $statusCol->getColref();
91*94eb3960SAnna Dabrowska        $statusColName = $statusCol->getColName();
92*94eb3960SAnna Dabrowska
93*94eb3960SAnna Dabrowska        /** @noinspection SqlResolve */
94*94eb3960SAnna Dabrowska        return $this->sqlite->query(
95*94eb3960SAnna Dabrowska            "UPDATE $this->stable SET latest = 0 WHERE latest = 1 AND pid = ? AND $statusColName = ?",
96*94eb3960SAnna Dabrowska            [$this->pid, $this->singleValues[$statusColRef - 1]]
97*94eb3960SAnna Dabrowska        );
98*94eb3960SAnna Dabrowska    }
993231ebaeSAnna Dabrowska}
100