Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
PdoMysql
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
2 / 2
9
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 createTables
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
8
1<?php
2
3/**
4 * The phpMyFAQ instances a database class with CREATE TABLE statements for MySQL, MariaBD, Percona Server and Galera
5 * Cluster for MySQL.
6 *
7 * This Source Code Form is subject to the terms of the Mozilla Public License,
8 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
9 * obtain one at https://mozilla.org/MPL/2.0/
10 *
11 * @package   phpMyFAQ
12 * @author    Thorsten Rinne <thorsten@phpmyfaq.de>
13 * @copyright 2025 phpMyFAQ Team
14 * @license   https://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
15 * @link      https://www.phpmyfaq.de
16 * @since     2025-10-26
17 */
18
19declare(strict_types=1);
20
21namespace phpMyFAQ\Instance\Database;
22
23use phpMyFAQ\Configuration;
24use phpMyFAQ\Instance\Database;
25
26/**
27 * Class Mysqli
28 *
29 * @package phpMyFAQ\Instance\Database
30 */
31class PdoMysql extends Database implements DriverInterface
32{
33    /** @var string[] */
34    private array $createTableStatements = [
35        'faqadminlog' => 'CREATE TABLE %sfaqadminlog (
36            id INT(11) NOT NULL,
37            time INT(11) NOT NULL,
38            usr INT(11) NOT NULL,
39            text TEXT NOT NULL,
40            hash VARCHAR(64) NULL,
41            previous_hash VARCHAR(64) NULL,
42            ip VARCHAR(64) NOT NULL,
43            PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
44        'faqattachment' => 'CREATE TABLE %sfaqattachment (
45            id INT(11) NOT NULL,
46            record_id INT(11) NOT NULL,
47            record_lang VARCHAR(5) NOT NULL,
48            real_hash CHAR(32) NOT NULL,
49            virtual_hash CHAR(32) NOT NULL,
50            password_hash CHAR(40) NULL,
51            filename VARCHAR(255) NOT NULL,
52            filesize INT(11) NOT NULL,
53            encrypted INT(11) NOT NULL DEFAULT 0,
54            mime_type VARCHAR(255) NULL,
55            PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
56        'faqattachment_file' => 'CREATE TABLE %sfaqattachment_file (
57            virtual_hash CHAR(32) NOT NULL,
58            contents BLOB NOT NULL,
59            PRIMARY KEY (virtual_hash)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
60        'faqbackup' => 'CREATE TABLE %sfaqbackup (
61            id INT(11) NOT NULL,
62            filename VARCHAR(255) NOT NULL,
63            authkey VARCHAR(255) NOT NULL,
64            authcode VARCHAR(255) NOT NULL,
65            created timestamp NOT NULL,
66            PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
67        'faqbookmarks' => 'CREATE TABLE %sfaqbookmarks (
68            userid INT(11) DEFAULT NULL,
69            faqid INT(11) DEFAULT NULL) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
70        'faqcaptcha' => 'CREATE TABLE %sfaqcaptcha (
71            id VARCHAR(6) NOT NULL,
72            useragent VARCHAR(255) NOT NULL,
73            language VARCHAR(5) NOT NULL,
74            ip VARCHAR(64) NOT NULL,
75            captcha_time INT(11) NOT NULL,
76            PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
77        'faqcategories' => 'CREATE TABLE %sfaqcategories (
78            id INT(11) NOT NULL,
79            lang VARCHAR(5) NOT NULL,
80            parent_id INTEGER NOT NULL,
81            name VARCHAR(255) NOT NULL,
82            description VARCHAR(255) DEFAULT NULL,
83            user_id INT(11) NOT NULL,
84            group_id INT(11) NOT NULL DEFAULT -1,
85            active INT(11) NULL DEFAULT 1,
86            image VARCHAR(255) DEFAULT NULL,
87            show_home INT(1) DEFAULT NULL,
88            PRIMARY KEY (id, lang)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
89        'faqcategory_news' => 'CREATE TABLE %sfaqcategory_news (
90            category_id INT(11) NOT NULL,
91            news_id INT(11) NOT NULL,
92            PRIMARY KEY (category_id, news_id)) ENGINE = InnoDB',
93        'faqcategoryrelations' => 'CREATE TABLE %sfaqcategoryrelations (
94            category_id INT(11) NOT NULL,
95            category_lang VARCHAR(5) NOT NULL,
96            record_id INT(11) NOT NULL,
97            record_lang VARCHAR(5) NOT NULL,
98            PRIMARY KEY (category_id, category_lang, record_id, record_lang),
99            KEY idx_records (record_id, record_lang)) 
100            DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
101        'faqcategory_group' => 'CREATE TABLE %sfaqcategory_group (
102            category_id INT(11) NOT NULL,
103            group_id INT(11) NOT NULL,
104            PRIMARY KEY (category_id, group_id)) 
105            DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
106        'faqcategory_user' => 'CREATE TABLE %sfaqcategory_user (
107            category_id INT(11) NOT NULL,
108            user_id INT(11) NOT NULL,
109            PRIMARY KEY (category_id, user_id)) 
110            DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
111        'faqcategory_order' => 'CREATE TABLE %sfaqcategory_order (
112            category_id int(11) NOT NULL,
113            parent_id int(11) DEFAULT NULL,
114            position int(11) NOT NULL,
115            PRIMARY KEY (category_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
116        'faqchanges' => 'CREATE TABLE %sfaqchanges (
117            id INT(11) NOT NULL,
118            beitrag SMALLINT NOT NULL,
119            lang VARCHAR(5) NOT NULL,
120            revision_id INT(11) NOT NULL DEFAULT 0,
121            usr INT(11) NOT NULL ,
122            datum INT(11) NOT NULL,
123            what text DEFAULT NULL,
124            PRIMARY KEY (id, lang)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
125        'faqcomments' => 'CREATE TABLE %sfaqcomments (
126            id_comment INT(11) NOT NULL,
127            id INT(11) NOT NULL,
128            type VARCHAR(10) NOT NULL,
129            usr VARCHAR(255) NOT NULL,
130            email VARCHAR(255) NOT NULL,
131            comment text NOT NULL,
132            datum VARCHAR(64) NOT NULL,
133            helped text DEFAULT NULL,
134            PRIMARY KEY (id_comment)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
135        'faqconfig' => 'CREATE TABLE %sfaqconfig (
136            config_name VARCHAR(255) NOT NULL default \'\',
137            config_value TEXT DEFAULT NULL,
138            PRIMARY KEY (config_name)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
139        'faqdata' => 'CREATE TABLE %sfaqdata (
140            id INT(11) NOT NULL,
141            lang VARCHAR(5) NOT NULL,
142            solution_id INT(11) NOT NULL,
143            revision_id INT(11) NOT NULL DEFAULT 0,
144            active char(3) NOT NULL,
145            sticky INT(11) NOT NULL,
146            keywords TEXT DEFAULT NULL,
147            thema TEXT NOT NULL,
148            content LONGTEXT DEFAULT NULL,
149            author VARCHAR(255) NOT NULL,
150            email VARCHAR(255) NOT NULL,
151            comment char(1) default \'y\',
152            updated VARCHAR(15) NOT NULL,
153            date_start VARCHAR(14) NOT NULL DEFAULT \'00000000000000\',
154            date_end VARCHAR(14) NOT NULL DEFAULT \'99991231235959\',
155            created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
156            notes TEXT DEFAULT NULL,
157            sticky_order int(10) DEFAULT NULL,
158            FULLTEXT (keywords,thema,content),
159            PRIMARY KEY (id, lang)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
160        'faqdata_revisions' => 'CREATE TABLE %sfaqdata_revisions (
161            id INT(11) NOT NULL,
162            lang VARCHAR(5) NOT NULL,
163            solution_id INT(11) NOT NULL,
164            revision_id INT(11) NOT NULL DEFAULT 0,
165            active char(3) NOT NULL,
166            sticky INT(11) NOT NULL,
167            keywords TEXT DEFAULT NULL,
168            thema TEXT NOT NULL,
169            content LONGTEXT DEFAULT NULL,
170            author VARCHAR(255) NOT NULL,
171            email VARCHAR(255) NOT NULL,
172            comment char(1) default \'y\',
173            updated VARCHAR(15) NOT NULL,
174            date_start VARCHAR(14) NOT NULL DEFAULT \'00000000000000\',
175            date_end VARCHAR(14) NOT NULL DEFAULT \'99991231235959\',
176            created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
177            notes text DEFAULT NULL,
178            sticky_order int(10) DEFAULT NULL,
179            PRIMARY KEY (id, lang, solution_id, revision_id)) 
180            DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
181        'faqdata_group' => 'CREATE TABLE %sfaqdata_group (
182            record_id INT(11) NOT NULL,
183            group_id INT(11) NOT NULL,
184            PRIMARY KEY (record_id, group_id))',
185        'faqdata_tags' => 'CREATE TABLE %sfaqdata_tags (
186            record_id INT(11) NOT NULL,
187            tagging_id INT(11) NOT NULL,
188            PRIMARY KEY (record_id, tagging_id))',
189        'faqdata_user' => 'CREATE TABLE %sfaqdata_user (
190            record_id INT(11) NOT NULL,
191            user_id INT(11) NOT NULL,
192            PRIMARY KEY (record_id, user_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
193        'faqforms' => 'CREATE TABLE %sfaqforms (
194            form_id INT(1) NOT NULL,
195            input_id INT(11) NOT NULL,
196            input_type VARCHAR(1000) NOT NULL,
197            input_label VARCHAR(500) NOT NULL,
198            input_active INT(1) NOT NULL,
199            input_required INT(1) NOT NULL,
200            input_lang VARCHAR(11) NOT NULL)',
201        'faqglossary' => 'CREATE TABLE %sfaqglossary (
202            id INT(11) NOT NULL ,
203            lang VARCHAR(5) NOT NULL ,
204            item VARCHAR(255) NOT NULL ,
205            definition text NOT NULL,
206            PRIMARY KEY (id, lang)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
207        'faqgroup' => 'CREATE TABLE %sfaqgroup (
208            group_id INT(11) NOT NULL,
209            name VARCHAR(25) NULL,
210            description text NULL,
211            auto_join INT(11) NULL,
212            PRIMARY KEY(group_id),
213            KEY idx_name (name)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
214        'faqgroup_right' => 'CREATE TABLE %sfaqgroup_right (
215            group_id INT(11) NOT NULL,
216            right_id INT(11) NOT NULL,
217            PRIMARY KEY(group_id, right_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
218        'faqinstances' => 'CREATE TABLE %sfaqinstances (
219            id INT NOT NULL,
220            url VARCHAR(255) NOT NULL,
221            instance VARCHAR(255) NOT NULL,
222            comment TEXT NULL,
223            created TIMESTAMP DEFAULT \'1977-04-07 14:47:00\',
224            modified DATETIME NOT NULL,
225            PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
226        'faqinstances_config' => 'CREATE TABLE %sfaqinstances_config (
227            instance_id INT NOT NULL,
228            config_name VARCHAR(255) NOT NULL default \'\',
229            config_value VARCHAR(255) DEFAULT NULL,
230            PRIMARY KEY (instance_id, config_name))
231            DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
232        'faqnews' => 'CREATE TABLE %sfaqnews (
233            id INT(11) NOT NULL,
234            lang VARCHAR(5) NOT NULL,
235            header VARCHAR(255) NOT NULL,
236            artikel text NOT NULL,
237            datum VARCHAR(14) NOT NULL,
238            author_name  VARCHAR(255) NULL,
239            author_email VARCHAR(255) NULL,
240            active char(1) default \'y\',
241            comment char(1) default \'n\',
242            link VARCHAR(255) DEFAULT NULL,
243            linktitel VARCHAR(255) DEFAULT NULL,
244            target VARCHAR(255) NOT NULL,
245            PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
246        'faqcustompages' => 'CREATE TABLE %sfaqcustompages (
247            id INT(11) NOT NULL,
248            lang VARCHAR(5) NOT NULL,
249            page_title VARCHAR(255) NOT NULL,
250            slug VARCHAR(255) NOT NULL,
251            content TEXT NOT NULL,
252            author_name VARCHAR(255) NOT NULL,
253            author_email VARCHAR(255) NOT NULL,
254            active CHAR(1) NOT NULL DEFAULT \'n\',
255            created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
256            updated TIMESTAMP NULL,
257            seo_title VARCHAR(60) NULL,
258            seo_description VARCHAR(160) NULL,
259            seo_robots VARCHAR(50) NOT NULL DEFAULT \'index,follow\',
260            PRIMARY KEY (id, lang),
261            INDEX idx_custompages_slug (slug, lang))
262            DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
263        'faqquestions' => 'CREATE TABLE %sfaqquestions (
264            id INT(11) NOT NULL,
265            lang VARCHAR(5) NOT NULL,
266            username VARCHAR(100) NOT NULL,
267            email VARCHAR(100) NOT NULL,
268            category_id INT(11) NOT NULL,
269            question text NOT NULL,
270            created VARCHAR(20) NOT NULL,
271            is_visible char(1) default \'Y\',
272            answer_id INT(11) NOT NULL DEFAULT 0,
273            PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
274        'faqright' => 'CREATE TABLE %sfaqright (
275            right_id INT(11) NOT NULL,
276            name VARCHAR(50) NULL,
277            description text NULL,
278            for_users INT(11) NULL DEFAULT 1,
279            for_groups INT(11) NULL DEFAULT 1,
280            for_sections INT(11) NULL DEFAULT 1,
281            PRIMARY KEY (right_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
282        'faqsearches' => 'CREATE TABLE %sfaqsearches (
283            id INT(11) NOT NULL ,
284            lang VARCHAR(5) NOT NULL ,
285            searchterm VARCHAR(255) NOT NULL ,
286            searchdate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
287            PRIMARY KEY (id, lang)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
288        'faqseo' => 'CREATE TABLE %sfaqseo (
289            id INT(11) NOT NULL,
290            type VARCHAR(32) NOT NULL,
291            reference_id INT(11) NOT NULL,
292            reference_language VARCHAR(5) NOT NULL,
293            title TEXT DEFAULT NULL,
294            description TEXT DEFAULT NULL,
295            slug TEXT DEFAULT NULL,
296            created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
297            PRIMARY KEY (id)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
298        'faqsessions' => 'CREATE TABLE %sfaqsessions (
299            sid INT(11) NOT NULL,
300            user_id INT(11) NOT NULL,
301            ip VARCHAR(64) NOT NULL,
302            time INT(11) NOT NULL,
303            PRIMARY KEY (sid)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
304        'faqsessions_idx' => 'CREATE INDEX idx_time ON %sfaqsessions (time)',
305        'faqsearches_searchterm_idx' => 'CREATE INDEX idx_faqsearches_searchterm ON %sfaqsearches (searchterm)',
306        'faqsearches_date_term_idx' => 'CREATE INDEX idx_faqsearches_date_term ON %sfaqsearches (searchdate, searchterm)',
307        'faqsearches_date_term_lang_idx' => 'CREATE INDEX idx_faqsearches_date_term_lang ON %sfaqsearches (searchdate, searchterm, lang)',
308        'faqstopwords' => 'CREATE TABLE %sfaqstopwords (
309            id INT(11) NOT NULL,
310            lang VARCHAR(5) NOT NULL,
311            stopword VARCHAR(64) NOT NULL,
312            PRIMARY KEY (id, lang)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
313        'faqtags' => 'CREATE TABLE %sfaqtags (
314            tagging_id INT(11) NOT NULL,
315            tagging_name VARCHAR(255) NOT NULL ,
316            PRIMARY KEY (tagging_id, tagging_name))
317            DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
318        'faquser' => 'CREATE TABLE %sfaquser (
319            user_id INT(11) NOT NULL,
320            login VARCHAR(128) NOT NULL,
321            session_id VARCHAR(150) NULL,
322            session_timestamp INT(11) NULL,
323            ip VARCHAR(64) NULL,
324            account_status VARCHAR(50) NULL,
325            last_login VARCHAR(14) NULL,
326            auth_source VARCHAR(100) NULL,
327            member_since VARCHAR(14) NULL,
328            remember_me VARCHAR(150) NULL,
329            success INT(1) NULL DEFAULT 1,
330            is_superadmin INT(1) NULL DEFAULT 0,
331            login_attempts INT(1) NULL DEFAULT 0,
332            refresh_token TEXT NULL DEFAULT NULL,
333            access_token TEXT NULL DEFAULT NULL,
334            code_verifier VARCHAR(255) NULL DEFAULT NULL,
335            jwt TEXT NULL DEFAULT NULL,
336            webauthnkeys TEXT NULL DEFAULT NULL,
337            PRIMARY KEY (user_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
338        'faquserdata' => 'CREATE TABLE %sfaquserdata (
339            user_id INT(11) NOT NULL,
340            last_modified VARCHAR(14) NULL,
341            display_name VARCHAR(128) NULL,
342            email VARCHAR(128) NULL,
343            keycloak_sub VARCHAR(255) NULL,
344            is_visible INT(1) NULL DEFAULT 0,
345            twofactor_enabled INT(1) NULL DEFAULT 0,
346            secret VARCHAR(128) NULL DEFAULT NULL)',
347        'faquserlogin' => 'CREATE TABLE %sfaquserlogin (
348            login VARCHAR(128) NOT NULL,
349            pass VARCHAR(80) NULL,
350            domain VARCHAR(255) NULL,
351            PRIMARY KEY (login)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
352        'faquser_group' => 'CREATE TABLE %sfaquser_group (
353            user_id INT(11) NOT NULL,
354            group_id INT(11) NOT NULL,
355            PRIMARY KEY (user_id, group_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
356        'faquser_right' => 'CREATE TABLE %sfaquser_right (
357            user_id INT(11) NOT NULL,
358            right_id INT(11) NOT NULL,
359            PRIMARY KEY (user_id, right_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
360        'faqvisits' => 'CREATE TABLE %sfaqvisits (
361            id INT(11) NOT NULL,
362            lang VARCHAR(5) NOT NULL,
363            visits INT(11) NOT NULL,
364            last_visit INT(11) NOT NULL,
365            PRIMARY KEY (id, lang)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
366        'faqvoting' => 'CREATE TABLE %sfaqvoting (
367            id INT(11) NOT NULL,
368            artikel INT(11) NOT NULL,
369            vote INT(11) NOT NULL,
370            usr INT(11) NOT NULL,
371            datum VARCHAR(20) DEFAULT \'\',
372            ip VARCHAR(15) DEFAULT \'\',
373            PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
374        'faqchat_messages' => 'CREATE TABLE %sfaqchat_messages (
375            id INT(11) NOT NULL AUTO_INCREMENT,
376            sender_id INT(11) NOT NULL,
377            recipient_id INT(11) NOT NULL,
378            message TEXT NOT NULL,
379            is_read TINYINT(1) NOT NULL DEFAULT 0,
380            created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
381            PRIMARY KEY (id),
382            INDEX idx_chat_sender (sender_id),
383            INDEX idx_chat_recipient (recipient_id),
384            INDEX idx_chat_conversation (sender_id, recipient_id),
385            INDEX idx_chat_created (created_at))
386            DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB',
387    ];
388
389    /**
390     * Constructor.
391     */
392    public function __construct(Configuration $configuration)
393    {
394        $this->configuration = $configuration;
395    }
396
397    /**
398     * Executes all CREATE TABLE and CREATE INDEX statements.
399     *
400     *
401     */
402    public function createTables(string $prefix = '', ?string $schema = null): bool
403    {
404        if ($schema !== null && $schema !== '') {
405            if (!preg_match('/^[A-Za-z0-9_]+$/', $schema)) {
406                return false;
407            }
408
409            $quotedSchema = sprintf('`%s`', str_replace('`', replace: '``', subject: $schema));
410
411            if (!$this->configuration->getDb()->query(sprintf('CREATE DATABASE IF NOT EXISTS %s', $quotedSchema))) {
412                return false;
413            }
414
415            if (!$this->configuration->getDb()->query(sprintf('USE %s', $quotedSchema))) {
416                return false;
417            }
418        }
419
420        foreach ($this->createTableStatements as $createTableStatement) {
421            $result = $this->configuration->getDb()->query(sprintf($createTableStatement, $prefix));
422
423            if (!$result) {
424                echo sprintf($createTableStatement, $prefix);
425                echo $this->configuration->getDb()->error();
426
427                return false;
428            }
429        }
430
431        return true;
432    }
433}