summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/SQLStore/EntityStore/IdCacheManager.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/SQLStore/EntityStore/IdCacheManager.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/SQLStore/EntityStore/IdCacheManager.php226
1 files changed, 226 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/SQLStore/EntityStore/IdCacheManager.php b/www/wiki/extensions/SemanticMediaWiki/src/SQLStore/EntityStore/IdCacheManager.php
new file mode 100644
index 00000000..ca02bafb
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/SQLStore/EntityStore/IdCacheManager.php
@@ -0,0 +1,226 @@
+<?php
+
+namespace SMW\SQLStore\EntityStore;
+
+use RuntimeException;
+use SMW\DIWikiPage;
+use SMW\SQLStore\SQLStore;
+
+/**
+ * @license GNU GPL v2+
+ * @since 3.0
+ *
+ * @author mwjames
+ */
+class IdCacheManager {
+
+ /**
+ * @var SQLStore
+ */
+ private $store;
+
+ /**
+ * @since 3.0
+ *
+ * @param array $caches
+ */
+ public function __construct( array $caches ) {
+ $this->caches = $caches;
+
+ if ( !isset( $this->caches['entity.id'] ) ) {
+ throw new RuntimeException( "Missing 'entity.id' instance.");
+ }
+
+ if ( !isset( $this->caches['entity.sort'] ) ) {
+ throw new RuntimeException( "Missing 'entity.sort' instance.");
+ }
+
+ if ( !isset( $this->caches['entity.lookup'] ) ) {
+ throw new RuntimeException( "Missing 'entity.lookup' instance.");
+ }
+
+ if ( !isset( $this->caches['table.hash'] ) ) {
+ throw new RuntimeException( "Missing 'table.hash' instance.");
+ }
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param string|array $args
+ *
+ * @return string
+ */
+ public static function computeSha1( $args = '' ) {
+ return sha1( json_encode( $args ) );
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param string $key
+ *
+ * @return boolean
+ */
+ public function get( $key ) {
+
+ if ( !isset( $this->caches[$key] ) ) {
+ throw new RuntimeException( "$key is unknown");
+ }
+
+ return $this->caches[$key];
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param string $hash
+ *
+ * @return boolean
+ */
+ public function hasCache( $hash ) {
+
+ if ( !is_string( $hash ) ) {
+ return false;
+ }
+
+ return $this->caches['entity.id']->contains( $hash );
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param string $title
+ * @param integer $namespace
+ * @param string $interwiki
+ * @param string $subobject
+ * @param integer $id
+ * @param string $sortkey
+ */
+ public function setCache( $title, $namespace, $interwiki, $subobject, $id, $sortkey ) {
+
+ if ( strpos( $title, ' ' ) !== false ) {
+ throw new RuntimeException( "Somebody tried to use spaces in a cache title! ($title)");
+ }
+
+ $hash = $this->computeSha1(
+ [ $title, (int)$namespace, $interwiki, $subobject ]
+ );
+
+ $this->caches['entity.id']->save( $hash, $id );
+ $this->caches['entity.sort']->save( $hash, $sortkey );
+
+ $dataItem = new DIWikiPage( $title, $namespace, $interwiki, $subobject );
+ $dataItem->setId( $id );
+ $dataItem->setSortKey( $sortkey );
+
+ $this->caches['entity.lookup']->save( $id, $dataItem );
+
+ // Speed up detection of redirects when fetching IDs
+ if ( $interwiki == SMW_SQL3_SMWREDIIW ) {
+ $this->setCache( $title, $namespace, '', $subobject, 0, '' );
+ }
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param string $title
+ * @param integer $namespace
+ * @param string $interwiki
+ * @param string $subobject
+ */
+ public function deleteCache( $title, $namespace, $interwiki, $subobject ) {
+
+ $hash = $this->computeSha1(
+ [ $title, (int)$namespace, $interwiki, $subobject ]
+ );
+
+ $this->caches['entity.id']->delete( $hash );
+ $this->caches['entity.sort']->delete( $hash );
+
+ if ( ( $id = $this->caches['entity.id']->fetch( $hash ) ) !== false ) {
+ $this->caches['entity.lookup']->delete( $id );
+ }
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param string $id
+ */
+ public function deleteCacheById( $id ) {
+
+ $dataItem = $this->caches['entity.lookup']->fetch( $id );
+
+ if ( !$dataItem instanceof DIWikiPage ) {
+ return;
+ }
+
+ $hash = $this->computeSha1(
+ [
+ $dataItem->getDBKey(),
+ (int)$dataItem->getNamespace(),
+ $dataItem->getInterwiki(),
+ $dataItem->getSubobjectName()
+ ]
+ );
+
+ $this->caches['entity.id']->delete( $hash );
+ $this->caches['entity.sort']->delete( $hash );
+ $this->caches['entity.lookup']->delete( $id );
+ }
+
+ /**
+ * Get a cached SMW ID, or false if no cache entry is found.
+ *
+ * @since 3.0
+ *
+ * @param DIWikiPage|array $args
+ *
+ * @return integer|boolean
+ */
+ public function getId( $args ) {
+
+ if ( $args instanceof DIWikiPage ) {
+ $args = [
+ $args->getDBKey(),
+ (int)$args->getNamespace(),
+ $args->getInterwiki(),
+ $args->getSubobjectName()
+ ];
+ }
+
+ $hash = $this->computeSha1( $args );
+
+ if ( ( $id = $this->caches['entity.id']->fetch( $hash ) ) !== false ) {
+ return (int)$id;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get a cached SMW sortkey, or false if no cache entry is found.
+ *
+ * @since 3.0
+ *
+ * @param string $title
+ * @param integer $namespace
+ * @param string $interwiki
+ * @param string $subobject
+ *
+ * @return string|boolean
+ */
+ public function getSort( $args ) {
+
+ $hash = $this->computeSha1( $args );
+
+ if ( ( $sort = $this->caches['entity.sort']->fetch( $hash ) ) !== false ) {
+ return $sort;
+ }
+
+ return false;
+ }
+
+}