17 private const VIRTUAL_DOMAIN =
'virtual-translate';
18 private const TABLE_NAME =
'translate_cache';
20 public function __construct(
21 private readonly IConnectionProvider $dbProvider,
22 private readonly JsonCodec $jsonCodec,
27 public function get(
string ...$keynames ): array {
28 $dbr = $this->dbProvider->getReplicaDatabase( self::VIRTUAL_DOMAIN );
29 $rows = $dbr->newSelectQueryBuilder()
30 ->select( [
'tc_key',
'tc_value',
'tc_exptime',
'tc_tag' ] )
31 ->from( self::TABLE_NAME )
32 ->where( [
'tc_key' => $keynames ] )
33 ->caller( __METHOD__ )
36 return $this->buildEntries( $rows );
40 public function getByTag(
string $tag ): array {
41 $dbr = $this->dbProvider->getReplicaDatabase( self::VIRTUAL_DOMAIN );
42 $rows = $dbr->newSelectQueryBuilder()
43 ->select( [
'tc_key',
'tc_value',
'tc_exptime',
'tc_tag' ] )
44 ->from( self::TABLE_NAME )
45 ->where( [
'tc_tag' => $tag ] )
46 ->caller( __METHOD__ )
49 return $this->buildEntries( $rows );
52 public function has(
string $keyname ): bool {
53 $dbr = $this->dbProvider->getReplicaDatabase( self::VIRTUAL_DOMAIN );
54 $hasRow = $dbr->newSelectQueryBuilder()
56 ->from( self::TABLE_NAME )
57 ->where( [
'tc_key' => $keyname ] )
58 ->caller( __METHOD__ )
64 public function hasEntryWithTag(
string $tag ): bool {
65 $dbr = $this->dbProvider->getReplicaDatabase( self::VIRTUAL_DOMAIN );
66 $hasRow = $dbr->newSelectQueryBuilder()
68 ->from( self::TABLE_NAME )
69 ->where( [
'tc_tag' => $tag ] )
70 ->caller( __METHOD__ )
76 public function set( PersistentCacheEntry ...$entries ): void {
77 $dbw = $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN );
79 foreach ( $entries as $entry ) {
80 $value = $this->jsonCodec->serialize( $entry->value() );
81 $dbw->newInsertQueryBuilder()
82 ->insertInto( self::TABLE_NAME )
84 'tc_key' => $entry->key(),
86 'tc_exptime' => $dbw->timestampOrNull( $entry->exptime() ),
87 'tc_tag' => $entry->tag()
89 ->onDuplicateKeyUpdate()
90 ->uniqueIndexFields( [
'tc_key' ] )
93 'tc_exptime' => $dbw->timestampOrNull( $entry->exptime() ),
94 'tc_tag' => $entry->tag()
96 ->caller( __METHOD__ )
101 public function setExpiry(
string $keyname,
int $expiryTime ): void {
102 $dbw = $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN );
103 $dbw->newUpdateQueryBuilder()
104 ->update( self::TABLE_NAME )
105 ->set( [
'tc_exptime' => $dbw->timestamp( $expiryTime ) ] )
106 ->where( [
'tc_key' => $keyname ] )
107 ->caller( __METHOD__ )
111 public function delete(
string ...$keynames ): void {
112 $dbw = $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN );
113 $dbw->newDeleteQueryBuilder()
114 ->deleteFrom( self::TABLE_NAME )
115 ->where( [
'tc_key' => $keynames ] )
116 ->caller( __METHOD__ )
120 public function deleteEntriesWithTag(
string $tag ): void {
121 $dbw = $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN );
122 $dbw->newDeleteQueryBuilder()
123 ->deleteFrom( self::TABLE_NAME )
124 ->where( [
'tc_tag' => $tag ] )
125 ->caller( __METHOD__ )
129 public function clear(): void {
130 $dbw = $this->dbProvider->getPrimaryDatabase( self::VIRTUAL_DOMAIN );
131 $dbw->newDeleteQueryBuilder()
132 ->deleteFrom( self::TABLE_NAME )
134 ->caller( __METHOD__ )
139 private function buildEntries( Iterator $rows ): array {
141 foreach ( $rows as $row ) {
142 $entries[] =
new PersistentCacheEntry(
144 $this->jsonCodec->deserialize( $row->tc_value ),
145 $row->tc_exptime ? (
int)wfTimestamp( TS_UNIX, $row->tc_exptime ) : null,