-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.php
More file actions
149 lines (137 loc) · 7.77 KB
/
Copy pathinstall.php
File metadata and controls
149 lines (137 loc) · 7.77 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
143
144
145
146
147
148
<?php
/** @var rex_addon $this */
// Migrate: rename column `active` → `is_default` for existing installations.
// Note: `default` is a MySQL reserved keyword, so `is_default` is used instead.
try {
$migSql = rex_sql::factory();
if (!empty($migSql->getArray('SHOW COLUMNS FROM ' . rex::getTable('vtrans_agent') . ' LIKE \'active\''))) {
$migSql->setQuery('ALTER TABLE ' . rex::getTable('vtrans_agent') . ' CHANGE `active` `is_default` tinyint(1) NOT NULL DEFAULT 0');
$migSql->setQuery('UPDATE ' . rex::getTable('vtrans_agent') . ' SET is_default = 0');
$migSql->setQuery('UPDATE ' . rex::getTable('vtrans_agent') . ' SET is_default = 1 ORDER BY prio ASC, id ASC LIMIT 1');
}
} catch (Throwable $e) {
// Migration may already be done or the table is being created for the first time.
}
// Migrate: rename table vtrans_agent → vtrans_connection.
try {
$migSql = rex_sql::factory();
$tables = array_column($migSql->getArray('SHOW TABLES LIKE \'' . rex::getTablePrefix() . 'vtrans_agent\''), 'Tables_in_' . rex::getTablePrefix() . 'vtrans_agent');
if (!empty($migSql->getArray('SHOW TABLES LIKE \'' . rex::getTablePrefix() . 'vtrans_agent\''))) {
$migSql->setQuery('RENAME TABLE ' . rex::getTable('vtrans_agent') . ' TO ' . rex::getTable('vtrans_connection'));
}
} catch (Throwable $e) {
// Migration may already be done or the table is being created for the first time.
}
// Migrate: rename column `agent` → `connection` in vtrans table.
try {
$migSql = rex_sql::factory();
if (!empty($migSql->getArray('SHOW COLUMNS FROM ' . rex::getTable('vtrans') . ' LIKE \'agent\''))) {
$migSql->setQuery('ALTER TABLE ' . rex::getTable('vtrans') . ' CHANGE `agent` `connection` varchar(191) NULL DEFAULT NULL');
// Rename index key_target_agent_unique → key_target_connection_unique if it exists.
$indexes = $migSql->getArray('SHOW INDEX FROM ' . rex::getTable('vtrans') . ' WHERE Key_name = \'key_target_agent_unique\'');
if (!empty($indexes)) {
$migSql->setQuery('ALTER TABLE ' . rex::getTable('vtrans') . ' DROP INDEX `key_target_agent_unique`');
$migSql->setQuery('ALTER TABLE ' . rex::getTable('vtrans') . ' ADD UNIQUE KEY `key_target_connection_unique` (`key`, `target`, `connection`)');
}
}
} catch (Throwable $e) {
// Migration may already be done or the table is being created for the first time.
}
// Migrate: drop old key_unique index on rex_vtrans (was only on `key`) — replaced by key_target_connection_unique.
try {
$migSql = rex_sql::factory();
$indexes = $migSql->getArray('SHOW INDEX FROM ' . rex::getTable('vtrans') . ' WHERE Key_name = \'key_unique\'');
if (!empty($indexes)) {
$migSql->setQuery('ALTER TABLE ' . rex::getTable('vtrans') . ' DROP INDEX `key_unique`');
}
} catch (Throwable $e) {
// Migration may already be done or the table is being created for the first time.
}
// Connection configuration table.
rex_sql_table::get(rex::getTable('vtrans_connection'))
->ensurePrimaryIdColumn()
->ensureColumn(new rex_sql_column('key', 'varchar(191)', false))
->ensureColumn(new rex_sql_column('label', 'varchar(255)', false, ''))
->ensureColumn(new rex_sql_column('provider', 'varchar(100)', false))
->ensureColumn(new rex_sql_column('api_key', 'text', true))
->ensureColumn(new rex_sql_column('api_url', 'varchar(500)', false, ''))
->ensureColumn(new rex_sql_column('system_prompt', 'text', true))
->ensureColumn(new rex_sql_column('timeout', 'int(10) unsigned', false, '30'))
->ensureColumn(new rex_sql_column('max_chars', 'int(10) unsigned', true, null))
->ensureColumn(new rex_sql_column('debug', 'tinyint(1)', false, '0'))
->ensureColumn(new rex_sql_column('params', 'text', true))
->ensureColumn(new rex_sql_column('is_default', 'tinyint(1)', false, '0'))
->ensureColumn(new rex_sql_column('prio', 'int(10)', false, '0'))
->ensureColumn(new rex_sql_column('playground', 'tinyint(1)', false, '1'))
->ensureColumn(new rex_sql_column('createdate', 'datetime', false, 'CURRENT_TIMESTAMP'))
->ensureColumn(new rex_sql_column('createuser', 'varchar(255)', false, ''))
->ensureColumn(new rex_sql_column('updatedate', 'datetime', false, 'CURRENT_TIMESTAMP'))
->ensureColumn(new rex_sql_column('updateuser', 'varchar(255)', false, ''))
->ensureIndex(new rex_sql_index('key_unique', ['key'], rex_sql_index::UNIQUE))
->ensureIndex(new rex_sql_index('provider', ['provider']))
->ensureIndex(new rex_sql_index('is_default', ['is_default']))
->ensureIndex(new rex_sql_index('prio', ['prio']))
->ensure();
// Translation cache table.
rex_sql_table::get(rex::getTable('vtrans'))
->ensurePrimaryIdColumn()
->ensureColumn(new rex_sql_column('api', 'varchar(32)', true, null))
->ensureColumn(new rex_sql_column('connection', 'varchar(191)', true, null))
->ensureColumn(new rex_sql_column('key', 'varchar(191)', true, null))
->ensureColumn(new rex_sql_column('hash', 'varchar(32)', true, null))
->ensureColumn(new rex_sql_column('length', 'int(11)', true, null))
->ensureColumn(new rex_sql_column('payload_length', 'int(11)', true, null))
->ensureColumn(new rex_sql_column('source', 'varchar(8)', true, null))
->ensureColumn(new rex_sql_column('target', 'varchar(8)', true, null))
->ensureColumn(new rex_sql_column('format', "ENUM('text', 'html')", false))
->ensureColumn(new rex_sql_column('text', 'text', true, null))
->ensureColumn(new rex_sql_column('prompt', 'text', true, null))
->ensureColumn(new rex_sql_column('custom_instructions', 'text', true, null))
->ensureColumn(new rex_sql_column('translation', 'text', true, null))
->ensureColumn(new rex_sql_column('duration_ms', 'int(11)', true, null))
->ensureColumn(new rex_sql_column('data', 'text'))
->ensureColumn(new rex_sql_column('createdate', 'datetime', false, 'CURRENT_TIMESTAMP'))
->ensureColumn(new rex_sql_column('createuser', 'varchar(255)', true))
->ensureColumn(new rex_sql_column('updatedate', 'datetime', false, 'CURRENT_TIMESTAMP'))
->ensureColumn(new rex_sql_column('updateuser', 'varchar(255)', true))
->ensureIndex(new rex_sql_index('api', ['api']))
->ensureIndex(new rex_sql_index('connection', ['connection']))
->ensureIndex(new rex_sql_index('key', ['key']))
->ensureIndex(new rex_sql_index('hash', ['hash']))
->ensureIndex(new rex_sql_index('source', ['source']))
->ensureIndex(new rex_sql_index('target', ['target']))
->ensureIndex(new rex_sql_index('format', ['format']))
->ensureIndex(new rex_sql_index('key_target_connection_unique', ['key', 'target', 'connection'], rex_sql_index::UNIQUE))
->ensure();
// Ensure addon data directory exists for storing credentials or other files.
$dataDir = rex_path::addonData('vtrans');
if (!is_dir($dataDir)) {
rex_dir::create($dataDir);
}
// Initialize default model configuration for the first installation.
$config = $this->getConfig();
$models = $config['models'] ?? [];
if (!is_array($models)) {
$models = [];
}
if (!isset($models['myMemory']) || !is_array($models['myMemory'])) {
$defaultConfig = $this->getProperty('default_config');
$defaultMyMemory = is_array($defaultConfig)
&& isset($defaultConfig['models'])
&& is_array($defaultConfig['models'])
&& isset($defaultConfig['models']['myMemory'])
&& is_array($defaultConfig['models']['myMemory'])
? $defaultConfig['models']['myMemory']
: [
'api' => 'mymemory-v2',
'label' => 'MyMemory',
'apiUrl' => 'https://api.mymemory.translated.net/get',
'apiKey' => '',
'email' => '',
'debug' => false,
'timeout' => 30,
];
$models['myMemory'] = $defaultMyMemory;
$config['models'] = $models;
$this->setConfig($config);
}