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