Esempio n. 1
0
        /// <summary>
        /// 延长锁的时间
        /// </summary>
        /// <param name="lockData"></param>
        /// <returns></returns>
        public SCCheckLockResult ExtendLockTime(SCLock lockData)
        {
            SCCheckLockResult result = null;

            lockData.LockTime = DateTime.MinValue;

            using (TransactionScope scope = TransactionScopeFactory.Create())
            {
                bool updated = false;

                SCLock lockInDB = lockInDB = Update(lockData, true, out updated);

                if (updated == false)
                {
                    result = BuildNotAvailableResult(lockData);
                }
                else
                {
                    result = BuildAvailableResult(lockInDB, true);
                }

                scope.Complete();
            }

            return(result);
        }
Esempio n. 2
0
        private static string PrepareUpdateData(SCLock lockData, bool forceOverride)
        {
            ORMappingItemCollection mappingInfo = GetMappingInfo();

            UpdateSqlClauseBuilder uBuilder = ORMapping.GetUpdateSqlClauseBuilder(lockData, mappingInfo);
            WhereSqlClauseBuilder  wBuilder = ORMapping.GetWhereSqlClauseBuilderByPrimaryKey(lockData, mappingInfo);

            if (forceOverride == false)
            {
                wBuilder.AppendItem("LockTime", "DATEADD(SECOND, -EffectiveTime, GETUTCDATE())", "<", true);
            }

            StringBuilder sql = new StringBuilder();

            sql.AppendFormat("UPDATE {0} SET {1} WHERE {2}",
                             mappingInfo.TableName,
                             uBuilder.ToSqlString(TSqlBuilder.Instance),
                             wBuilder.ToSqlString(TSqlBuilder.Instance));

            sql.Append(TSqlBuilder.Instance.DBStatementSeperator);

            sql.Append("SELECT @@ROWCOUNT");

            sql.Append(TSqlBuilder.Instance.DBStatementSeperator);

            sql.AppendFormat("SELECT * FROM {0} WHERE LockID = {1}",
                             GetMappingInfo().TableName,
                             TSqlBuilder.Instance.CheckUnicodeQuotationMark(lockData.LockID));

            return(sql.ToString());
        }
Esempio n. 3
0
		/// <summary>
		/// 加锁。返回新加的锁,或者原来锁的状态。成功与否,检查SCCheckLockResult的Available属性
		/// </summary>
		/// <param name="lockData"></param>
		/// <returns></returns>
		public SCCheckLockResult AddLock(SCLock lockData)
		{
			SCCheckLockResult result = null;
			lockData.LockTime = DateTime.MinValue;

			using (TransactionScope scope = TransactionScopeFactory.Create())
			{
				//插入是否成功,判断锁是否已经存在
				SCLock lockInDB = Insert(lockData);

				if (lockInDB == null)
				{
					//更新是否成功,如果不成功,表示锁被占用。
					bool updated = false;

					lockInDB = Update(lockData, false, out updated);

					if (updated == false)
						result = BuildNotAvailableResult(lockInDB);
					else
						result = BuildAvailableResult(lockInDB, true);
				}
				else
					result = BuildAvailableResult(lockInDB, false);

				scope.Complete();
			}

			return result;
		}
Esempio n. 4
0
        private static SCLock Insert(SCLock lockData)
        {
            StringBuilder sql = new StringBuilder();

            sql.Append(ORMapping.GetInsertSql(lockData, TSqlBuilder.Instance));
            sql.Append(TSqlBuilder.Instance.DBStatementSeperator);
            sql.AppendFormat("SELECT * FROM {0} WHERE LockID = {1}",
                             GetMappingInfo().TableName,
                             TSqlBuilder.Instance.CheckUnicodeQuotationMark(lockData.LockID));

            SCLock result = null;

            try
            {
                DataTable table = DbHelper.RunSqlReturnDS(sql.ToString(), GetConnectionName()).Tables[0];

                result = new SCLock();

                ORMapping.DataRowToObject(table.Rows[0], GetMappingInfo(), result);
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                if (ex.Number != 2627)
                {
                    throw;
                }
            }

            return(result);
        }
		private void Unlock()
		{
			if (this.synchronizeLock != null)
			{
				SCLockAdapter.Instance.DeleteLock(this.synchronizeLock);
				this.synchronizeLock = null;
				this.lastExtendLockTime = DateTime.MinValue;
			}
		}
Esempio n. 6
0
        private static SCCheckLockResult BuildNotAvailableResult(SCLock lockData)
        {
            SCCheckLockResult result = new SCCheckLockResult();

            result.Lock       = lockData;
            result.LockStatus = SCCheckLockStatus.Locked;

            return(result);
        }
Esempio n. 7
0
		public void AddNewLockTest()
		{
			SCLock lockData = new SCLock();
			lockData.LockID = UuidHelper.NewUuidString();

			SCCheckLockResult result = SCLockAdapter.Instance.AddLock(lockData);

			Assert.IsTrue(result.Available);
			Assert.IsTrue(result.Lock.LockTime > DateTime.MinValue);
		}
        /// <summary>
        /// 删除锁
        /// </summary>
        public void DeleteLock()
        {
            SCLock lockData = this._Lock;

            if (lockData == null)
            {
                lockData = SCLock.CreateDefaultDataOperationLock();
            }

            SCLockAdapter.Instance.DeleteLock(lockData);
            this._Lock = null;
        }
Esempio n. 9
0
		public void AddExistedNewLockTest()
		{
			SCLock lockData = new SCLock();
			lockData.LockID = UuidHelper.NewUuidString();

			SCCheckLockResult result = SCLockAdapter.Instance.AddLock(lockData);

			//重复加锁
			result = SCLockAdapter.Instance.AddLock(lockData);

			Assert.IsFalse(result.Available);
			Assert.AreEqual(SCCheckLockStatus.Locked, result.LockStatus);
		}
        /// <summary>
        /// 延长锁的时间
        /// </summary>
        public void ExtendLock()
        {
            SCLock lockData = this._Lock;

            if (lockData == null)
            {
                lockData = SCLock.CreateDefaultDataOperationLock();
            }

            SCCheckLockResult checkResult = SCLockAdapter.Instance.ExtendLockTime(lockData);

            this._Lock = checkResult.Lock;
        }
Esempio n. 11
0
        public static SCLock CreateDefaultDataOperationLock()
        {
            SCLock result = new SCLock();

            result.LockID   = DefaultDataOperationLockID;
            result.LockType = SCLockType.DataOperation;

            if (DeluxePrincipal.IsAuthenticated)
            {
                result.LockPerson = DeluxeIdentity.CurrentUser;
            }

            return(result);
        }
Esempio n. 12
0
        private static SCLock Update(SCLock lockData, bool forceOverride, out bool updated)
        {
            DataSet ds = DbHelper.RunSqlReturnDS(PrepareUpdateData(lockData, forceOverride), GetConnectionName());

            (ds.Tables[1].Rows.Count > 0).FalseThrow("不能找到ID为{0}的锁信息", lockData.LockID);

            updated = (int)ds.Tables[0].Rows[0][0] > 0;

            SCLock result = new SCLock();

            ORMapping.DataRowToObject(ds.Tables[1].Rows[0], GetMappingInfo(), result);

            return(result);
        }
		private void Lock()
		{
			SCLock syncLock = new SCLock() { LockID = SynchronizationLockID, LockType = SCLockType.DataOperation };

			syncLock.EffectiveTime = SynchronizationEffectiveTime;
			syncLock.Description = "AD反向同步到权限中心";

			SCCheckLockResult checkResult = SCLockAdapter.Instance.AddLock(syncLock);

			if (checkResult.Available == false)
				throw new SCCheckLockException(SCCheckLockException.CheckLockResultToMessage(checkResult));

			this.synchronizeLock = syncLock;
			this.lastExtendLockTime = DateTime.Now;
		}
Esempio n. 14
0
        private static SCLock GetLockInfo(string lockID)
        {
            string sql = string.Format("SELECT * FROM {0} WHERE LockID = {1}",
                                       GetMappingInfo().TableName, TSqlBuilder.Instance.CheckUnicodeQuotationMark(lockID));

            DataTable table = DbHelper.RunSqlReturnDS(sql, GetConnectionName()).Tables[0];

            (table.Rows.Count > 0).FalseThrow("不能根据\"{0}\"找到对应的锁信息", lockID);

            SCLock result = new SCLock();

            ORMapping.DataRowToObject(table.Rows[0], GetMappingInfo(), result);

            return(result);
        }
        public void AddLock(TimeSpan effectiveTime, string description)
        {
            SCLock lockData = SCLock.CreateDefaultDataOperationLock();

            lockData.EffectiveTime = effectiveTime;
            lockData.Description   = description;

            SCCheckLockResult checkResult = SCLockAdapter.Instance.AddLock(lockData);

            if (checkResult.Available == false)
            {
                throw new SCCheckLockException(SCCheckLockException.CheckLockResultToMessage(checkResult));
            }

            this._Lock = checkResult.Lock;
        }
Esempio n. 16
0
		public void AddExistedExpiredNewLockTest()
		{
			SCLock lockData = new SCLock();
			lockData.EffectiveTime = TimeSpan.FromSeconds(1);
			lockData.LockID = UuidHelper.NewUuidString();

			SCCheckLockResult result = SCLockAdapter.Instance.AddLock(lockData);

			Thread.Sleep(1100);

			//重复加锁
			result = SCLockAdapter.Instance.AddLock(lockData);

			Assert.IsTrue(result.Available);
			Assert.AreEqual(SCCheckLockStatus.LockExpired, result.LockStatus);
			Assert.IsTrue(result.Lock.LockTime > DateTime.MinValue);
		}
Esempio n. 17
0
		public void ExtendExistedLockTest()
		{
			SCLock lockData = new SCLock();
			lockData.LockID = UuidHelper.NewUuidString();

			SCCheckLockResult result = SCLockAdapter.Instance.AddLock(lockData);
			
			Thread.Sleep(500);

			//延长
			SCCheckLockResult extendedResult = SCLockAdapter.Instance.ExtendLockTime(lockData);

			Assert.IsTrue(extendedResult.Lock.LockTime > result.Lock.LockTime);

			Console.WriteLine("Original time: {0:yyyy-MM-dd HH:mm:ss.ffff}, extended time: {1:yyyy-MM-dd HH:mm:ss.ffff}",
				result.Lock.LockTime, extendedResult.Lock.LockTime);
		}
Esempio n. 18
0
        private static SCCheckLockResult BuildAvailableResult(SCLock lockData, bool overrideLock)
        {
            SCCheckLockResult result = new SCCheckLockResult();

            result.Lock = lockData;

            if (overrideLock)
            {
                result.LockStatus = SCCheckLockStatus.LockExpired;
            }
            else
            {
                result.LockStatus = SCCheckLockStatus.NotLocked;
            }

            return(result);
        }
Esempio n. 19
0
		/// <summary>
		/// 延长锁的时间
		/// </summary>
		/// <param name="lockData"></param>
		/// <returns></returns>
		public SCCheckLockResult ExtendLockTime(SCLock lockData)
		{
			SCCheckLockResult result = null;
			lockData.LockTime = DateTime.MinValue;

			using (TransactionScope scope = TransactionScopeFactory.Create())
			{
				bool updated = false;

				SCLock lockInDB = lockInDB = Update(lockData, true, out updated);

				if (updated == false)
					result = BuildNotAvailableResult(lockData);
				else
					result = BuildAvailableResult(lockInDB, true);

				scope.Complete();
			}

			return result;
		}
Esempio n. 20
0
        /// <summary>
        /// 加锁。返回新加的锁,或者原来锁的状态。成功与否,检查SCCheckLockResult的Available属性
        /// </summary>
        /// <param name="lockData"></param>
        /// <returns></returns>
        public SCCheckLockResult AddLock(SCLock lockData)
        {
            SCCheckLockResult result = null;

            lockData.LockTime = DateTime.MinValue;

            using (TransactionScope scope = TransactionScopeFactory.Create())
            {
                //插入是否成功,判断锁是否已经存在
                SCLock lockInDB = Insert(lockData);

                if (lockInDB == null)
                {
                    //更新是否成功,如果不成功,表示锁被占用。
                    bool updated = false;

                    lockInDB = Update(lockData, false, out updated);

                    if (updated == false)
                    {
                        result = BuildNotAvailableResult(lockInDB);
                    }
                    else
                    {
                        result = BuildAvailableResult(lockInDB, true);
                    }
                }
                else
                {
                    result = BuildAvailableResult(lockInDB, false);
                }

                scope.Complete();
            }

            return(result);
        }
		public void AddLock(TimeSpan effectiveTime, string description)
		{
			SCLock lockData = SCLock.CreateDefaultDataOperationLock();
			lockData.EffectiveTime = effectiveTime;
			lockData.Description = description;

			SCCheckLockResult checkResult = SCLockAdapter.Instance.AddLock(lockData);

			if (checkResult.Available == false)
				throw new SCCheckLockException(SCCheckLockException.CheckLockResultToMessage(checkResult));

			this._Lock = checkResult.Lock;
		}
Esempio n. 22
0
		private static SCLock Insert(SCLock lockData)
		{
			StringBuilder sql = new StringBuilder();

			sql.Append(ORMapping.GetInsertSql(lockData, TSqlBuilder.Instance));
			sql.Append(TSqlBuilder.Instance.DBStatementSeperator);
			sql.AppendFormat("SELECT * FROM {0} WHERE LockID = {1}",
				GetMappingInfo().TableName,
				TSqlBuilder.Instance.CheckUnicodeQuotationMark(lockData.LockID));

			SCLock result = null;

			try
			{
				DataTable table = DbHelper.RunSqlReturnDS(sql.ToString(), GetConnectionName()).Tables[0];

				result = new SCLock();

				ORMapping.DataRowToObject(table.Rows[0], GetMappingInfo(), result);
			}
			catch (System.Data.SqlClient.SqlException ex)
			{
				if (ex.Number != 2627)
					throw;
			}

			return result;
		}
Esempio n. 23
0
		private static string PrepareUpdateData(SCLock lockData, bool forceOverride)
		{
			ORMappingItemCollection mappingInfo = GetMappingInfo();

			UpdateSqlClauseBuilder uBuilder = ORMapping.GetUpdateSqlClauseBuilder(lockData, mappingInfo);
			WhereSqlClauseBuilder wBuilder = ORMapping.GetWhereSqlClauseBuilderByPrimaryKey(lockData, mappingInfo);

			if (forceOverride == false)
				wBuilder.AppendItem("LockTime", "DATEADD(SECOND, -EffectiveTime, GETDATE())", "<", true);

			StringBuilder sql = new StringBuilder();

			sql.AppendFormat("UPDATE {0} SET {1} WHERE {2}",
				mappingInfo.TableName,
				uBuilder.ToSqlString(TSqlBuilder.Instance),
				wBuilder.ToSqlString(TSqlBuilder.Instance));

			sql.Append(TSqlBuilder.Instance.DBStatementSeperator);

			sql.Append("SELECT @@ROWCOUNT");

			sql.Append(TSqlBuilder.Instance.DBStatementSeperator);

			sql.AppendFormat("SELECT * FROM {0} WHERE LockID = {1}",
				GetMappingInfo().TableName,
				TSqlBuilder.Instance.CheckUnicodeQuotationMark(lockData.LockID));

			return sql.ToString();
		}
Esempio n. 24
0
		private static SCLock Update(SCLock lockData, bool forceOverride, out bool updated)
		{
			DataSet ds = DbHelper.RunSqlReturnDS(PrepareUpdateData(lockData, forceOverride), GetConnectionName());

			(ds.Tables[1].Rows.Count > 0).FalseThrow("不能找到ID为{0}的锁信息", lockData.LockID);

			updated = (int)ds.Tables[0].Rows[0][0] > 0;

			SCLock result = new SCLock();

			ORMapping.DataRowToObject(ds.Tables[1].Rows[0], GetMappingInfo(), result);

			return result;
		}
Esempio n. 25
0
		private static SCLock GetLockInfo(string lockID)
		{
			string sql = string.Format("SELECT * FROM {0} WHERE LockID = {1}",
				GetMappingInfo().TableName, TSqlBuilder.Instance.CheckUnicodeQuotationMark(lockID));

			DataTable table = DbHelper.RunSqlReturnDS(sql, GetConnectionName()).Tables[0];

			(table.Rows.Count > 0).FalseThrow("不能根据\"{0}\"找到对应的锁信息", lockID);

			SCLock result = new SCLock();

			ORMapping.DataRowToObject(table.Rows[0], GetMappingInfo(), result);

			return result;
		}
Esempio n. 26
0
		private static SCCheckLockResult BuildAvailableResult(SCLock lockData, bool overrideLock)
		{
			SCCheckLockResult result = new SCCheckLockResult();

			result.Lock = lockData;

			if (overrideLock)
				result.LockStatus = SCCheckLockStatus.LockExpired;
			else
				result.LockStatus = SCCheckLockStatus.NotLocked;

			return result;
		}
Esempio n. 27
0
		private static SCCheckLockResult BuildNotAvailableResult(SCLock lockData)
		{
			SCCheckLockResult result = new SCCheckLockResult();

			result.Lock = lockData;
			result.LockStatus = SCCheckLockStatus.Locked;

			return result;
		}
Esempio n. 28
0
        public void DeleteLock(SCLock lockData)
        {
            lockData.NullCheck("lockData");

            DeleteLock(lockData.LockID);
        }
		/// <summary>
		/// 延长锁的时间
		/// </summary>
		public void ExtendLock()
		{
			SCLock lockData = this._Lock;

			if (lockData == null)
				lockData = SCLock.CreateDefaultDataOperationLock();

			SCCheckLockResult checkResult = SCLockAdapter.Instance.ExtendLockTime(lockData);

			this._Lock = checkResult.Lock;
		}
		/// <summary>
		/// 删除锁
		/// </summary>
		public void DeleteLock()
		{
			SCLock lockData = this._Lock;

			if (lockData == null)
				lockData = SCLock.CreateDefaultDataOperationLock();

			SCLockAdapter.Instance.DeleteLock(lockData);
			this._Lock = null;
		}
Esempio n. 31
0
		public void DeleteLock(SCLock lockData)
		{
			lockData.NullCheck("lockData");

			DeleteLock(lockData.LockID);
		}
Esempio n. 32
0
		public static SCLock CreateDefaultDataOperationLock()
		{
			SCLock result = new SCLock();

			result.LockID = DefaultDataOperationLockID;
			result.LockType = SCLockType.DataOperation;

			if (DeluxePrincipal.IsAuthenticated)
				result.LockPerson = DeluxeIdentity.CurrentUser;

			return result;
		}
		public void DeleteLock()
		{
			if (this._SynchronizeLock != null)
			{
				SCLockAdapter.Instance.DeleteLock(this._SynchronizeLock);
				this._SynchronizeLock = null;
				this._LastExtendLockTime = DateTime.MinValue;
			}
		}