Test Failed
Push — trunk ( 769658...cc4c01 )
by SuperNova.WS
15:09
created

_SnCacheInternal::cache_queries_unset_all()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 2
ccs 0
cts 2
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Created by Gorlum 31.10.2017 2:04
4
 */
5
6
/**
7
 * Class _SnCacheInternal
8
 *
9
 * Внутренний кэшер отдельных записей из БД в память PHP
10
 *
11
 * @deprecated
12
 */
13
class _SnCacheInternal {
14
  public static $data = array(); // Кэш данных - юзера, планеты, юниты, очередь, альянсы итд
15
  public static $locks = array(); // Информация о блокировках
16
17
  // Массив $locator - хранит отношения между записями для быстрого доступа по тип_записи:тип_локации:ид_локации:внутренний_ид_записи=>информация
18
  // Для LOC_UNIT внутренний ИД - это SNID, а информация - это ссылка на запись `unit`
19
  // Для LOC_QUE внутренний ИД - это тип очереди, а информация - массив ссылок на `que`
20
  protected static $locator = array(); // Кэширует соответствия между расположением объектов - в частности юнитов и очередей
21
22
23
  public static function array_repack(&$array, $level = 0) {
24
    // TODO $lock_table не нужна тут
25
    if (!is_array($array)) {
26
      return;
27
    }
28
29
    foreach ($array as $key => &$value) {
30
      if ($value === null) {
31
        unset($array[$key]);
32
      } elseif ($level > 0 && is_array($value)) {
33
        _SnCacheInternal::array_repack($value, $level - 1);
34
        if (empty($value)) {
35
          unset($array[$key]);
36
        }
37
      }
38
    }
39
  }
40
41
  public static function cache_repack($location_type, $record_id = 0) {
42
    // Если есть $user_id - проверяем, а надо ли перепаковывать?
43
    if ($record_id && isset(_SnCacheInternal::$data[$location_type][$record_id]) && _SnCacheInternal::$data[$location_type][$record_id] !== null) {
44
      return;
45
    }
46
47
    _SnCacheInternal::array_repack(_SnCacheInternal::$data[$location_type]);
48
    _SnCacheInternal::array_repack(_SnCacheInternal::$locator[$location_type], 3); // TODO У каждого типа локации - своя глубина!!!! Но можно и глубже ???
49
  }
50
51
  public static function cache_clear($location_type, $hard = true) {
52
    //print("<br />CACHE CLEAR {$cache_id} " . ($hard ? 'HARD' : 'SOFT') . "<br />");
53
    if ($hard && !empty(_SnCacheInternal::$data[$location_type])) {
54
      // Здесь нельзя делать unset - надо записывать NULL, что бы это отразилось на зависимых записях
55
      array_walk(_SnCacheInternal::$data[$location_type], function (&$item) { $item = null; });
56
    }
57
    _SnCacheInternal::$locator[$location_type] = [];
58
    _SnCacheInternal::cache_repack($location_type); // Перепаковываем внутренние структуры, если нужно
59
  }
60
61
  public static function cache_lock_unset_all() {
62
    // Когда будем работать с xcache - это понадобиться, что бы снимать в xcache блокировки с записей
63
    // Пройти по массиву - снять блокировки для кэшера в памяти
64
    _SnCacheInternal::$locks = array();
65
66
    return true; // Не всегда - от результата
67
  }
68
69
  public static function cache_locator_unset_all() {
70
    _SnCacheInternal::$locator = [];
71
  }
72
73
  // TODO - this code is currently unused (!)
74
  public static function cache_get($location_type, $record_id) {
75
    return isset(_SnCacheInternal::$data[$location_type][$record_id]) ? _SnCacheInternal::$data[$location_type][$record_id] : null;
76
  }
77
78
  public static function cache_isset($location_type, $record_id) {
79
    return isset(_SnCacheInternal::$data[$location_type][$record_id]) && _SnCacheInternal::$data[$location_type][$record_id] !== null;
80
  }
81
82
  /* Кэшируем запись в соответствующий кэш
83
84
  Писать в кэш:
85
  1. Если записи не существует в кэше
86
  2. Если стоит $force_overwrite
87
  3. Если во время транзакции существующая запись не заблокирована
88
89
  Блокировать запись:
90
  1. Если идет транзакция и запись не заблокирована
91
  2. Если не стоит скип-лок
92
  */
93
  public static function cache_set($location_type, $record_id, $record, $force_overwrite = false, $skip_lock = false) {
0 ignored issues
show
Unused Code introduced by
The parameter $record_id is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

93
  public static function cache_set($location_type, /** @scrutinizer ignore-unused */ $record_id, $record, $force_overwrite = false, $skip_lock = false) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
94
    // нет идентификатора - выход
95
    if (!($record_id = $record[SN::$location_info[$location_type][P_ID]])) {
96
      return;
97
    }
98
99
    $in_transaction = SN::db_transaction_check(false);
100
    if (
101
      $force_overwrite
102
      ||
103
      // Не заменяются заблокированные записи во время транзакции
104
      ($in_transaction && !_SnCacheInternal::cache_lock_get($location_type, $record_id))
105
      ||
106
      !_SnCacheInternal::cache_isset($location_type, $record_id)
107
    ) {
108
      _SnCacheInternal::$data[$location_type][$record_id] = $record;
109
      if ($in_transaction && !$skip_lock) {
110
        _SnCacheInternal::cache_lock_set($location_type, $record_id);
111
      }
112
    }
113
  }
114
115
  // TODO - 1 вхождение
116
  public static function cache_unset($cache_id, $safe_record_id) {
117
    // $record_id должен быть проверен заранее !
118
    if (isset(_SnCacheInternal::$data[$cache_id][$safe_record_id]) && _SnCacheInternal::$data[$cache_id][$safe_record_id] !== null) {
119
      // Выставляем запись в null
120
      _SnCacheInternal::$data[$cache_id][$safe_record_id] = null;
121
      // Очищаем кэш мягко - что бы удалить очистить связанные данные - кэш локаций и кэш запоросов и всё, что потребуется впредь
122
      _SnCacheInternal::cache_clear($cache_id, false);
123
    }
124
  }
125
126
  public static function cache_lock_get($location_type, $record_id) {
127
    return isset(_SnCacheInternal::$locks[$location_type][$record_id]);
128
  }
129
130
  // TODO - 1 вхождение
131
  public static function cache_lock_set($location_type, $record_id) {
132
    return _SnCacheInternal::$locks[$location_type][$record_id] = true; // Не всегда - от результата
133
  }
134
135
  // TODO - unused
136
  public static function cache_lock_unset($location_type, $record_id) {
137
    if (isset(_SnCacheInternal::$locks[$location_type][$record_id])) {
138
      unset(_SnCacheInternal::$locks[$location_type][$record_id]);
139
    }
140
141
    return true; // Не всегда - от результата
142
  }
143
144
145
  /**
146
   * @param array      $unit
147
   * @param int|string $unit_db_id
148
   */
149
  public static function unit_linkLocatorToData($unit, $unit_db_id) {
150
    _SnCacheInternal::$locator[LOC_UNIT][$unit['unit_location_type']][$unit['unit_location_id']][$unit['unit_snid']] = &_SnCacheInternal::$data[LOC_UNIT][$unit_db_id];
151
  }
152
153
154
  /**
155
   * @param $location_type
156
   * @param $location_id
157
   *
158
   * @return bool
159
   */
160
  public static function unit_locatorIsSet($location_type, $location_id) {
161
    return isset(_SnCacheInternal::$locator[LOC_UNIT][$location_type][$location_id]);
162
  }
163
164
  /**
165
   * @param $location_type
166
   * @param $location_id
167
   *
168
   * @return bool
169
   */
170
  public static function unit_locatorIsArray($location_type, $location_id) {
171
    return is_array(_SnCacheInternal::$locator[LOC_UNIT][$location_type][$location_id]);
172
  }
173
174
  /**
175
   * @param $location_type
176
   * @param $location_id
177
   *
178
   * @return array|false
179
   */
180
  public static function unit_locatorGetAllFromLocation($location_type, $location_id) {
181
    $result = false;
182
    if (_SnCacheInternal::unit_locatorIsArray($location_type, $location_id)) {
183
      foreach (_SnCacheInternal::$locator[LOC_UNIT][$location_type][$location_id] as $key => $value) {
184
        $result[$key] = $value;
185
      }
186
    }
187
188
    return $result;
189
  }
190
191
  /**
192
   * @param $location_type
193
   * @param $location_id
194
   * @param $unit_snid
195
   *
196
   * @return array|null
197
   */
198
  public static function unit_locatorGetUnitFromLocation($location_type, $location_id, $unit_snid) {
199
    $allUnits = _SnCacheInternal::unit_locatorGetAllFromLocation($location_type, $location_id);
200
201
    return isset($allUnits[$unit_snid]) ? $allUnits[$unit_snid] : null;
202
  }
203
}
204