18 private const TABLE_NAME =
'translate_cache';
21 private $loadBalancer;
25 public function __construct( ILoadBalancer $loadBalancer, JsonCodec $jsonCodec ) {
26 $this->loadBalancer = $loadBalancer;
27 $this->jsonCodec = $jsonCodec;
31 public function get(
string ...$keynames ): array {
32 $dbr = $this->loadBalancer->getConnection( DB_REPLICA );
33 $rows = $dbr->newSelectQueryBuilder()
34 ->select( [
'tc_key',
'tc_value',
'tc_exptime',
'tc_tag' ] )
35 ->from( self::TABLE_NAME )
36 ->where( [
'tc_key' => $keynames ] )
37 ->caller( __METHOD__ )
40 return $this->buildEntries( $rows );
44 $dbr = $this->loadBalancer->getConnection( DB_PRIMARY );
45 $rows = $dbr->newSelectQueryBuilder()
46 ->select( [
'tc_key',
'tc_value',
'tc_exptime',
'tc_tag' ] )
48 ->from( self::TABLE_NAME )
49 ->where( [
'tc_key' => $keyname ] )
50 ->caller( __METHOD__ )
53 $entries = $this->buildEntries( $rows );
54 return count( $entries ) ? $entries[0] :
null;
58 public function getByTag(
string $tag ): array {
59 $dbr = $this->loadBalancer->getConnection( DB_REPLICA );
60 $rows = $dbr->newSelectQueryBuilder()
61 ->select( [
'tc_key',
'tc_value',
'tc_exptime',
'tc_tag' ] )
62 ->from( self::TABLE_NAME )
63 ->where( [
'tc_tag' => $tag ] )
64 ->caller( __METHOD__ )
67 return $this->buildEntries( $rows );
70 public function has(
string $keyname ): bool {
71 $dbr = $this->loadBalancer->getConnection( DB_REPLICA );
72 $hasRow = $dbr->newSelectQueryBuilder()
74 ->from( self::TABLE_NAME )
75 ->where( [
'tc_key' => $keyname ] )
76 ->caller( __METHOD__ )
82 public function hasEntryWithTag(
string $tag ): bool {
83 $dbr = $this->loadBalancer->getConnection( DB_REPLICA );
84 $hasRow = $dbr->newSelectQueryBuilder()
86 ->from( self::TABLE_NAME )
87 ->where( [
'tc_tag' => $tag ] )
88 ->caller( __METHOD__ )
94 public function hasExpiredEntry(
string $keyname ): bool {
95 $dbr = $this->loadBalancer->getConnection( DB_REPLICA );
96 $row = $dbr->newSelectQueryBuilder()
97 ->select(
'tc_expired' )
98 ->from( self::TABLE_NAME )
99 ->where( [
'tc_key' => $keyname ] )
100 ->caller( __METHOD__ )
103 if ( $row ===
false ) {
107 $rows =
new ArrayIterator( [ $row ] );
108 $entry = $this->buildEntries( $rows )[0];
109 return $entry->hasExpired();
112 public function set( PersistentCacheEntry ...$entries ): void {
113 $dbw = $this->loadBalancer->getConnection( DB_PRIMARY );
115 foreach ( $entries as $entry ) {
116 $value = $this->jsonCodec->serialize( $entry->value() );
118 'tc_key' => $entry->key(),
119 'tc_value' => $value,
120 'tc_exptime' => $entry->exptime(),
121 'tc_tag' => $entry->tag()
125 'tc_value' => $value,
126 'tc_exptime' => $entry->exptime(),
127 'tc_tag' => $entry->tag()
140 public function setExpiry(
string $keyname,
int $expiryTime ): void {
141 $dbw = $this->loadBalancer->getConnection( DB_PRIMARY );
144 [
'tc_exptime' => $expiryTime ],
145 [
'tc_key' => $keyname ],
150 public function delete(
string ...$keynames ): void {
151 $dbw = $this->loadBalancer->getConnection( DB_PRIMARY );
154 [
'tc_key' => $keynames ],
159 public function deleteEntriesWithTag(
string $tag ): void {
160 $dbw = $this->loadBalancer->getConnection( DB_PRIMARY );
163 [
'tc_tag' => $tag ],
168 public function clear(): void {
169 $dbw = $this->loadBalancer->getConnection( DB_PRIMARY );
178 private function buildEntries( Iterator $rows ): array {
180 foreach ( $rows as $row ) {
181 $entries[] =
new PersistentCacheEntry(
183 $this->jsonCodec->unserialize( $row->tc_value ),
184 $row->tc_exptime ? (
int)$row->tc_exptime : null,