/wicked/migration/4_wicked_single_revisions.php

https://github.com/ewandor/horde · PHP · 211 lines · 171 code · 15 blank · 25 comment · 7 complexity · 3a7e24810ba3487c1769944fb1eee84d MD5 · raw file

  1. <?php
  2. /**
  3. * Changes major.minor revisions to single revision numbers.
  4. *
  5. * Copyright 2011-2012 Horde LLC (http://www.horde.org/)
  6. *
  7. * See the enclosed file COPYING for license information (GPL). If you
  8. * did not receive this file, see http://www.horde.org/licenses/gpl.
  9. *
  10. * @author Jan Schneider <jan@horde.org>
  11. * @category Horde
  12. * @license http://www.horde.org/licenses/gpl GPL
  13. * @package Wicked
  14. */
  15. class WickedSingleRevisions extends Horde_Db_Migration_Base
  16. {
  17. private $_vfs;
  18. public function __construct(Horde_Db_Adapter $connection, $version = null)
  19. {
  20. parent::__construct($connection, $version);
  21. require_once $GLOBALS['registry']->get('fileroot', 'wicked') . '/lib/Wicked.php';
  22. $this->_vfs = $GLOBALS['injector']
  23. ->getInstance('Horde_Core_Factory_Vfs')
  24. ->create();
  25. }
  26. /**
  27. * Upgrade.
  28. */
  29. public function up()
  30. {
  31. /* Pages */
  32. $this->removePrimaryKey('wicked_history');
  33. $this->addColumn('wicked_pages', 'page_version', 'integer', array('null' => false));
  34. $this->addColumn('wicked_history', 'page_version', 'integer', array('null' => false));
  35. $id = $version = null;
  36. $query = 'UPDATE wicked_history SET page_version = ? WHERE '
  37. . 'page_id = ? AND page_majorversion = ? AND page_minorversion = ?';
  38. $pageQuery = 'UPDATE wicked_pages SET page_version = ? WHERE page_id = ?';
  39. $history = $this->select(
  40. 'SELECT page_id, page_majorversion, page_minorversion '
  41. . 'FROM wicked_history '
  42. . 'ORDER BY page_id, page_majorversion, page_minorversion');
  43. foreach ($history as $entry) {
  44. // Next page? Reset version.
  45. if ($entry['page_id'] != $id) {
  46. $version = 1;
  47. }
  48. $this->update($query,
  49. array($version,
  50. $entry['page_id'],
  51. $entry['page_majorversion'],
  52. $entry['page_minorversion']));
  53. $this->update($pageQuery, array($version + 1, $entry['page_id']));
  54. $id = $entry['page_id'];
  55. $version++;
  56. }
  57. $this->update('UPDATE wicked_pages SET page_version = 1 WHERE page_version = 0');
  58. $this->addPrimaryKey('wicked_history', array('page_id', 'page_version'));
  59. $this->removeColumn('wicked_pages', 'page_majorversion');
  60. $this->removeColumn('wicked_pages', 'page_minorversion');
  61. $this->removeColumn('wicked_history', 'page_majorversion');
  62. $this->removeColumn('wicked_history', 'page_minorversion');
  63. /* Attachments */
  64. $this->removePrimaryKey('wicked_attachment_history');
  65. $this->addColumn('wicked_attachments', 'attachment_version', 'integer', array('null' => false));
  66. $this->addColumn('wicked_attachment_history', 'attachment_version', 'integer', array('null' => false));
  67. $id = $name = $version = null;
  68. $query = 'UPDATE wicked_attachment_history SET attachment_version = ? '
  69. . 'WHERE page_id = ? AND attachment_name = ? '
  70. . 'AND attachment_majorversion = ? AND attachment_minorversion = ?';
  71. $pageQuery = 'UPDATE wicked_attachments SET attachment_version = ? '
  72. . 'WHERE page_id = ? AND attachment_name = ?';
  73. $history = $this->select(
  74. 'SELECT page_id, attachment_name, attachment_majorversion, '
  75. . 'attachment_minorversion FROM wicked_attachment_history '
  76. . 'ORDER BY page_id, attachment_name, attachment_majorversion, '
  77. . 'attachment_minorversion');
  78. foreach ($history as $entry) {
  79. // Next page? Reset version.
  80. if ($entry['page_id'] != $id ||
  81. $entry['attachment_name'] != $name) {
  82. $version = 1;
  83. }
  84. $this->_rename(
  85. $entry['page_id'],
  86. $entry['attachment_name'],
  87. $entry['attachment_majorversion'] . '.' . $entry['attachment_minorversion'],
  88. $version);
  89. $this->update($query,
  90. array($version,
  91. $entry['page_id'],
  92. $entry['attachment_name'],
  93. $entry['attachment_majorversion'],
  94. $entry['attachment_minorversion']));
  95. $this->update($pageQuery,
  96. array($version + 1,
  97. $entry['page_id'],
  98. $entry['attachment_name']));
  99. $id = $entry['page_id'];
  100. $name = $entry['attachment_name'];
  101. $version++;
  102. }
  103. $query = $this->addLimitOffset(
  104. 'SELECT attachment_version FROM wicked_attachment_history '
  105. . 'WHERE page_id = ? AND attachment_name = ? '
  106. . 'ORDER BY attachment_version DESC',
  107. array('limit' => 1));
  108. $attachments = $this->select(
  109. 'SELECT page_id, attachment_name, attachment_majorversion, '
  110. . 'attachment_minorversion FROM wicked_attachments');
  111. foreach ($attachments as $attachment) {
  112. $version = $this->selectValue(
  113. $query,
  114. array($attachment['page_id'], $attachment['attachment_name']));
  115. if ($version === false) {
  116. $version = 1;
  117. } else {
  118. $version++;
  119. }
  120. $this->_rename(
  121. $attachment['page_id'],
  122. $attachment['attachment_name'],
  123. $attachment['attachment_majorversion'] . '.' . $attachment['attachment_minorversion'],
  124. $version);
  125. }
  126. $this->update('UPDATE wicked_attachments SET attachment_version = 1 WHERE attachment_version = 0');
  127. $this->addPrimaryKey(
  128. 'wicked_attachment_history',
  129. array('page_id', 'attachment_name', 'attachment_version'));
  130. $this->removeColumn('wicked_attachments', 'attachment_majorversion');
  131. $this->removeColumn('wicked_attachments', 'attachment_minorversion');
  132. $this->removeColumn('wicked_attachment_history', 'attachment_majorversion');
  133. $this->removeColumn('wicked_attachment_history', 'attachment_minorversion');
  134. }
  135. /**
  136. * Downgrade.
  137. */
  138. public function down()
  139. {
  140. /* Pages */
  141. $this->addColumn('wicked_pages', 'page_majorversion', 'integer', array('null' => false));
  142. $this->addColumn('wicked_pages', 'page_minorversion', 'integer', array('null' => false));
  143. $this->update('UPDATE wicked_pages SET page_majorversion = page_version, page_minorversion = 0');
  144. $this->removeColumn('wicked_pages', 'page_version');
  145. $this->removePrimaryKey('wicked_history');
  146. $this->addColumn('wicked_history', 'page_majorversion', 'integer', array('null' => false));
  147. $this->addColumn('wicked_history', 'page_minorversion', 'integer', array('null' => false));
  148. $this->update('UPDATE wicked_history SET page_majorversion = page_version, page_minorversion = 0');
  149. $this->removeColumn('wicked_history', 'page_version');
  150. $this->addPrimaryKey('wicked_history', array('page_id', 'page_majorversion', 'page_minorversion'));
  151. /* Attachments */
  152. $attachments = $this->select(
  153. 'SELECT page_id, attachment_name, attachment_version '
  154. . 'FROM wicked_attachments');
  155. foreach ($attachments as $attachment) {
  156. $this->_rename(
  157. $attachment['page_id'],
  158. $attachment['attachment_name'],
  159. $attachment['attachment_version'],
  160. $attachment['attachment_version'] . '.0');
  161. }
  162. $attachments = $this->select(
  163. 'SELECT page_id, attachment_name, attachment_version '
  164. . 'FROM wicked_attachment_history');
  165. foreach ($attachments as $attachment) {
  166. $this->_rename(
  167. $attachment['page_id'],
  168. $attachment['attachment_name'],
  169. $attachment['attachment_version'],
  170. $attachment['attachment_version'] . '.0');
  171. }
  172. $this->addColumn('wicked_attachments', 'attachment_majorversion', 'integer', array('null' => false));
  173. $this->addColumn('wicked_attachments', 'attachment_minorversion', 'integer', array('null' => false));
  174. $this->update('UPDATE wicked_attachments SET attachment_majorversion = attachment_version, attachment_minorversion = 0');
  175. $this->removeColumn('wicked_attachments', 'attachment_version');
  176. $this->removePrimaryKey('wicked_attachment_history');
  177. $this->addColumn('wicked_attachment_history', 'attachment_majorversion', 'integer', array('null' => false));
  178. $this->addColumn('wicked_attachment_history', 'attachment_minorversion', 'integer', array('null' => false));
  179. $this->update('UPDATE wicked_attachment_history SET attachment_majorversion = attachment_version, attachment_minorversion = 0');
  180. $this->removeColumn('wicked_attachment_history', 'attachment_version');
  181. $this->addPrimaryKey('wicked_attachment_history', array('page_id', 'attachment_name', 'attachment_majorversion', 'attachment_minorversion'));
  182. }
  183. private function _rename($page, $name, $oldversion, $newversion)
  184. {
  185. try {
  186. $this->_vfs->rename(Wicked::VFS_ATTACH_PATH . '/' . $page,
  187. $name . ';' . $oldversion,
  188. Wicked::VFS_ATTACH_PATH . '/' . $page,
  189. $name . ';' . $newversion);
  190. } catch (Exception $e) {
  191. $this->log('Cannot rename VFS file ' . Wicked::VFS_ATTACH_PATH
  192. . '/' . $page . '/' . $name . ';' . $oldversion . ': '
  193. . $e->getMessage());
  194. }
  195. }
  196. }