SchemaVersionUpgrade.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. <?php
  2. // CRM_CONFIG:
  3. // - Schema_SystemObjectFieldStorageAcl__version 3
  4. // - Schema_SystemObjectStorageAcl__version 2
  5. // - RefConfig__version 2
  6. // Instance - `CRM_INSTANCE_CONFIG`
  7. // Ref - `CRM_REF_CONFIG`
  8. // SystemObject - `CRM_#CACHE_ACL_OBJECT`
  9. // SystemObjectField - `CRM_#CACHE_ACL_OBJECT_FIELD`, `CRM_#CACHE_ACL_OBJECT_FIELD_enum`
  10. class SchemaVersionUpgrade {
  11. static $REF_DB_SCHEMA_VERSION = 2;
  12. static $SYSTEM_OBJECT_DB_SCHEMA_VERSION = 2;
  13. static $SYSTEM_OBJECT_FIELD_DB_SCHEMA_VERSION = 2;
  14. static function _getDBVersion() {
  15. return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'SchemaVersionUpgrade__version' ");
  16. }
  17. static function _updateDBVersion($version) {
  18. DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('SchemaVersionUpgrade__version', '{$version}') ");
  19. }
  20. static function upgradeSchema() {
  21. static $_DB_SCHEMA_VERSION = null;
  22. if (!$_DB_SCHEMA_VERSION) DBG::log("DBG: SchemaVersionUpgrade: Brak VERSION w static");
  23. if (!$_DB_SCHEMA_VERSION) $_DB_SCHEMA_VERSION = V::get('_DB_SCHEMA_VERSION', 0, $_SESSION, 'int');
  24. if (!$_DB_SCHEMA_VERSION) DBG::log("DBG: SchemaVersionUpgrade: Brak VERSION w sesji");
  25. if (!$_DB_SCHEMA_VERSION) $_DB_SCHEMA_VERSION = self::_getDBVersion();
  26. if (!$_DB_SCHEMA_VERSION) DBG::log("DBG: SchemaVersionUpgrade: Brak VERSION w bazie danych");
  27. if (!$_DB_SCHEMA_VERSION) {
  28. self::_fixRefConfigDatabaseSchema();
  29. self::_fixSystemObjectDatabaseSchema();
  30. self::_fixSystemObjectFieldDatabaseSchema();
  31. $_DB_SCHEMA_VERSION = 4;
  32. $_SESSION['_DB_SCHEMA_VERSION'] = 4;
  33. self::_updateDBVersion(4);
  34. }
  35. if ($_DB_SCHEMA_VERSION < 5) {
  36. self::_upgradeFrom4To5();
  37. $_DB_SCHEMA_VERSION = 5;
  38. $_SESSION['_DB_SCHEMA_VERSION'] = 5;
  39. self::_updateDBVersion(5);
  40. }
  41. // if ($_DB_SCHEMA_VERSION < 6) {
  42. // self::_upgradeFrom5To6();
  43. // $_DB_SCHEMA_VERSION = 6;
  44. // $_SESSION['_DB_SCHEMA_VERSION'] = 6;
  45. // self::_updateDBVersion(6);
  46. // }
  47. // if ($_DB_SCHEMA_VERSION < 7) {
  48. // self::_upgradeFrom6To7();
  49. // $_DB_SCHEMA_VERSION = 7;
  50. // $_SESSION['_DB_SCHEMA_VERSION'] = 7;
  51. // self::_updateDBVersion(7);
  52. // }
  53. // if ($_DB_SCHEMA_VERSION < 8) {
  54. // self::_upgradeFrom7To8();
  55. // $_DB_SCHEMA_VERSION = 8;
  56. // $_SESSION['_DB_SCHEMA_VERSION'] = 8;
  57. // self::_updateDBVersion(8);
  58. // }
  59. }
  60. static function _getRefConfigDBVersion() {
  61. return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'RefConfig__version' ");
  62. }
  63. static function _updateRefConfigDBVersion($version) {
  64. DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('RefConfig__version', '{$version}') ");
  65. }
  66. static function _fixRefConfigDatabaseSchema() {
  67. static $_REF_DB_SCHEMA_VERSION;
  68. DBG::log("_fixRefConfigDatabaseSchema \$_REF_DB_SCHEMA_VERSION({$_REF_DB_SCHEMA_VERSION})");
  69. if (!$_REF_DB_SCHEMA_VERSION) {
  70. $_REF_DB_SCHEMA_VERSION = self::_getRefConfigDBVersion();
  71. if (2 === self::$REF_DB_SCHEMA_VERSION && $_REF_DB_SCHEMA_VERSION < self::$REF_DB_SCHEMA_VERSION) {
  72. DB::getPDO()->execSql("
  73. CREATE TABLE IF NOT EXISTS `CRM_REF_CONFIG` (
  74. `ID` INT NOT NULL AUTO_INCREMENT
  75. , `ROOT_OBJECT_NS` VARCHAR(255) NOT NULL
  76. , `CHILD_NAME` VARCHAR(255) NOT NULL
  77. , `CHILD_NS` VARCHAR(255) NOT NULL
  78. , `A_STATUS` enum('WAITING', 'NORMAL', 'DELETED') NOT NULL DEFAULT 'WAITING'
  79. , `VERSION` int(11) NOT NULL DEFAULT 0
  80. , `A_LAST_ACTION_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  81. , `SOURCE` enum('table', 'view', 'backRef') NOT NULL DEFAULT 'table'
  82. , PRIMARY KEY (`ID`)
  83. ) ENGINE = MyISAM DEFAULT CHARSET=latin2;
  84. ");
  85. try { // upgrade from version 0.1
  86. DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` ADD `SOURCE` enum('table', 'view', 'backRef') not null default 'table' ");
  87. } catch (Exception $e) {
  88. DBG::log($e);
  89. }
  90. try { // upgrade from version 0.2
  91. DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` CHANGE `SOURCE` `SOURCE` enum('table', 'view', 'backRef') not null default 'table' ");
  92. } catch (Exception $e) {
  93. DBG::log($e);
  94. }
  95. DB::getPDO()->execSql("
  96. update CRM_REF_CONFIG
  97. set CHILD_NS = REPLACE(REPLACE(CHILD_NS, '__x3A__', '/'), ':', '/')
  98. where CHILD_NS = CHILD_NAME
  99. ");
  100. self::_updateRefConfigDBVersion(2);
  101. }
  102. }
  103. }
  104. static function _getSystemObjectDBVersion() {
  105. return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'Schema_SystemObjectStorageAcl__version' ");
  106. }
  107. static function _updateSystemObjectDBVersion($version) {
  108. DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('Schema_SystemObjectStorageAcl__version', '{$version}') ");
  109. }
  110. static function _fixSystemObjectDatabaseSchema() {
  111. $dbVersion = self::_getSystemObjectDBVersion();
  112. if (!$dbVersion || $dbVersion < 2) { // version is 1 - upgrade to 2
  113. DB::getPDO()->execSql("
  114. create table if not exists `CRM_#CACHE_ACL_OBJECT` (
  115. `idZasob` int(11) DEFAULT NULL,
  116. `idDatabase` int(11) NOT NULL,
  117. `namespace` varchar(255) DEFAULT '',
  118. `_rootTableName` varchar(255) DEFAULT '',
  119. `_type` varchar(255) DEFAULT '',
  120. `hasStruct` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'has structure',
  121. `isStructInstalled` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'has installed structure',
  122. `isObjectActive` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'object is active',
  123. `description` varchar(255) DEFAULT '',
  124. `primaryKey` varchar(255) DEFAULT '',
  125. `hasWriteGroupField` tinyint(1) NOT NULL DEFAULT 0,
  126. `hasReadGroupField` tinyint(1) NOT NULL DEFAULT 0,
  127. `hasOwnerField` tinyint(1) NOT NULL DEFAULT 0,
  128. UNIQUE KEY `idZasob` (idZasob),
  129. UNIQUE KEY `namespace` (namespace),
  130. KEY `isObjectActive` (isObjectActive)
  131. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  132. ");
  133. try {
  134. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT` ADD `primaryKey` VARCHAR(255) NOT NULL DEFAULT '' AFTER `description` ");
  135. } catch (Exception $e) {
  136. DBG::log($e);
  137. }
  138. try {
  139. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT` ADD `hasWriteGroupField` tinyint(1) NOT NULL DEFAULT 0 ");
  140. } catch (Exception $e) {
  141. DBG::log($e);
  142. }
  143. try {
  144. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT` ADD `hasReadGroupField` tinyint(1) NOT NULL DEFAULT 0 ");
  145. } catch (Exception $e) {
  146. DBG::log($e);
  147. }
  148. try {
  149. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT` ADD `hasOwnerField` tinyint(1) NOT NULL DEFAULT 0 ");
  150. } catch (Exception $e) {
  151. DBG::log($e);
  152. }
  153. self::fixSystemObjectCoreTablesStructInstalled();
  154. $dbVersion = 2; self::_updateSystemObjectDBVersion($dbVersion);
  155. }
  156. // self::$SYSTEM_OBJECT_DB_SCHEMA_VERSION
  157. // if ($dbVersion < 3) {
  158. // // sql ...
  159. // $dbVersion = 3; self::_updateSystemObjectDBVersion($dbVersion);
  160. // }
  161. }
  162. static function fixSystemObjectCoreTablesStructInstalled() { // Fix hasWriteGroupField, hasReadGroupField, hasOwnerField
  163. // TODO: mv to updateCache function - required after clear cache tables
  164. DB::getPDO()->execSql("
  165. CREATE TABLE IF NOT EXISTS `tmp_cache_acl_fields` (
  166. `table_name` varchar(64) NOT NULL DEFAULT '',
  167. `column_name` varchar(64) NOT NULL DEFAULT '',
  168. UNIQUE KEY `table_2` (`table_name`,`column_name`),
  169. KEY `table` (`table_name`)
  170. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  171. ");
  172. DB::getPDO()->execSql("
  173. CREATE TABLE IF NOT EXISTS `tmp_cache_acl_group_fields` (
  174. `table_name` varchar(64) NOT NULL DEFAULT '',
  175. `has_write` tinyint(1) NOT NULL DEFAULT 0,
  176. `has_read` tinyint(1) NOT NULL DEFAULT 0,
  177. `has_owner` tinyint(1) NOT NULL DEFAULT 0,
  178. UNIQUE KEY `table_name` (`table_name`)
  179. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  180. ");
  181. DB::getPDO()->execSql(" TRUNCATE TABLE `tmp_cache_acl_fields` ");
  182. DB::getPDO()->execSql(" TRUNCATE TABLE `tmp_cache_acl_group_fields` ");
  183. DB::getPDO()->execSql("
  184. insert into tmp_cache_acl_group_fields(table_name, has_write, has_read, has_owner)
  185. select c.TABLE_NAME as table_name
  186. , IF(c.COLUMN_NAME = 'A_ADM_COMPANY', 1, 0) as has_write
  187. , IF(c.COLUMN_NAME = 'A_CLASSIFIED', 1, 0) as has_read
  188. , IF(c.COLUMN_NAME = 'L_APPOITMENT_USER', 1, 0) as has_owner
  189. from information_schema.COLUMNS c
  190. where c.TABLE_SCHEMA = 'SES_USERS2'
  191. and c.COLUMN_NAME in ('A_ADM_COMPANY', 'A_CLASSIFIED', 'L_APPOITMENT_USER')
  192. ON DUPLICATE KEY UPDATE
  193. has_write = has_write + IF(c.COLUMN_NAME = 'A_ADM_COMPANY', 1, 0),
  194. has_read = has_read + IF(c.COLUMN_NAME = 'A_CLASSIFIED', 1, 0),
  195. has_owner = has_owner + IF(c.COLUMN_NAME = 'L_APPOITMENT_USER', 1, 0)
  196. ");
  197. DB::getPDO()->execSql("
  198. update `CRM_#CACHE_ACL_OBJECT` c
  199. join `tmp_cache_acl_group_fields` t on (t.table_name = c._rootTableName)
  200. set
  201. c.hasWriteGroupField = t.has_write,
  202. c.hasReadGroupField = t.has_read,
  203. c.hasOwnerField = t.has_owner
  204. ");
  205. }
  206. static function _getSystemObjectFieldDBVersion() {
  207. return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'Schema_SystemObjectFieldStorageAcl__version' ");
  208. }
  209. static function _updateSystemObjectFieldDBVersion($version) {
  210. DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('Schema_SystemObjectFieldStorageAcl__version', '{$version}') ");
  211. }
  212. static function _fixSystemObjectFieldDatabaseSchema() {
  213. $version = self::_getSystemObjectFieldDBVersion();
  214. if ($version < 2) {
  215. DBG::log("UPDATE Schema_SystemObjectFieldStorageAcl__version");
  216. DB::getPDO()->execSql("
  217. create table if not exists `CRM_#CACHE_ACL_OBJECT_FIELD` (
  218. `namespace` varchar(255) DEFAULT '',
  219. `fieldNamespace` varchar(255) DEFAULT '',
  220. `idZasob` int(11) DEFAULT NULL,
  221. `idDatabase` int(11) NOT NULL,
  222. `_rootTableName` varchar(255) DEFAULT '',
  223. `objectNamespace` varchar(255) DEFAULT '',
  224. `xsdType` varchar(255) DEFAULT '',
  225. `xsdRestrictions` varchar(1000) DEFAULT '',
  226. `appInfo` varchar(1000) DEFAULT '',
  227. `minOccurs` int(11) DEFAULT '0',
  228. `maxOccurs` varchar(11) DEFAULT '1' COMMENT '0..unbounded',
  229. `isActive` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'installed',
  230. `description` varchar(255) DEFAULT '',
  231. `isLocal` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'is in _rootTableName',
  232. `sortPrio` int(11) NOT NULL DEFAULT 0,
  233. UNIQUE KEY `idZasob` (idZasob),
  234. PRIMARY KEY (`namespace`),
  235. KEY `isActive` (isActive)
  236. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  237. ");
  238. try {
  239. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD` ADD `appInfo` VARCHAR(1000) NOT NULL DEFAULT '' AFTER `xsdRestrictions` ");
  240. } catch (Exception $e) {
  241. DBG::log($e);
  242. }
  243. try {
  244. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD` ADD `isLocal` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'is in _rootTableName' AFTER `description` ");
  245. } catch (Exception $e) {
  246. DBG::log($e);
  247. }
  248. try {
  249. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD` ADD `sortPrio` int(11) NOT NULL DEFAULT 0 AFTER `isLocal` ");
  250. DB::getPDO()->execSql("
  251. UPDATE `CRM_#CACHE_ACL_OBJECT_FIELD`
  252. SET sortPrio = idZasob
  253. WHERE idZasob > 0
  254. ");
  255. DB::getPDO()->execSql("
  256. UPDATE `CRM_#CACHE_ACL_OBJECT_FIELD` c
  257. LEFT JOIN `CRM_LISTA_ZASOBOW` z on ( z.ID = c.idZasob )
  258. SET c.sortPrio = z.SORT_PRIO
  259. WHERE c.idZasob > 0
  260. and z.ID is not null
  261. ");
  262. } catch (Exception $e) {
  263. DBG::log($e);
  264. }
  265. DB::getPDO()->execSql("
  266. create table if not exists `CRM_#CACHE_ACL_OBJECT_FIELD_enum` (
  267. `namespace` varchar(255) DEFAULT '' COMMENT 'concat obj ns / field ns / value',
  268. `fieldNamespace` varchar(255) DEFAULT '',
  269. `objectNamespace` varchar(255) DEFAULT '',
  270. `value` varchar(255) DEFAULT '',
  271. `label` varchar(255) DEFAULT '',
  272. `isActive` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'installed',
  273. `sortPrio` tinyint NOT NULL DEFAULT 0,
  274. KEY `objectNamespace` (`objectNamespace`),
  275. KEY `fieldNamespace` (`fieldNamespace`),
  276. KEY `isActive` (isActive),
  277. UNIQUE `enum_uniq_value` (`objectNamespace`, `fieldNamespace`, `value`, `isActive`)
  278. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  279. ");
  280. try {
  281. DB::getPDO()->execSql(" DELETE from `CRM_#CACHE_ACL_OBJECT_FIELD_enum` where isActive = 0 ");
  282. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD_enum` ADD UNIQUE `enum_uniq_value` (`objectNamespace`, `fieldNamespace`, `value`, `isActive`) ");
  283. } catch (Exception $e) {
  284. DBG::log($e);
  285. }
  286. try {
  287. DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD_enum` ADD `sortPrio` tinyint NOT NULL DEFAULT 0 ");
  288. } catch (Exception $e) {
  289. DBG::log($e);
  290. }
  291. self::_updateSystemObjectFieldDBVersion(self::$SYSTEM_OBJECT_FIELD_DB_SCHEMA_VERSION);
  292. }
  293. // if ($version < $SYSTEM_OBJECT_FIELD_DB_SCHEMA_VERSION) {
  294. //
  295. // }
  296. }
  297. static function _upgradeFrom4To5() {
  298. try {
  299. DB::getPDO()->execSql(" ALTER TABLE `CRM_INSTANCE_CONFIG` ADD `SOURCE` enum('table', 'view') not null default 'table' ");
  300. } catch (Exception $e) {
  301. DBG::log($e);
  302. }
  303. try {
  304. DB::getPDO()->execSql(" ALTER TABLE `CRM_INSTANCE_CONFIG` ADD `VERSION` int(11) not null default 0 ");
  305. } catch (Exception $e) {
  306. DBG::log($e);
  307. }
  308. }
  309. // static function _upgradeFrom5To6() {
  310. // }
  311. // static function _upgradeFrom6To7() {
  312. // }
  313. // static function _upgradeFrom7To8() {
  314. // }
  315. }