SchemaVersionUpgrade.php 14 KB

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