xref: /plugin/struct/helper/imexport.php (revision 5e29103a15bd9873f422f66a6a5239b6aec4651e)
17c5fd8d6SMichael Grosse<?php
2d6d97f60SAnna Dabrowska
37c5fd8d6SMichael Grosse/**
47c5fd8d6SMichael Grosse * DokuWiki Plugin struct (Helper Component)
57c5fd8d6SMichael Grosse *
67c5fd8d6SMichael Grosse * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
77c5fd8d6SMichael Grosse * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
87c5fd8d6SMichael Grosse */
97c5fd8d6SMichael Grosse
107234bfb1Ssplitbrainuse dokuwiki\Extension\Plugin;
117234bfb1Ssplitbrainuse dokuwiki\plugin\sqlite\SQLiteDB;
127234bfb1Ssplitbrainuse dokuwiki\plugin\struct\meta\StructException;
137234bfb1Ssplitbrainuse dokuwiki\plugin\struct\meta\SchemaImporter;
147cbcfbdbSAndreas Gohruse dokuwiki\plugin\struct\meta\Assignments;
15aeca15adSMichael Grosseuse dokuwiki\plugin\struct\meta\Schema;
16aeca15adSMichael Grosse
177234bfb1Ssplitbrainclass helper_plugin_struct_imexport extends Plugin
18d6d97f60SAnna Dabrowska{
197c5fd8d6SMichael Grosse    private $sqlite;
207c5fd8d6SMichael Grosse
21fa7b96aaSMichael Grosse    /**
22fa7b96aaSMichael Grosse     * this possibly duplicates @see helper_plugin_struct::getSchema()
23fa7b96aaSMichael Grosse     */
24d6d97f60SAnna Dabrowska    public function getAllSchemasList()
25d6d97f60SAnna Dabrowska    {
26aeca15adSMichael Grosse        return Schema::getAll();
277c5fd8d6SMichael Grosse    }
287c5fd8d6SMichael Grosse
297c5fd8d6SMichael Grosse    /**
30c4ce7499SMichael Grosse     * Delete all existing assignment patterns of a schema and replace them with the provided ones.
31c4ce7499SMichael Grosse     *
32c4ce7499SMichael Grosse     * @param string $schemaName
33aeca15adSMichael Grosse     * @param string[] $patterns
347c5fd8d6SMichael Grosse     */
35d6d97f60SAnna Dabrowska    public function replaceSchemaAssignmentPatterns($schemaName, $patterns)
36d6d97f60SAnna Dabrowska    {
377c5fd8d6SMichael Grosse        /** @var \helper_plugin_struct_db $helper */
38aeca15adSMichael Grosse        $helper = plugin_load('helper', 'struct_db');
397cbcfbdbSAndreas Gohr        $this->sqlite = $helper->getDB(false);
407234bfb1Ssplitbrain        if (!$this->sqlite instanceof SQLiteDB) return;
417cbcfbdbSAndreas Gohr
42c4ce7499SMichael Grosse        $schemaName = $this->sqlite->escape_string($schemaName);
437234bfb1Ssplitbrain        $sql = [];
44c4ce7499SMichael Grosse        $sql[] = "DELETE FROM schema_assignments_patterns WHERE tbl = '$schemaName'";
45c4ce7499SMichael Grosse        $sql[] = "DELETE FROM schema_assignments WHERE tbl = '$schemaName'";
467c5fd8d6SMichael Grosse        foreach ($patterns as $pattern) {
471bd268d2SMichael Grosse            $pattern = $this->sqlite->escape_string($pattern);
48c4ce7499SMichael Grosse            $sql[] = "INSERT INTO schema_assignments_patterns (pattern, tbl) VALUES ('$pattern','$schemaName')";
497c5fd8d6SMichael Grosse        }
507c5fd8d6SMichael Grosse
517c5fd8d6SMichael Grosse        $this->sqlite->doTransaction($sql);
527cbcfbdbSAndreas Gohr        $assignments = Assignments::getInstance();
53c4ce7499SMichael Grosse        $assignments->propagatePageAssignments($schemaName);
547c5fd8d6SMichael Grosse    }
557c5fd8d6SMichael Grosse
56c4ce7499SMichael Grosse    /**
57c4ce7499SMichael Grosse     * Returns array of patterns for the given Schema
58c4ce7499SMichael Grosse     *
59c4ce7499SMichael Grosse     * @param string $schemaName
60c4ce7499SMichael Grosse     * @return string[]
61c4ce7499SMichael Grosse     */
62d6d97f60SAnna Dabrowska    public function getSchemaAssignmentPatterns($schemaName)
63d6d97f60SAnna Dabrowska    {
647c5fd8d6SMichael Grosse        /** @var \helper_plugin_struct_db $helper */
65aeca15adSMichael Grosse        $helper = plugin_load('helper', 'struct_db');
667cbcfbdbSAndreas Gohr        $this->sqlite = $helper->getDB(false);
677234bfb1Ssplitbrain        if (!$this->sqlite instanceof SQLiteDB) return [];
687c5fd8d6SMichael Grosse
697c5fd8d6SMichael Grosse        $sql = 'SELECT pattern FROM schema_assignments_patterns WHERE tbl = ?';
7079b29326SAnna Dabrowska        $patterns = $this->sqlite->queryAll($sql, $schemaName);
71*5e29103aSannda        return array_map(static fn($elem) => $elem['pattern'], $patterns);
727c5fd8d6SMichael Grosse    }
737c5fd8d6SMichael Grosse
74c4ce7499SMichael Grosse    /**
7526d59c4aSMichael Grosse     * Get the json of the current version of the given schema or false if the schema doesn't exist.
76c4ce7499SMichael Grosse     *
77c4ce7499SMichael Grosse     * @param string $schemaName
7826d59c4aSMichael Grosse     * @return string|bool The json string or false if the schema doesn't exist
79c4ce7499SMichael Grosse     */
80d6d97f60SAnna Dabrowska    public function getCurrentSchemaJSON($schemaName)
81d6d97f60SAnna Dabrowska    {
8226d59c4aSMichael Grosse        $schema = new Schema($schemaName);
8326d59c4aSMichael Grosse        if ($schema->getId() == 0) {
8426d59c4aSMichael Grosse            return false;
8526d59c4aSMichael Grosse        }
8626d59c4aSMichael Grosse        return $schema->toJSON();
87fa7b96aaSMichael Grosse    }
88fa7b96aaSMichael Grosse
89c4ce7499SMichael Grosse    /**
90c4ce7499SMichael Grosse     * Import a schema. If a schema with the given name already exists, then it will be overwritten. Otherwise a new
91c4ce7499SMichael Grosse     * schema will be created.
92c4ce7499SMichael Grosse     *
93c4ce7499SMichael Grosse     * @param string $schemaName The name of the schema
94c4ce7499SMichael Grosse     * @param string $schemaJSON The structure of the schema as exportet by structs export functionality
95748e747fSAnna Dabrowska     * @param string $user optional, the user that should be set in the schemas history.
96748e747fSAnna Dabrowska     *                      If blank, the current user is used.
97c4ce7499SMichael Grosse     * @return bool|int the id of the new schema version or false on error.
9857920350SMichael Grosse     *
997234bfb1Ssplitbrain     * @throws StructException
100c4ce7499SMichael Grosse     */
101d6d97f60SAnna Dabrowska    public function importSchema($schemaName, $schemaJSON, $user = null)
102d6d97f60SAnna Dabrowska    {
1037234bfb1Ssplitbrain        $importer = new SchemaImporter($schemaName, $schemaJSON);
10478bff02fSMichael Grosse        if (!blank($user)) {
10578bff02fSMichael Grosse            $importer->setUser($user);
10678bff02fSMichael Grosse        }
10778bff02fSMichael Grosse        $ok = $importer->build();
108fa7b96aaSMichael Grosse        return $ok;
109fa7b96aaSMichael Grosse    }
1107c5fd8d6SMichael Grosse}
111