Repository navigation
Expand file tree
/
Copy pathXQL.php
More file actions
142 lines (117 loc) · 3.92 KB
/
Copy pathXQL.php
File metadata and controls
142 lines (117 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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
131
132
133
134
135
136
137
138
139
140
141
142
<?php
namespace XQL;
use XQL\Cloud\Cloud;
use XQL\Cloud\CloudDriver;
use XQL\Core\XQLField;
use XQL\Core\XQLModel;
use XQL\Core\XQLObject;
use XQL\Core\Utils\Env;
use XQL\Dev\CreateSchema;
use XQL\Dev\ProcessTrigger;
use XQL\Dev\Monitor\DaemonMonitor;
use XQL\DB\DBX;
class XQL
{
public static function configure(array $config): void
{
Env::configure($config);
Cloud::reset();
DBX::resetConnections();
}
public static function useCloudDriver(CloudDriver $driver): void
{
Cloud::useDriver($driver);
}
public static function useConnections(?\PDO $xql = null, ?\PDO $data = null): void
{
DBX::useConnections($xql, $data);
}
public static function resetConnections(): void
{
DBX::resetConnections();
}
public static function validateConfig(): array
{
return DBX::validateConfig();
}
public static function fetch(string $modelClass, string $id): XQLModel
{
self::assertModelClass($modelClass);
return $modelClass::fetch($id);
}
public static function metadata(string $modelClass, string $id): ?array
{
self::assertModelClass($modelClass);
return DBX::instanceMetadata($modelClass, $id);
}
public static function list(string $modelClass, int $limit = 100, int $offset = 0): array
{
self::assertModelClass($modelClass);
return DBX::listInstances($modelClass, $limit, $offset);
}
public static function search(string $modelClass, string $fieldName, mixed $value, int $limit = 100): array
{
self::assertModelClass($modelClass);
return DBX::searchInstances($modelClass, $fieldName, $value, $limit);
}
public static function searchModels(string $modelClass, string $fieldName, mixed $value, int $limit = 100): array
{
return array_map(
fn(array $row) => self::fetch($modelClass, $row['id']),
self::search($modelClass, $fieldName, $value, $limit)
);
}
public static function create(string $modelClass, array|\Closure $data, ?\Closure $callback = null): XQLModel
{
self::assertModelClass($modelClass);
return $modelClass::create($data, $callback);
}
public static function value(XQLModel $model, string $xpath, mixed $default = null): mixed
{
return self::unwrap($model->get($xpath), $default);
}
public static function xml(XQLModel $model): string
{
return $model->toXml();
}
public static function array(XQLModel $model): array
{
return $model->toArray();
}
public static function syncModels(bool $createInstances = false): array
{
return CreateSchema::syncModelDefinitions($createInstances);
}
public static function rebuildDirty(int $limit = 100): array
{
return CreateSchema::rebuildDirtyInstances($limit);
}
public static function changedRow(string $table, string $eventType, array $before = [], array $after = [], array $metadata = []): array
{
return ProcessTrigger::changedRow($table, $eventType, $before, $after, $metadata);
}
public static function processJobs(int $limit = 100): array
{
return ProcessTrigger::processPendingJobs($limit);
}
public static function status(): array
{
return (new DaemonMonitor())->status();
}
private static function assertModelClass(string $modelClass): void
{
if(!class_exists($modelClass) || !is_subclass_of($modelClass, XQLModel::class)) {
throw new \InvalidArgumentException($modelClass . " must be an XQLModel class.");
}
}
private static function unwrap(mixed $value, mixed $default = null): mixed
{
if($value instanceof XQLField) {
return $value->value() ?? $default;
}
if($value instanceof XQLObject) {
return $value->toArray();
}
return $value ?? $default;
}
}