1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
dbnode.php
См. документацию.
1<?php
3
4abstract class CAllClusterDBNode
5{
6 public function CheckFields(&$arFields, $ID)
7 {
8 global $APPLICATION;
9 $aMsg = [];
10
11 if (array_key_exists('NAME', $arFields))
12 {
13 $arFields['NAME'] = trim($arFields['NAME']);
14 }
15
16 if (array_key_exists('ACTIVE', $arFields))
17 {
18 $arFields['ACTIVE'] = $arFields['ACTIVE'] === 'Y' ? 'Y' : 'N';
19 }
20
21 if (array_key_exists('SELECTABLE', $arFields))
22 {
23 $arFields['SELECTABLE'] = $arFields['SELECTABLE'] === 'N' ? 'N' : 'Y';
24 }
25
26 if (array_key_exists('WEIGHT', $arFields))
27 {
28 $weight = intval($arFields['WEIGHT']);
29 if ($weight < 0)
30 {
31 $weight = 0;
32 }
33 elseif ($weight > 100)
34 {
35 $weight = 100;
36 }
37 $arFields['WEIGHT'] = $weight;
38 }
39
40 if (
41 (isset($arFields['ACTIVE']) && $arFields['ACTIVE'] == 'Y')
42 && $arFields['ROLE_ID'] != 'SLAVE'
43 )
44 {
45 $obCheck = new CClusterDBNodeCheck;
46 $nodeDB = $obCheck->SlaveNodeConnection(
47 $arFields['DB_HOST'],
48 $arFields['DB_NAME'],
49 $arFields['DB_LOGIN'],
50 $arFields['DB_PASSWORD'],
51 $arFields['ROLE_ID'] == 'MASTER' ? $arFields['MASTER_HOST'] : false,
52 $arFields['ROLE_ID'] == 'MASTER' ? $arFields['MASTER_PORT'] : false
53 );
54 if (is_object($nodeDB))
55 {
56 $arFields['SERVER_ID'] = intval($obCheck->GetServerVariable($nodeDB, 'server_id'));
57 }
58 else
59 {
60 if (!array_key_exists('STATUS', $arFields))
61 {
62 $arFields['STATUS'] = 'OFFLINE';
63 }
64 $aMsg[] = ['id' => '', 'text' => $nodeDB];
65 }
66 }
67
68 if (!empty($aMsg))
69 {
70 $e = new CAdminException($aMsg);
71 $APPLICATION->ThrowException($e);
72 return false;
73 }
74 return true;
75 }
76
77 abstract public static function GetUpTime($node_id);
78
79 public static function GetByID($node_id, $arVirtNode=false)
80 {
81 global $DB, $CACHE_MANAGER;
82 static $arNodes = false;
83 static $arVirtNodes = [];
84
85 //This code sets and gets virtual nodes
86 //needed to test connection just before
87 //save node credentials into db
88 if (preg_match('/^v(\d+)$/', $node_id))
89 {
90 if (is_array($arVirtNode))
91 {
92 $arVirtNodes[$node_id] = $arVirtNode;
93 return true;
94 }
95 else
96 {
97 return $arVirtNodes[$node_id];
98 }
99 }
100
101 //Normal method continues here
102 $node_id = intval($node_id);
103 if ($arNodes === false)
104 {
105 $cache_id = 'db_nodes';
106 if (
107 CACHED_b_cluster_dbnode !== false
108 && $CACHE_MANAGER->Read(CACHED_b_cluster_dbnode, $cache_id, 'b_cluster_dbnode')
109 )
110 {
111 $arNodes = $CACHE_MANAGER->Get($cache_id);
112 }
113 else
114 {
115 $arNodes = [];
116
117 $rs = $DB->Query('SELECT * FROM b_cluster_dbnode ORDER BY ID', false, '', ['fixed_connection' => true]);
118 while ($ar = $rs->Fetch())
119 {
120 $arNodes[intval($ar['ID'])] = $ar;
121 }
122
123 if (CACHED_b_cluster_dbnode !== false)
124 {
125 $CACHE_MANAGER->Set($cache_id, $arNodes);
126 }
127 }
128 }
129
130 return $arNodes[$node_id];
131 }
132
133 public function Add($arFields)
134 {
135 global $DB, $CACHE_MANAGER;
136
137 if (!$this->CheckFields($arFields, 0))
138 {
139 return false;
140 }
141
142 if (!array_key_exists('ACTIVE', $arFields))
143 {
144 $arFields['ACTIVE'] = 'Y';
145 }
146
147 $ID = $DB->Add('b_cluster_dbnode', $arFields);
148
149 if (CACHED_b_cluster_dbnode !== false)
150 {
151 $CACHE_MANAGER->CleanDir('b_cluster_dbnode');
152 }
153
154 return $ID;
155 }
156
157 public static function Delete($ID, $bStopSlave = true)
158 {
159 global $DB, $CACHE_MANAGER;
160 $ID = intval($ID);
161
162 $res = $DB->Query('select ID from b_cluster_dbnode WHERE ID=1 OR MASTER_ID = ' . $ID, false, '', ['fixed_connection' => true]);
163 if ($bStopSlave)
164 {
165 while ($ar = $res->Fetch())
166 {
167 if (!CClusterSlave::Stop($ar['ID']))
168 {
169 return false;
170 }
171 }
172 }
173
174 if ($res)
175 {
176 $res = $DB->Query('DELETE FROM b_cluster_dbnode WHERE ID = ' . $ID, false, '', ['fixed_connection' => true]);
177 }
178
179 if (CACHED_b_cluster_dbnode !== false)
180 {
181 $CACHE_MANAGER->CleanDir('b_cluster_dbnode');
182 }
183
184 return $res;
185 }
186
187 public function Update($ID, $arFields)
188 {
189 global $DB, $CACHE_MANAGER;
190 $ID = intval($ID);
191
192 if ($ID <= 0)
193 {
194 return false;
195 }
196
197 if (!$this->CheckFields($arFields, $ID))
198 {
199 return false;
200 }
201
202 unset($arFields['GROUP_ID']);
203
204 $strUpdate = $DB->PrepareUpdate('b_cluster_dbnode', $arFields);
205 if ($strUpdate <> '')
206 {
207 $strSql = '
208 UPDATE b_cluster_dbnode SET
209 ' . $strUpdate . '
210 WHERE ID = ' . $ID . '
211 ';
212 if (!$DB->Query($strSql, false, '', ['fixed_connection' => true]))
213 {
214 return false;
215 }
216 }
217
218 if (CACHED_b_cluster_dbnode !== false)
219 {
220 $CACHE_MANAGER->CleanDir('b_cluster_dbnode');
221 }
222
223 return true;
224 }
225
226 public static function SetOffline($node_id)
227 {
229
230 $rs = $DB->Query("
231 UPDATE b_cluster_dbnode SET
232 STATUS = 'OFFLINE'
233 WHERE ID = " . intval($node_id) . "
234 AND STATUS <> 'OFFLINE'
235 ", false, '', ['fixed_connection' => true]);
236 if ($rs->AffectedRowsCount() > 0)
237 {
238 if (CACHED_b_cluster_dbnode !== false)
239 {
240 $CACHE_MANAGER->CleanDir('b_cluster_dbnode');
241 }
242
243 if (!CAgent::AddAgent('CClusterDBNode::BringOnline();', 'cluster', 'N', 10))
244 {
245 $APPLICATION->ResetException();
246 }
247 }
248 }
249
250 public static function SetOnline($node_id)
251 {
252 global $DB, $CACHE_MANAGER;
253
254 $DB->Query("
255 UPDATE b_cluster_dbnode SET
256 STATUS = 'ONLINE'
257 WHERE ID = " . intval($node_id) . '
258 ', false, '', ['fixed_connection' => true]);
259
260 if (CACHED_b_cluster_dbnode !== false)
261 {
262 $CACHE_MANAGER->CleanDir('b_cluster_dbnode');
263 }
264 }
265
266 public static function BringOnline()
267 {
268 $rsOfflineNodes = CClusterDBNode::GetList([], ['=STATUS' => 'OFFLINE'], ['ID']);
269 if ($arNode = $rsOfflineNodes->Fetch())
270 {
271 ob_start();
272 $nodeDB = CDatabase::GetDBNodeConnection($arNode['ID'], true, false);
273 ob_end_clean();
274 if (is_object($nodeDB))
275 {
276 CClusterDBNode::SetOnline($arNode['ID']);
277 }
278
279 return 'CClusterDBNode::BringOnline();';
280 }
281 return '';
282 }
283
284 public static function GetList($arOrder=false, $arFilter=false, $arSelect=false)
285 {
286 global $DB;
287
288 if (!is_array($arSelect))
289 {
290 $arSelect = [];
291 }
292 if (count($arSelect) < 1)
293 {
294 $arSelect = [
295 'ID',
296 'ACTIVE',
297 'ROLE_ID',
298 'NAME',
299 'DESCRIPTION',
300 'DB_HOST',
301 'DB_NAME',
302 'DB_LOGIN',
303 'DB_PASSWORD',
304 'MASTER_ID',
305 'SERVER_ID',
306 'STATUS',
307 'WEIGHT',
308 'SELECTABLE',
309 'GROUP_ID'
310 ];
311 }
312
313 if (!is_array($arOrder))
314 {
315 $arOrder = [];
316 }
317
318 $arQueryOrder = [];
319 foreach ($arOrder as $strColumn => $strDirection)
320 {
321 $strColumn = mb_strtoupper($strColumn);
322 $strDirection = mb_strtoupper($strDirection) === 'ASC' ? 'ASC' : 'DESC';
323 switch ($strColumn)
324 {
325 case 'ID':
326 case 'NAME':
327 $arSelect[] = $strColumn;
328 $arQueryOrder[$strColumn] = $strColumn . ' ' . $strDirection;
329 break;
330 }
331 }
332
333 $arQuerySelect = [];
334 foreach ($arSelect as $strColumn)
335 {
336 $strColumn = mb_strtoupper($strColumn);
337 switch ($strColumn)
338 {
339 case 'ID':
340 case 'ACTIVE':
341 case 'ROLE_ID':
342 case 'NAME':
343 case 'DESCRIPTION':
344 case 'DB_HOST':
345 case 'DB_NAME':
346 case 'DB_LOGIN':
347 case 'DB_PASSWORD':
348 case 'MASTER_ID':
349 case 'SERVER_ID':
350 case 'STATUS':
351 case 'WEIGHT':
352 case 'SELECTABLE':
353 case 'GROUP_ID':
354 $arQuerySelect[$strColumn] = 'n.' . $strColumn;
355 break;
356 }
357 }
358 if (count($arQuerySelect) < 1)
359 {
360 $arQuerySelect = ['ID' => 'n.ID'];
361 }
362
363 $obQueryWhere = new CSQLWhere;
364 $arFields = [
365 'ID' => [
366 'TABLE_ALIAS' => 'n',
367 'FIELD_NAME' => 'n.ID',
368 'FIELD_TYPE' => 'int',
369 'JOIN' => false,
370 ],
371 'GROUP_ID' => [
372 'TABLE_ALIAS' => 'n',
373 'FIELD_NAME' => 'n.GROUP_ID',
374 'FIELD_TYPE' => 'string',
375 'JOIN' => false,
376 ],
377 'ROLE_ID' => [
378 'TABLE_ALIAS' => 'n',
379 'FIELD_NAME' => 'n.ROLE_ID',
380 'FIELD_TYPE' => 'string',
381 'JOIN' => false,
382 ],
383 'ACTIVE' => [
384 'TABLE_ALIAS' => 'n',
385 'FIELD_NAME' => 'n.ACTIVE',
386 'FIELD_TYPE' => 'string',
387 'JOIN' => false,
388 ],
389 'SERVER_ID' => [
390 'TABLE_ALIAS' => 'n',
391 'FIELD_NAME' => 'n.SERVER_ID',
392 'FIELD_TYPE' => 'int',
393 'JOIN' => false,
394 ],
395 'MASTER_ID' => [
396 'TABLE_ALIAS' => 'n',
397 'FIELD_NAME' => 'n.MASTER_ID',
398 'FIELD_TYPE' => 'int',
399 'JOIN' => false,
400 ],
401 'STATUS' => [
402 'TABLE_ALIAS' => 'n',
403 'FIELD_NAME' => 'n.STATUS',
404 'FIELD_TYPE' => 'string',
405 'JOIN' => false,
406 ],
407 'NAME' => [
408 'TABLE_ALIAS' => 'n',
409 'FIELD_NAME' => 'n.NAME',
410 'FIELD_TYPE' => 'string',
411 'JOIN' => false,
412 ],
413 ];
414 $obQueryWhere->SetFields($arFields);
415
416 if (!is_array($arFilter))
417 {
418 $arFilter = [];
419 }
420 $strQueryWhere = $obQueryWhere->GetQuery($arFilter);
421
422 $bDistinct = $obQueryWhere->bDistinctReqired;
423
424 $strSql = '
425 SELECT ' . ($bDistinct ? 'DISTINCT' : '') . '
426 ' . implode(', ', $arQuerySelect) . '
427 FROM
428 b_cluster_dbnode n
429 ' . $obQueryWhere->GetJoins() . '
430 ';
431
432 if ($strQueryWhere)
433 {
434 $strSql .= '
435 WHERE
436 ' . $strQueryWhere . '
437 ';
438 }
439
440 if (count($arQueryOrder) > 0)
441 {
442 $strSql .= '
443 ORDER BY
444 ' . implode(', ', $arQueryOrder) . '
445 ';
446 }
447
448 return $DB->Query($strSql, false, '', ['fixed_connection' => true]);
449 }
450
451 public static function getServerList()
452 {
453 global $DB;
454 $result = [];
455 $rsData = $DB->Query('
456 SELECT ID, GROUP_ID, ROLE_ID, DB_HOST
457 FROM b_cluster_dbnode
458 ORDER BY GROUP_ID IS NULL, GROUP_ID, ID
459 ');
460 while ($arData = $rsData->Fetch())
461 {
462 if ($arData['ROLE_ID'] == 'SLAVE' || $arData['ROLE_ID'] == 'MASTER')
463 {
464 $edit_url = '/bitrix/admin/cluster_slave_edit.php?lang=' . LANGUAGE_ID . '&group_id=' . $arData['GROUP_ID'] . '&ID=' . $arData['ID'];
465 }
466 elseif ($arData['ROLE_ID'] == 'MODULE')
467 {
468 $edit_url = '/bitrix/admin/cluster_dbnode_edit.php?lang=' . LANGUAGE_ID . '&ID=' . $arData['ID'];
469 }
470 else
471 {
472 $edit_url = '';
473 }
474
475 $host = '';
476 $match = [];
477 if (
478 preg_match('/\\(\\s*HOST\\s*=\\s*([^)]+)\\)/i', $arData['DB_HOST'], $match)
479 || preg_match('/^([^:]+)(:|)/', $arData['DB_HOST'], $match)
480 )
481 {
482 if ($match[1] !== 'localhost' && $match[1] !== '127.0.0.1')
483 {
484 $host = $arData['DB_HOST'];
485 }
486 }
487
488 $result[] = [
489 'ID' => $arData['ID'],
490 'GROUP_ID' => $arData['GROUP_ID'],
491 'SERVER_TYPE' => 'database',
492 'ROLE_ID' => $arData['ROLE_ID'],
493 'HOST' => $arData['DB_HOST'],
494 'DEDICATED' => $host === '' ? 'N' : 'Y',
495 'EDIT_URL' => $edit_url,
496 ];
497 }
498 return $result;
499 }
500
501 public static function GetModules($node_id)
502 {
503 global $DB;
504 static $arCache = false;
505 if ($arCache === false)
506 {
507 $arCache = [];
508 $rs = $DB->Query("SELECT * from b_option WHERE NAME='dbnode_id'", false, '', ['fixed_connection' => true]);
509 while ($ar = $rs->Fetch())
510 {
511 if (is_numeric($ar['VALUE']))
512 {
513 $arCache[intval($ar['VALUE'])][$ar['MODULE_ID']] = $ar['MODULE_ID'];
514 }
515 }
516 }
517 if (isset($arCache[$node_id]))
518 {
519 return $arCache[$node_id];
520 }
521 else
522 {
523 return [];
524 }
525 }
526
527 public static function GetModulesForSharding()
528 {
530 $arModules = [];
531
532 if ($connection->getType() === 'mysql')
533 {
534 foreach (GetModuleEvents('cluster', 'OnGetTableList', true) as $arEvent)
535 {
536 $ar = ExecuteModuleEventEx($arEvent);
537 if (is_array($ar))
538 {
539 $cur_node_id = intval(COption::GetOptionString($ar['MODULE']->MODULE_ID, 'dbnode_id'));
540 if ($cur_node_id < 1)
541 {
542 $cur_node_id = 1;
543 }
544 $cur_node_id = CClusterDBNode::GetByID($cur_node_id);
545 $ar['TITLE'] = $ar['MODULE']->MODULE_NAME . ' (' . $cur_node_id['NAME'] . ')';
546 $arModules[$ar['MODULE']->MODULE_ID] = $ar;
547 }
548 }
549 }
550
551 return $arModules;
552 }
553
554 public static function GetListForModuleInstall()
555 {
557 ['NAME' => 'ASC','ID' => 'ASC']
558 ,['=ACTIVE' => 'Y', '=ROLE_ID' => 'MODULE', '=STATUS' => 'READY']
559 ,['ID', 'NAME']
560 );
561 }
562}
$connection
Определения actionsdefinitions.php:38
global $APPLICATION
Определения include.php:80
static getConnection($name="")
Определения application.php:638
Определения dbnode.php:5
static GetModules($node_id)
Определения dbnode.php:501
CheckFields(&$arFields, $ID)
Определения dbnode.php:6
static GetUpTime($node_id)
static GetModulesForSharding()
Определения dbnode.php:527
static SetOnline($node_id)
Определения dbnode.php:250
static GetList($arOrder=false, $arFilter=false, $arSelect=false)
Определения dbnode.php:284
static SetOffline($node_id)
Определения dbnode.php:226
static BringOnline()
Определения dbnode.php:266
static Delete($ID, $bStopSlave=true)
Определения dbnode.php:157
static GetListForModuleInstall()
Определения dbnode.php:554
Add($arFields)
Определения dbnode.php:133
static getServerList()
Определения dbnode.php:451
Update($ID, $arFields)
Определения dbnode.php:187
static GetByID($node_id, $arVirtNode=false)
Определения dbnode.php:79
SlaveNodeConnection($db_host, $db_name, $db_login, $db_password, $master_host=false, $master_port=false, $master_id=1)
Определения dbnode_check.php:402
static Stop($node_id)
Определения slave.php:197
Определения sqlwhere.php:1359
global $CACHE_MANAGER
Определения clear_component_cache.php:7
$arFields
Определения dblapprove.php:5
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
$host
Определения .description.php:9
global $DB
Определения cron_frame.php:29
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$rs
Определения action.php:82
if(file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/updater.log") &&is_file($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/updater.log") &&is_readable($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/updater.log")) $rsData
Определения update_log.php:102
$arFilter
Определения user_search.php:106