Просмотр исходного кода

Merge branch 'master' of ssh://biuro.biall-net.pl:2222/plabudda/se

* 'master' of ssh://biuro.biall-net.pl:2222/plabudda/se:
  fixed RefParams
  + RefParams
  Updated RefConfig to version 5: + column REF_PARAMS
  fixed small bug in DB
a.binder 7 лет назад
Родитель
Сommit
354b7162fd
3 измененных файлов с 249 добавлено и 4 удалено
  1. 3 2
      SE/se-lib/DB.php
  2. 20 2
      SE/se-lib/RefConfig.php
  3. 226 0
      SE/se-lib/RefParams.php

+ 3 - 2
SE/se-lib/DB.php

@@ -149,14 +149,15 @@ class DB {
 
 	public static function getStorage($db = null) {
 		$pdo = self::getPDO($db);
-		switch ($pdo->getType()) {
+		$type = $pdo->getType();
+		switch ($type) {
 			case 'mysql':
 				Lib::loadClass('Core_Storage_Mysql');
 				return new Core_Storage_Mysql($pdo);
 			case 'pgsql':
 				Lib::loadClass('Core_Storage_Pgsql');
 				return new Core_Storage_Pgsql($pdo);
-			default: throw new Exception("Storage for type '{$this->_type}' not implemented");
+			default: throw new Exception("Storage for type '{$type}' not implemented");
 		}
 	}
 

+ 20 - 2
SE/se-lib/RefConfig.php

@@ -33,7 +33,7 @@ Lib::loadClass('SchemaVersionUpgrade');
 class RefConfig {
 
 	// $REF_TABLE_VERSION = 5; // TODO: add unique key to (PRIMARY_KEY, REMOTE_PRIMARY_KEY)
-	static $REF_TABLE_VERSION = 4;
+	static $REF_TABLE_VERSION = 5;
 	// $REF_TABLE_VERSION = 4; // added ref event log table - `CRM__#REF_LOG__*`
 
 	static function isActive($objectNamespace, $childTypeName) {
@@ -212,6 +212,7 @@ class RefConfig {
 			// 'VERSION' => self::$REF_TABLE_VERSION
 		]);
 		self::upgradeRefTableFrom1to2($refConfig);
+		self::upgradeRefTableFrom4to5($refConfig);
 	}
 	static function upgradeRefTableFrom1to2(Type_RefConfig $refConfig) { // TODO: rm ACL::upgradeRefConfigFrom1to2
 		if (1 == $refConfig->version) {
@@ -228,6 +229,21 @@ class RefConfig {
 		}
 		// TODO: return array_merge($refConfig, [ 'VERSION' => 2 ]);
 	}
+	static function upgradeRefTableFrom4to5(Type_RefConfig $refConfig) { // TODO: rm ACL::upgradeRefConfigFrom1to2
+		if ($refConfig->version < 5) {
+			if ('table' === $refConfig->source && 'NORMAL' == $refConfig->status) {
+				try {
+					DB::getPDO()->execSql(" ALTER TABLE `{$refConfig->tableName}` ADD `REF_PARAMS` varchar(1024) DEFAULT '' ");
+				} catch (Exception $e) {
+					DBG::log($e);
+				}
+			}
+			$affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refConfig->id, [
+				'VERSION' => 5
+			]);
+		}
+		// TODO: return array_merge($refConfig, [ 'VERSION' => 2 ]);
+	}
 
 	static function installRefTable($objectNamespace, $childTypeName, Type_Field $newField, Type_RefConfig $refConfig = null) {
 		if (!$refConfig) $refConfig = self::fetch($objectNamespace, $childTypeName);
@@ -303,6 +319,7 @@ class RefConfig {
 					, backRef.A_STATUS as A_STATUS
 					, 0 as TRANSACTION_ID
 					, {$lastActionDateField} as A_LAST_ACTION_DATE
+					, backRef.REF_PARAMS as REF_PARAMS
 			from `{$backRefTable}` backRef
 		";
 		DBG::log($sql, 'sql', "generateRefSelectSqlByBackRef");
@@ -443,7 +460,8 @@ class RefConfig {
 					, 'WAITING' as A_STATUS
 					, 0 as TRANSACTION_ID
 					, {$lastActionDateField} as A_LAST_ACTION_DATE
-			from `{$rootTableName}` root
+					, '' as REF_PARAMS
+					from `{$rootTableName}` root
 				join `{$childTableName}` child on(child.{$sqlChildFieldName} = root.{$appInfoChildFieldName})
 			where {$sqlWhereFromRestrictions}
 		";

+ 226 - 0
SE/se-lib/RefParams.php

@@ -0,0 +1,226 @@
+<?php
+
+
+/**
+ * Usage:
+ * - RefParams::addParam(124, 11, 22, 'key', 'value');
+ * - RefParams::getLastParam(124, 11, 22, 'key'); // return last inserted value
+ * - RefParams::getParams(124, 11, 22, 'key'); // return all values
+ * - RefParams::getAllParams(124, 11, 22); // return all key and values
+ * - RefParams::removeAllParams(124, 11, 22); // return all key and values
+ * 
+ * Storage operations:
+ * - only insert into `CRM_REF_PARAMS`
+ * - only insert into `CRM_REF_PARAMS__REMOVED_LOG`
+ * - delete on `CRM_REF_PARAMS` triggers insert into `CRM_REF_PARAMS__REMOVED_LOG`
+ */
+class RefParams {
+
+    static function prepareTable() {
+        DB::getPDO()->execSql("
+            CREATE TABLE IF NOT EXISTS `CRM_REF_PARAMS` (
+                `ID_REF` int(11) NOT NULL,
+				`PRIMARY_KEY` int(11) NOT NULL,
+                `REMOTE_PRIMARY_KEY` int(11) NOT NULL,
+                `PARAM_NAME` varchar(32) NOT NULL DEFAULT '',
+                `PARAM_VALUE` varchar(1024) NOT NULL DEFAULT '',
+                `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
+                `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
+				KEY `ID_REF` (`ID_REF`),
+				KEY `PRIMARY_KEY` (`PRIMARY_KEY`),
+				KEY `REMOTE_PRIMARY_KEY` (`REMOTE_PRIMARY_KEY`),
+				KEY `PARAM_NAME` (`PARAM_NAME`)
+			) ENGINE=MyISAM DEFAULT CHARSET=latin2;
+        ");
+        DB::getPDO()->execSql("
+            CREATE TABLE IF NOT EXISTS `CRM_REF_PARAMS__REMOVED_LOG` (
+                `ID` int(11) NOT NULL AUTO_INCREMENT,
+                `A_RECORD_REMOVE_DATE` datetime DEFAULT NULL,
+                `A_RECORD_REMOVE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
+                `ID_REF` int(11) NOT NULL,
+				`PRIMARY_KEY` int(11) NOT NULL,
+                `REMOTE_PRIMARY_KEY` int(11) NOT NULL,
+                `PARAM_NAME` varchar(32) NOT NULL DEFAULT '',
+                `PARAM_VALUE` varchar(1024) NOT NULL DEFAULT '',
+                `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
+                `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
+				PRIMARY KEY (`ID`),
+				KEY `ID_REF` (`ID_REF`),
+				KEY `PRIMARY_KEY` (`PRIMARY_KEY`),
+				KEY `REMOTE_PRIMARY_KEY` (`REMOTE_PRIMARY_KEY`),
+				KEY `PARAM_NAME` (`PARAM_NAME`)
+			) ENGINE=MyISAM DEFAULT CHARSET=latin2;
+        ");
+    }
+
+    static function addParam($idRef, $pk, $remotePk, $name, $value) {
+        self::validateBaseArgs($idRef, $pk, $remotePk);
+        if (!$name) throw new Exception("Wrong ref param name");
+        DB::getPDO()->insert("CRM_REF_PARAMS", [
+            'ID_REF' => $idRef,
+            'PRIMARY_KEY' => $pk,
+            'REMOTE_PRIMARY_KEY' => $remotePk,
+            'PARAM_NAME' => $name,
+            'PARAM_VALUE' => $value,
+            'A_RECORD_CREATE_DATE' => "NOW()",
+            'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
+        ]);
+    }
+
+    static function getLastParam($idRef, $pk, $remotePk, $name) { // @return value
+        self::validateBaseArgs($idRef, $pk, $remotePk);
+        return DB::getPDO()->fetchValue("
+            select rp.PARAM_VALUE
+            from `CRM_REF_PARAMS` rp
+            where rp.ID_REF = :id_ref
+                and rp.PRIMARY_KEY = :pk
+                and rp.REMOTE_PRIMARY_KEY = :remote_pk
+                and rp.PARAM_NAME = :name
+            order by rp.A_RECORD_CREATE_DATE DESC
+            limit 1
+        ", [
+            ':id_ref' => $idRef,
+            ':pk' => $pk,
+            ':remote_pk' => $remotePk,
+            ':name' => $name,
+        ]);
+    }
+
+    static function getParams($idRef, $pk, $remotePk, $name) { // @return array of values
+        self::validateBaseArgs($idRef, $pk, $remotePk);
+        if (!$name) throw new Exception("Wrong ref param name");
+        return DB::getPDO()->fetchAll("
+            select rp.*
+            from `CRM_REF_PARAMS` rp
+            where rp.ID_REF = :id_ref
+                and rp.PRIMARY_KEY = :pk
+                and rp.REMOTE_PRIMARY_KEY = :remote_pk
+            order by rp.A_RECORD_CREATE_DATE DESC
+        --    limit 1
+        ", [
+            ':id_ref' => $idRef,
+            ':pk' => $pk,
+            ':remote_pk' => $remotePk,
+        ]);
+    }
+
+    static function getAllParams($idRef, $pk, $remotePk) { // @return array
+        self::validateBaseArgs($idRef, $pk, $remotePk);
+        return DB::getPDO()->fetchAll("
+            select rp.*
+            from `CRM_REF_PARAMS` rp
+            where rp.ID_REF = :id_ref
+                and rp.PRIMARY_KEY = :pk
+                and rp.REMOTE_PRIMARY_KEY = :remote_pk
+            order by rp.A_RECORD_CREATE_DATE DESC
+        ", [
+            ':id_ref' => $idRef,
+            ':pk' => $pk,
+            ':remote_pk' => $remotePk,
+        ]);
+    }
+
+    static function removeParams($idRef, $pk, $remotePk, $name) {
+        self::validateBaseArgs($idRef, $pk, $remotePk);
+        if (!$name) throw new Exception("Wrong ref param name");
+        DB::getPDO()->execSql("
+            insert into `CRM_REF_PARAMS__REMOVED_LOG` (
+                `A_RECORD_REMOVE_DATE`,
+                `A_RECORD_REMOVE_AUTHOR`,
+                `ID_REF`,
+				`PRIMARY_KEY`,
+                `REMOTE_PRIMARY_KEY`,
+                `PARAM_NAME`,
+                `PARAM_VALUE`,
+                `A_RECORD_CREATE_DATE`,
+                `A_RECORD_CREATE_AUTHOR`
+            )
+            select 
+                NOW() as `A_RECORD_REMOVE_DATE`,
+                :user as `A_RECORD_REMOVE_AUTHOR`,
+                rp.`ID_REF`,
+				rp.`PRIMARY_KEY`,
+                rp.`REMOTE_PRIMARY_KEY`,
+                rp.`PARAM_NAME`,
+                rp.`PARAM_VALUE`,
+                rp.`A_RECORD_CREATE_DATE`,
+                rp.`A_RECORD_CREATE_AUTHOR`
+            from `CRM_REF_PARAMS` rp
+            where rp.`ID_REF` = :id_ref
+                and rp.`PRIMARY_KEY` = :pk
+                and rp.`REMOTE_PRIMARY_KEY` = :remote_pk
+                and rp.`PARAM_NAME` = :name
+        ", [
+            ':user' => User::getLogin(),
+            ':id_ref' => $idRef,
+            ':pk' => $pk,
+            ':remote_pk' => $remotePk,
+            ':name' => $name,
+        ]);
+        DB::getPDO()->execSql("
+            DELETE FROM `CRM_REF_PARAMS`
+            where `ID_REF` = :id_ref
+                and `PRIMARY_KEY` = :pk
+                and `REMOTE_PRIMARY_KEY` = :remote_pk
+                and `PARAM_NAME` = :name
+        ", [
+            ':id_ref' => $idRef,
+            ':pk' => $pk,
+            ':remote_pk' => $remotePk,
+            ':name' => $name,
+        ]);
+    }
+
+    static function removeAllParams($idRef, $pk, $remotePk) {
+        self::validateBaseArgs($idRef, $pk, $remotePk);
+        DB::getPDO()->execSql("
+            insert into `CRM_REF_PARAMS__REMOVED_LOG` (
+                `A_RECORD_REMOVE_DATE`,
+                `A_RECORD_REMOVE_AUTHOR`,
+                `ID_REF`,
+				`PRIMARY_KEY`,
+                `REMOTE_PRIMARY_KEY`,
+                `PARAM_NAME`,
+                `PARAM_VALUE`,
+                `A_RECORD_CREATE_DATE`,
+                `A_RECORD_CREATE_AUTHOR`
+            )
+            select 
+                NOW() as `A_RECORD_REMOVE_DATE`,
+                :user as `A_RECORD_REMOVE_AUTHOR`,
+                rp.`ID_REF`,
+				rp.`PRIMARY_KEY`,
+                rp.`REMOTE_PRIMARY_KEY`,
+                rp.`PARAM_NAME`,
+                rp.`PARAM_VALUE`,
+                rp.`A_RECORD_CREATE_DATE`,
+                rp.`A_RECORD_CREATE_AUTHOR`
+            from `CRM_REF_PARAMS` rp
+            where rp.`ID_REF` = :id_ref
+                and rp.`PRIMARY_KEY` = :pk
+                and rp.`REMOTE_PRIMARY_KEY` = :remote_pk
+        ", [
+            ':user' => User::getLogin(),
+            ':id_ref' => $idRef,
+            ':pk' => $pk,
+            ':remote_pk' => $remotePk,
+        ]);
+        DB::getPDO()->execSql("
+            DELETE FROM `CRM_REF_PARAMS`
+            where `ID_REF` = :id_ref
+                and `PRIMARY_KEY` = :pk
+                and `REMOTE_PRIMARY_KEY` = :remote_pk
+        ", [
+            ':id_ref' => $idRef,
+            ':pk' => $pk,
+            ':remote_pk' => $remotePk,
+        ]);
+    }
+
+    static function validateBaseArgs($idRef, $pk, $remotePk) {
+        if ((int)$idRef <= 0) throw new Exception("Wrong ID Ref");
+        if ((int)$pk <= 0) throw new Exception("Wrong Primary Key");
+        if ((int)$remotePk <= 0) throw new Exception("Wrong Remote Primary Key");
+    }
+
+}