123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <?php
- namespace Elgg\Upgrades;
- /**
- * Helper for data directory upgrade
- *
- * @access private
- */
- class Helper2013022000 {
- const RELATIONSHIP_SUCCESS = '2013022000';
- const RELATIONSHIP_FAILURE = '2013022000_fail';
- /**
- * @var int Site GUID
- */
- protected $siteGuid;
- /**
- * @var string DB table prefix
- */
- protected $dbPrefix;
- /**
- * @param int $siteGuid Site GUID
- * @param string $dbPrefix DB table prefix
- */
- public function __construct($siteGuid, $dbPrefix) {
- $this->siteGuid = $siteGuid;
- $this->dbPrefix = $dbPrefix;
- }
- /**
- * Get elgg_get_entities() options for fetching users who need data migration
- *
- * @return array
- */
- public function getBatchOptions() {
- $relationship1 = sanitise_string(self::RELATIONSHIP_SUCCESS);
- $relationship2 = sanitise_string(self::RELATIONSHIP_FAILURE);
- // find users without either relationship
- return array(
- 'type' => 'user',
- 'callback' => '',
- 'order_by' => 'e.guid',
- 'joins' => array(
- "LEFT JOIN {$this->dbPrefix}entity_relationships er1
- ON (e.guid = er1.guid_one
- AND er1.guid_two = {$this->siteGuid}
- AND er1.relationship = '$relationship1')
- ",
- "LEFT JOIN {$this->dbPrefix}entity_relationships er2
- ON (e.guid = er2.guid_one
- AND er2.guid_two = {$this->siteGuid}
- AND er2.relationship = '$relationship2')
- ",
- ),
- 'wheres' => array("er1.guid_one IS NULL AND er2.guid_one IS NULL"),
- 'limit' => false,
- );
- }
- /**
- * Get number of users who need data migration
- *
- * @return int
- */
- public function countUnmigratedUsers() {
- $opts = $this->getBatchOptions();
- $opts['count'] = true;
- return elgg_get_entities($opts);
- }
- /**
- * Get the old directory location
- *
- * @param \stdClass $user_row
- * @return string
- */
- public function makeMatrix($user_row) {
- $time_created = date('Y/m/d', $user_row->time_created);
- return "$time_created/$user_row->guid/";
- }
- /**
- * Remove directory if all users moved out of it
- *
- * @param string $dir
- * @return bool
- */
- public function removeDirIfEmpty($dir) {
- $files = scandir($dir);
- foreach ($files as $file) {
- if ($file == '..' || $file == '.') {
- continue;
- }
- // not empty.
- if (is_file("$dir/$file")) {
- return false;
- }
- // subdir not empty
- if (is_dir("$dir/$file") && !$this->removeDirIfEmpty("$dir/$file")) {
- return false;
- }
- }
- // only contains empty subdirs
- return rmdir($dir);
- }
- /**
- * Get the base directory name as int
- *
- * @param int $guid GUID of the user
- * @return int
- */
- public function getLowerBucketBound($guid) {
- $bucket_size = \Elgg\EntityDirLocator::BUCKET_SIZE;
- if ($guid < 1) {
- return false;
- }
- return (int) max(floor($guid / $bucket_size) * $bucket_size, 1);
- }
- /**
- * Mark the user as a successful data migration
- *
- * @param int $guid
- */
- public function markSuccess($guid) {
- add_entity_relationship($guid, self::RELATIONSHIP_SUCCESS, $this->siteGuid);
- }
- /**
- * Mark the user as having failed data migration
- *
- * @param int $guid
- */
- public function markFailure($guid) {
- add_entity_relationship($guid, self::RELATIONSHIP_FAILURE, $this->siteGuid);
- }
- /**
- * Remove the records for failed migrations
- */
- public function forgetFailures() {
- $relationship = sanitise_string(self::RELATIONSHIP_FAILURE);
- _elgg_services()->db->updateData("
- DELETE FROM {$this->dbPrefix}entity_relationships
- WHERE relationship = '$relationship'
- AND guid_two = {$this->siteGuid}
- ");
- }
- /**
- * Remove the records for successful migrations
- */
- public function forgetSuccesses() {
- $relationship = sanitise_string(self::RELATIONSHIP_SUCCESS);
- _elgg_services()->db->updateData("
- DELETE FROM {$this->dbPrefix}entity_relationships
- WHERE relationship = '$relationship'
- AND guid_two = {$this->siteGuid}
- ");
- }
- /**
- * Are there any failures on record?
- *
- * @return bool
- */
- public function hasFailures() {
- $relationship = sanitise_string(self::RELATIONSHIP_FAILURE);
- $sql = "
- SELECT COUNT(*) AS cnt FROM {$this->dbPrefix}entity_relationships
- WHERE relationship = '$relationship'
- AND guid_two = {$this->siteGuid}
- ";
- $row = _elgg_services()->db->getDataRow($sql);
- return ($row->cnt > 0);
- }
- }
|