Store.php 18.2 KB
Newer Older
1
2
3
4
5
6
7
8
<?php
/**
 * Created by PhpStorm.
 * User: crose
 * Date: 1/1/16
 * Time: 6:51 PM
 */

9
namespace qfq;
10

11
use qfq\CodeException;
12
13
use qfq\keyValueStringParser;
use qfq\OnArray;
14
use qfq;
15

16
require_once(__DIR__ . '/../../qfq/helper/KeyValueStringParser.php');
Carsten  Rose's avatar
Carsten Rose committed
17
require_once(__DIR__ . '/../../qfq/helper/Sanitize.php');
18
require_once(__DIR__ . '/../../qfq/Constants.php');
19
require_once(__DIR__ . '/../../qfq/store/Sip.php');
20
require_once(__DIR__ . '/../../qfq/Database.php');
21
22
23
24
25
26
27
28
29
30
31


/*
 * Stores:
 * - SIP
 * - webVar
 * - record
 * - form
 * - formElement
 */

Carsten  Rose's avatar
Carsten Rose committed
32
33
/**
 * Class Store
34
 * @package qfq
Carsten  Rose's avatar
Carsten Rose committed
35
 */
36
37
class Store {

Carsten  Rose's avatar
Carsten Rose committed
38
39
40
    /**
     * @var Store Instance of class Store. There should only be one class 'Store' at a time.
     */
41
42
    private static $instance = null;

Carsten  Rose's avatar
Carsten Rose committed
43
44
45
    /**
     * @var Sip Instance of class SIP
     */
46
47
    private static $sip = null;

Carsten  Rose's avatar
Carsten Rose committed
48
49
50
51
52
53
54
55
56
57
    /**
     * @var array Stores all indiviudal stores with the variable raw values
     *
     * $raw['D']['id'] = 0  - Defaultvalues from Tabledefinition
     * ...
     * $raw['S']['r'] = 1234 - record ID from current SIP identifier
     * ...
     * $raw['C']['HTTP_SERVER'] = 'qfq' - Servername
     * $raw['C']['s'] = 'badcaffee1234' - recent SIP
     */
58
    private static $raw = array();
Carsten  Rose's avatar
Carsten Rose committed
59
60

    /**
Carsten  Rose's avatar
Carsten Rose committed
61
     * @var array Default sanitize classes.
Carsten  Rose's avatar
Carsten Rose committed
62
     */
Carsten  Rose's avatar
Carsten Rose committed
63
    private static $sanitizeClass = array();
Carsten  Rose's avatar
Carsten Rose committed
64
65

    /**
Carsten  Rose's avatar
Carsten Rose committed
66
67
     * $sanitizeClass['S'] = false
     * $sanitizeClass['C'] = true
Carsten  Rose's avatar
Carsten Rose committed
68
69
     * ...
     *
Carsten  Rose's avatar
Carsten Rose committed
70
     * @var array each entry with true/false - depending if store needs to be sanitized.
Carsten  Rose's avatar
Carsten Rose committed
71
     */
Carsten  Rose's avatar
Carsten Rose committed
72
    private static $sanitizeStore = array();
73

Carsten  Rose's avatar
Carsten Rose committed
74
    private static $phpUnit = false;
75

76
    /**
77
     * @param string $bodytext
78
     */
79
    private function __construct($bodytext = '') {
80

Carsten  Rose's avatar
Carsten Rose committed
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
        self::$sanitizeClass = [
//            TYPO3_DEBUG_LOAD => SANITIZE_ALLOW_DIGIT,
//            TYPO3_DEBUG_SAVE => SANITIZE_ALLOW_DIGIT,
//            TYPO3_FORM => SANITIZE_ALLOW_ALNUMX,
//            TYPO3_FE_USER => SANITIZE_ALLOW_ALNUMX,
//            TYPO3_FE_USER_UID => SANITIZE_ALLOW_DIGIT,
//            TYPO3_FE_USER_GROUP => SANITIZE_ALLOW_ALNUMX,

            CLIENT_SIP => SANITIZE_ALLOW_ALNUMX,
            CLIENT_RECORD_ID => SANITIZE_ALLOW_DIGIT,
            CLIENT_KEY_SEM_ID => SANITIZE_ALLOW_DIGIT,
            CLIENT_KEY_SEM_ID_USER => SANITIZE_ALLOW_DIGIT,
            CLIENT_PAGE_ID => SANITIZE_ALLOW_DIGIT,
            CLIENT_PAGE_TYPE => SANITIZE_ALLOW_DIGIT,
            CLIENT_PAGE_LANGUAGE => SANITIZE_ALLOW_DIGIT,
            CLIENT_FORM => SANITIZE_ALLOW_ALNUMX,

            // Part of $_SERVER. Missing vars must be requested individual with the needed sanitize class.
            CLIENT_SCRIPT_URL => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SCRIPT_URI => SANITIZE_ALLOW_ALNUMX,
            CLIENT_HTTP_HOST => SANITIZE_ALLOW_ALNUMX,
            CLIENT_HTTP_USER_AGENT => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SERVER_NAME => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SERVER_ADDRESS => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SERVER_PORT => SANITIZE_ALLOW_DIGIT,
            CLIENT_REMOTE_ADDRESS => SANITIZE_ALLOW_ALNUMX,
            CLIENT_REQUEST_SCHEME => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SCRIPT_FILENAME => SANITIZE_ALLOW_ALNUMX,
            CLIENT_QUERY_STRING => SANITIZE_ALLOW_ALL,
            CLIENT_REQUEST_URI => SANITIZE_ALLOW_ALL,
            CLIENT_SCRIPT_NAME => SANITIZE_ALLOW_ALNUMX,
            CLIENT_PHP_SELF => SANITIZE_ALLOW_ALNUMX,

//            SYSTEM_DBUSER => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_DBSERVER => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_DBPW => SANITIZE_ALLOW_ALL,
//            SYSTEM_DB => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_TESTDB => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_SESSIONNAME => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_DBH => SANITIZE_ALLOW_ALL,

//            SYSTEM_SQL_RAW => SANITIZE_ALLOW_ALL,
//            SYSTEM_SQL_FINAL => SANITIZE_ALLOW_ALL,
//            SYSTEM_SQL_COUNT => SANITIZE_ALLOW_DIGIT,
//            SYSTEM_SQL_PARAM_ARRAY => SANITIZE_ALLOW_ALL,

//            SIP_SIP => SANITIZE_ALLOW_ALNUMX,
//            SIP_RECORD_ID => SANITIZE_ALLOW_DIGIT,
//            SIP_FORM => SANITIZE_ALLOW_ALNUMX,
//            SIP_URLPARAM => SANITIZE_ALLOW_ALL
131

132
133
        ];

Carsten  Rose's avatar
Carsten Rose committed
134
        self::$sanitizeStore = [
135
136
137
138
            STORE_FORM => true,
            STORE_SIP => false,
            STORE_RECORD => false,
            STORE_PARENT_RECORD => false,
139
140
            STORE_TABLE_DEFAULT => false,
            STORE_TABLE_COLUMN_TYPES => false,
141
142
            STORE_CLIENT => true,
            STORE_TYPO3 => false,
143
            STORE_ZERO => false,
144
145
146
            STORE_SYSTEM => false
        ];

147
        self::fillSystemStore();
148
        self::fillStoreTypo3($bodytext);
149
        self::fillStoreClient();
150
        self::fillStoreSip();
Carsten  Rose's avatar
Carsten Rose committed
151
        self::fillStoreExtra();
152
    }
153

154
155
    /**
     * @throws CodeException
156
     * @throws qfq\UserFormException
157
     */
158
    private static function fillSystemStore() {
159
        try {
160
161
            //TODO: Vernuenftige Fehlermeldung falls nicht auf qfq.ini zugegriffen werden kann.
            //TODO: sinnvollen Platz fuer qfq.ini bestimmen. In der Installationsdoku erwaehnen.
162
            $config = parse_ini_file(__DIR__ . '/../../../' . CONFIG_INI, false);
163

164
165
            //TODO: auskommentiert weil dann die Unittests nicht mehr laufen. Sollte eigentlich wieder aktiviert werden.
//            $config['SQLLOG'] = Support::ifRelativePathPrependExtensionPath($config['SQLLOG']);
166

167
        } catch (\Exception $e) {
168
            throw new qfq\UserFormException ("Error read file " . CONFIG_INI . ": " . $e->getMessage(), ERROR_IO_READ_FILE);
169
        }
170

171
        // Adjust config
172
        if (!isset($config['SHOW_DEBUG_INFO']) || $config['SHOW_DEBUG_INFO'] === 'auto') {
173
174
175
            $config['SHOW_DEBUG_INFO'] = (isset($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) ? 'yes' : 'no';
        }

176
177
178
179
180
181
182
        // SYSTEM_PATH_EXT: compute only if not already defined.
        if (!isset($config[SYSTEM_PATH_EXT]) || $config[SYSTEM_PATH_EXT] === '' || $config[SYSTEM_PATH_EXT][0] !== '/') {
            $relExtDir = '/typo3conf/ext/' . EXT_KEY;

            // If we are called through AJAX API (e.g. api/save.php), there is no TYPO3 environment.
            if (isset($_SERVER['SCRIPT_FILENAME'])) {
                $pos = strpos($_SERVER['SCRIPT_FILENAME'], $relExtDir);
183
184
                if ($pos === false && isset($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php'])) {

185
186
187
188
189
190
191
192
                    // probably: index.php - THERE should be a TYPO3 environment.
                    $config[SYSTEM_PATH_EXT] = dirname($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php']);
                } else {
                    $config[SYSTEM_PATH_EXT] = substr($_SERVER['SCRIPT_FILENAME'], 0, $pos + strlen($relExtDir));
                }
            }
        }

193
194
195
        // Defaults
        Support::setIfNotSet($config, SYSTEM_DATE_FORMAT, 'yyyy-mm-dd');

196
197
198
199
200
201
        // make SQL PATH absolute. This is necessary to work in different directories correctly.
        if (isset($config[SYSTEM_SQL_LOG]) && $config[SYSTEM_SQL_LOG][0] !== '/') {
            $config[SYSTEM_SQL_LOG] = $config[SYSTEM_PATH_EXT] . '/' . $config[SYSTEM_SQL_LOG];
        }


202
        self::setVarArray($config, STORE_SYSTEM, true);
203
204
    }

205
206
207
    /**
     * @param array $dataArray
     * @param $store
208
     * @param bool|false $flagOverwrite
209
     * @throws UserFormException
210
     * @throws \qfq\CodeException
211
     */
212
    public static function setVarArray(array $dataArray, $store, $flagOverwrite = false) {
Carsten  Rose's avatar
Carsten Rose committed
213
        // Check valid Storename
Carsten  Rose's avatar
Carsten Rose committed
214
        if (!isset(self::$sanitizeStore))
215
            throw new UserFormException("Unknown Store: $store", ERROR_UNNOWN_STORE);
Carsten  Rose's avatar
Carsten Rose committed
216
217


218
        if ($store === STORE_ZERO)
Carsten  Rose's avatar
Carsten Rose committed
219
            throw new CodeException("setVarArray() for STORE_ZERO is impossible - there are no values.", ERROR_SET_STORE_ZERO);
220

Carsten  Rose's avatar
Carsten Rose committed
221
        if (!$flagOverwrite && isset(self::$raw[$store]) && count(self::$raw[$store]) > 0) {
222
            throw new CodeException("Raw values already been copied to store '$store'. Do this only one time.", ERROR_STORE_VALUE_ALREADY_CODPIED);
223
        }
224

225
226
        self::$raw[$store] = $dataArray;
    }
227

228
229
230
231
    /**
     * @param $bodytext
     * @throws CodeException
     */
232
    private static function fillStoreTypo3($bodytext) {
233

234
        $arr = KeyValueStringParser::parse($bodytext, "=", "\n");
235
236
237
238
239
240
241
242
243

        if (isset($GLOBALS["TSFE"]->fe_user->user["username"]))
            $arr[TYPO3_FE_USER] = $GLOBALS["TSFE"]->fe_user->user["username"];

        if (isset($GLOBALS["TSFE"]->fe_user->user["uid"]))
            $arr[TYPO3_FE_USER_UID] = $GLOBALS["TSFE"]->fe_user->user["uid"];

        if (isset($GLOBALS["TSFE"]->fe_user->user["usergroup"]))
            $arr[TYPO3_FE_USER_GROUP] = $GLOBALS["TSFE"]->fe_user->user["usergroup"];
244

Carsten  Rose's avatar
Carsten Rose committed
245
246
247
        if (isset($GLOBALS["TSFE"]->page["uid"]))
            $arr[TYPO3_TT_CONTENT_UID] = $GLOBALS["TSFE"]->page["uid"];

248
249
250
        if (isset($GLOBALS["TSFE"]->id))
            $arr[TYPO3_PAGE_ID] = $GLOBALS["TSFE"]->id;

Carsten  Rose's avatar
Carsten Rose committed
251
252
253
        if (isset($GLOBALS["TSFE"]->type))
            $arr[TYPO3_PAGE_TYPE] = $GLOBALS["TSFE"]->type;

254
255
256
        if (isset($GLOBALS["TSFE"]->sys_language_uid))
            $arr[TYPO3_PAGE_LANGUAGE] = $GLOBALS["TSFE"]->sys_language_uid;

257
        self::setVarArray($arr, STORE_TYPO3, true);
258
    }
259

260
261
262
    /**
     * @throws CodeException
     */
263
    private static function fillStoreClient() {
264
        // copy GET and POST and SERVER Parameter. Priority: SERVER, POST, GET
265
266
267
268
269
270
271
272
273
        $arr = array();
        if (isset($_GET))
            $arr = array_merge($arr, $_GET);

        if (isset($_POST))
            $arr = array_merge($arr, $_POST);

        if (isset($_SERVER))
            $arr = array_merge($arr, $_SERVER);
274

275
        self::setVarArray($arr, STORE_CLIENT, true);
276
    }
277

Carsten  Rose's avatar
Carsten Rose committed
278
279
    /**
     * @throws CodeException
280
     * @throws UserFormException
Carsten  Rose's avatar
Carsten Rose committed
281
     */
282
    private static function fillStoreSip() {
Carsten  Rose's avatar
Carsten Rose committed
283

284
        $sessionName = self::getVar(SYSTEM_SESSION_NAME, STORE_SYSTEM);
285
        self::$sip = new Sip($sessionName);
286

287
288
289
290
        $s = self::getVar(CLIENT_SIP, STORE_CLIENT);
        if ($s !== false) {
            // if session is given, copy values to store
            $param = self::$sip->getVarsFromSip($s);
291
292
            $param[SIP_SIP] = $s;
            $param[SIP_URLPARAM] = self::$sip->getQueryStringFromSip($s);
293

294
//            self::setVarArray(KeyValueStringParser::parse($param, "=", "&"), STORE_SIP);
295
            self::setVarArray($param, STORE_SIP, true);
296
297
298
        }
    }

299
    /**
300
     * Cycles through all stores in $useStore.
301
     * First match will return the found value.
Carsten  Rose's avatar
Carsten Rose committed
302
     * During cycling: fill cache with requestet value and sanitize raw value.
303
     *
304
     * @param string $key
305
     * @param string $useStores f.e.: 'FSRD'
Carsten  Rose's avatar
Carsten Rose committed
306
     * @param string $sanitizeClass
Carsten  Rose's avatar
Carsten Rose committed
307
     * @param string $foundInStore Returns the name of the store where $key has been found. If $key is not found, return ''.
308
     * @return string a) if found: value, b) false
Carsten  Rose's avatar
Carsten Rose committed
309
     * @throws \qfq\CodeException
310
     */
Carsten  Rose's avatar
Carsten Rose committed
311
    public static function getVar($key, $useStores = STORE_USE_DEFAULT, $sanitizeClass = '', &$foundInStore = '') {
312
313

        // no store specifed?
314
        if ($useStores === "" || $useStores === null) {
315
            $useStores = STORE_USE_DEFAULT;
316
317
        }

318
        // no sanitizeClass specified: take predefined (if exist) or default.
319
        if ($sanitizeClass === '' || $sanitizeClass === null) {
Carsten  Rose's avatar
Carsten Rose committed
320
            $sanitizeClass = isset(self::$sanitizeClass[$key]) ? self::$sanitizeClass[$key] : SANITIZE_DEFAULT;
321
322
        }

323
324
325
        while ($useStores !== false) {

            $store = substr($useStores, 0, 1); // next store
Carsten  Rose's avatar
Carsten Rose committed
326
            $foundInStore = $store;
327
328
            $useStores = substr($useStores, 1); // shift left remaining stores

329
            if (!isset(self::$raw[$store][$key])) {
330
331
332
                switch ($store) {
                    case STORE_ZERO:
                        return 0;
333
334
                    case STORE_EMPTY:
                        return '';
335
336
                    case STORE_VAR:
                        if ($key === VAR_RANDOM) {
337
                            return Support::randomAlphaNum(RANDOM_LENGTH);
338
339
340
341
342
343
344
                        } else {
                            continue 2;  // no value provided, continue with while loop
                        }
                        break;
                    default:
                        continue 2; // no value provided, continue with while loop
                        break;
Carsten  Rose's avatar
Carsten Rose committed
345
                }
346
347
            }

348
            $rawVal = isset(self::$raw[$store][$key]) ? self::$raw[$store][$key] : null;
Carsten  Rose's avatar
Carsten Rose committed
349
            if (self::$sanitizeStore[$store] && $sanitizeClass != '') {
350
351
352
353
354
                if ($sanitizeClass == SANITIZE_ALLOW_PATTERN || $sanitizeClass == SANITIZE_ALLOW_MIN_MAX || $sanitizeClass == SANITIZE_ALLOW_MIN_MAX_DATE) {
                    // We do not have any pattern or min|max values at this point. For those who be affected, they already checked earlier. So set 'no check'
                    $sanitizeClass = SANITIZE_ALLOW_ALL;
                }
                return \qfq\Sanitize::sanitize($rawVal, $sanitizeClass, '', SANATIZE_EMPTY_STRING);
355
356
            } else {
                return $rawVal;
357
            }
358
        }
Carsten  Rose's avatar
Carsten Rose committed
359
        $foundInStore = '';
360
        return false;
361
    }
362

Carsten  Rose's avatar
Carsten Rose committed
363
364
365
366
367
368
369
370
371
372
373
    /**
     * @throws UserFormException
     * @throws \qfq\CodeException
     */
    private static function fillStoreExtra() {
        if (isset($_SESSION[STORE_EXTRA]))
            self::setVarArray($_SESSION[STORE_EXTRA], STORE_EXTRA, true);
        else
            self::setVarArray(array(), STORE_EXTRA, true);
    }

374
375
    /**
     * @param string $bodytext
376
     * @param bool|false $phpUnit
377
     * @return null|\qfq\Store
378
     */
379
    public static function getInstance($bodytext = '', $phpUnit = false) {
380

381
        if ($phpUnit) {
382
383
384
385
386
387
388
            if (self::$instance !== null) {

                self::unsetStore(STORE_TYPO3);
                self::fillStoreTypo3($bodytext);

                self::unsetStore(STORE_CLIENT);
                self::fillStoreClient();
389
390
391
392
393
            }
        }

        // Design Pattern: Singleton
        if (self::$instance === null) {
394
395
396
            self::$phpUnit = $phpUnit;

            self::$instance = new self($bodytext);
Carsten  Rose's avatar
Carsten Rose committed
397
398
399
400
        } else {
            // Class Store seems to be presistent over multiple QFQ instantiation. Set bodytext again, with every new request (if bodytext is given).
            if ($bodytext !== '')
                self::fillStoreTypo3($bodytext);
401
402
        }

403
404
405
406
407
408
409
        // Disable TYPO3_DEBUG_SHOW_BODY_TEXT=1 if SYSTEM_SHOW_DEBUG_INFO!='yes'
        if (self::getVar(TYPO3_DEBUG_SHOW_BODY_TEXT, STORE_TYPO3) === '1' &&
            self::getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM) !== 'yes'
        ) {
            self::setVar(TYPO3_DEBUG_SHOW_BODY_TEXT, '0', STORE_TYPO3);
        }

410
        return self::$instance;
411
    }
412

413
414
    /**
     * @param $store
415
416
     * @throws UserFormException
     * @throws \qfq\CodeException
417
418
     */
    public static function unsetStore($store) {
Carsten  Rose's avatar
Carsten Rose committed
419
        // Check valid Storename
Carsten  Rose's avatar
Carsten Rose committed
420
        if (!isset(self::$sanitizeStore))
421
            throw new UserFormException("Unknown Store: $store", ERROR_UNNOWN_STORE);
Carsten  Rose's avatar
Carsten Rose committed
422

423
        if ($store === STORE_ZERO)
Carsten  Rose's avatar
Carsten Rose committed
424
425
            throw new CodeException("unsetStore() for STORE_ZERO is impossible - there are no values.", ERROR_SET_STORE_ZERO);

426
427
428
        if (isset(self::$raw[$store])) {
            self::$raw[$store] = array();
        }
Carsten  Rose's avatar
Carsten Rose committed
429

430
431
    }

432
    /**
Carsten  Rose's avatar
Carsten Rose committed
433
434
435
     * @param string $key
     * @param string|array $value
     * @param string $store
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
     * @param bool|true $overWrite
     * @throws UserFormException
     * @throws \qfq\CodeException
     */
    public static function setVar($key, $value, $store, $overWrite = true) {
        // Check valid Storename
        if (!isset(self::$sanitizeStore))
            throw new UserFormException("Unknown Store: $store", ERROR_UNNOWN_STORE);

        if ($store === STORE_ZERO)
            throw new CodeException("setVar() for STORE_ZERO is impossible - there are no values.", ERROR_SET_STORE_ZERO);

        if ($overWrite === false && isset(self::$raw[$store][$key])) {
            throw new UserFormException("Value of '$key' already be set in store '$store'.", ERROR_STORE_KEY_EXIST);
        }

        self::$raw[$store][$key] = $value;
Carsten  Rose's avatar
Carsten Rose committed
453
454
455
456
457
458
459
460

        // The STORE_EXTRA saves arrays and is persistent
        if ($store === STORE_EXTRA) {
            foreach ($value as $k1 => $v1) {
                $_SESSION[STORE_EXTRA][$key][$k1] = $v1;
            }
        }

461
462
    }

463
464
465
466
    /**
     * @param $formName
     * @throws CodeException
     */
467
    public static function createSipAfterFormLoad($formName) {
468
        $recordId = self::getVar(CLIENT_RECORD_ID, STORE_TYPO3 . STORE_CLIENT);
469
470
471
472
473
474
475
        if ($recordId === false) {
            $recordId = 0;
        }

        $tmpParam = [SIP_RECORD_ID => $recordId, SIP_FORM => $formName];

        // Construct fake urlparam
476
        $tmpUrlparam = OnArray::toString($tmpParam);
477
478

        // Create a fake SIP which has never been passed by URL - further processing might expect this to exist.
479
        $sip = self::getSipInstance()->queryStringToSip($tmpUrlparam, RETURN_SIP);
480
        self::setVar(CLIENT_SIP, $sip, STORE_CLIENT);
481
482
483
484
485

        // Store in SIP Store (cause it's empty until now).
        $tmpParam[SIP_SIP] = $sip;
        self::setVarArray($tmpParam, STORE_SIP);

486
487
488
    }

    /**
489
     * @return null|Sip
490
     */
491
    public static function getSipInstance() {
492
493
        return self::$sip;
    }
494

495
496
    /**
     * @param $store
497
498
499
     * @return array
     * @throws UserFormException
     * @throws \qfq\CodeException
500
501
     */
    public static function getStore($store) {
Carsten  Rose's avatar
Carsten Rose committed
502
        // Check valid Storename
Carsten  Rose's avatar
Carsten Rose committed
503
        if (!isset(self::$sanitizeStore[$store]))
504
            throw new UserFormException("Unknown Store: $store", ERROR_UNNOWN_STORE);
Carsten  Rose's avatar
Carsten Rose committed
505

506
        if ($store === STORE_ZERO)
Carsten  Rose's avatar
Carsten Rose committed
507
508
            throw new CodeException("getStore() for STORE_ZERO is impossible - there are no values saved.", ERROR_GET_STORE_ZERO);

509
510
511
512
513
        if (isset(self::$raw[$store])) {
            return self::$raw[$store];
        }
        return array();
    }
514

Carsten  Rose's avatar
Carsten Rose committed
515

516
    /**
Carsten  Rose's avatar
Carsten Rose committed
517
518
     * Fills STORE_TABLE_DEFAULT and STORE_TABLE_COLUMN_TYPES
     *
519
520
521
     * @param $tableName
     * @throws CodeException
     */
522
    public static function fillStoreTableDefaultColumnType($tableName) {
523
524
525
526
        $db = new qfq\Database();

        $tableDefinition = $db->getTableDefinition($tableName);

Carsten  Rose's avatar
Carsten Rose committed
527
528
        self::setVarArray(array_column($tableDefinition, 'Default', 'Field'), STORE_TABLE_DEFAULT, true);
        self::setVarArray(array_column($tableDefinition, 'Type', 'Field'), STORE_TABLE_COLUMN_TYPES, true);
529
    }
530
531
532
533
534
}