summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/utils/TranslateMetadata.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/utils/TranslateMetadata.php')
-rw-r--r--www/wiki/extensions/Translate/utils/TranslateMetadata.php120
1 files changed, 120 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/utils/TranslateMetadata.php b/www/wiki/extensions/Translate/utils/TranslateMetadata.php
new file mode 100644
index 00000000..4294ca30
--- /dev/null
+++ b/www/wiki/extensions/Translate/utils/TranslateMetadata.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Contains class which offers functionality for reading and updating Translate group
+ * related metadata
+ *
+ * @file
+ * @author Niklas Laxström
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012-2013, Niklas Laxström, Santhosh Thottingal
+ * @license GPL-2.0-or-later
+ */
+
+class TranslateMetadata {
+ /** @var array Map of (group => key => value) */
+ private static $cache = [];
+
+ /**
+ * @param string[] $groups List of translate groups
+ */
+ public static function preloadGroups( array $groups ) {
+ $missing = array_diff( $groups, array_keys( self::$cache ) );
+ if ( !$missing ) {
+ return;
+ }
+
+ self::$cache += array_fill_keys( $missing, null ); // cache negatives
+
+ $dbr = TranslateUtils::getSafeReadDB();
+ $conds = count( $groups ) <= 500 ? [ 'tmd_group' => $missing ] : [];
+ $res = $dbr->select( 'translate_metadata', '*', $conds, __METHOD__ );
+ foreach ( $res as $row ) {
+ self::$cache[$row->tmd_group][$row->tmd_key] = $row->tmd_value;
+ }
+ }
+
+ /**
+ * Get a metadata value for the given group and key.
+ * @param string $group The group name
+ * @param string $key Metadata key
+ * @return string|bool
+ */
+ public static function get( $group, $key ) {
+ self::preloadGroups( [ $group ] );
+
+ return self::$cache[$group][$key] ?? false;
+ }
+
+ /**
+ * Set a metadata value for the given group and metadata key. Updates the
+ * value if already existing.
+ * @param string $group The group id
+ * @param string $key Metadata key
+ * @param string $value Metadata value
+ */
+ public static function set( $group, $key, $value ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $data = [ 'tmd_group' => $group, 'tmd_key' => $key, 'tmd_value' => $value ];
+ if ( $value === false ) {
+ unset( $data['tmd_value'] );
+ $dbw->delete( 'translate_metadata', $data );
+ unset( self::$cache[$group][$key] );
+ } else {
+ $dbw->replace(
+ 'translate_metadata',
+ [ [ 'tmd_group', 'tmd_key' ] ],
+ $data,
+ __METHOD__
+ );
+ self::$cache[$group][$key] = $value;
+ }
+ }
+
+ /**
+ * Wrapper for getting subgroups.
+ * @param string $groupId
+ * @return string[]|bool
+ * @since 2012-05-09
+ */
+ public static function getSubgroups( $groupId ) {
+ $groups = self::get( $groupId, 'subgroups' );
+ if ( $groups !== false ) {
+ if ( strpos( $groups, '|' ) !== false ) {
+ $groups = explode( '|', $groups );
+ } else {
+ $groups = array_map( 'trim', explode( ',', $groups ) );
+ }
+
+ foreach ( $groups as $index => $id ) {
+ if ( trim( $id ) === '' ) {
+ unset( $groups[$index] );
+ }
+ }
+ }
+
+ return $groups;
+ }
+
+ /**
+ * Wrapper for setting subgroups.
+ * @param string $groupId
+ * @param array $subgroupIds
+ * @since 2012-05-09
+ */
+ public static function setSubgroups( $groupId, $subgroupIds ) {
+ $subgroups = implode( '|', $subgroupIds );
+ self::set( $groupId, 'subgroups', $subgroups );
+ }
+
+ /**
+ * Wrapper for deleting one wiki aggregate group at once.
+ * @param string $groupId
+ * @since 2012-05-09
+ */
+ public static function deleteGroup( $groupId ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $conds = [ 'tmd_group' => $groupId ];
+ $dbw->delete( 'translate_metadata', $conds );
+ self::$cache[$groupId] = null;
+ }
+}