Exemplo n.º 1
0
        protected override object readPrivileges(object key, object value)
        {
            XStorageConnection con = (XStorageConnection)value;
            XDbCommand         cmd;
            int privileges = 0;                         // маска привелегий

            // зачитаем из БД привилегии пользователя и ролей пользователя для заданной и всех вышестоящих папок (условие на LIndex/RIndex с "равно")
            cmd             = con.CreateCommand();
            cmd.CommandText =
                @"SELECT f_i.ObjectID as FolderID, pp.Privileges, roles.Privileges AS RolePrivileges 
					FROM Folder f 
						JOIN Folder f_i ON f_i.LIndex <= f.LIndex AND f_i.RIndex >= f.RIndex AND f_i.Customer = f.Customer
							JOIN ProjectParticipant pp ON pp.Folder = f_i.ObjectID
							LEFT JOIN (ProjectParticipant_Roles pp_r 
								JOIN UserRoleInProject roles ON pp_r.Value = roles.ObjectID) ON pp.ObjectID = pp_r.ObjectID
					WHERE f.ObjectID = @FolderID AND pp.Employee = @EmployeeID
					ORDER BY f_i.LRLevel DESC
					"                    ;
            Guid EmployeeID;
            Guid FolderID;

            upackKey((string)key, out EmployeeID, out FolderID);
            cmd.Parameters.Add("FolderID", DbType.Guid, ParameterDirection.Input, false, FolderID);
            cmd.Parameters.Add("EmployeeID", DbType.Guid, ParameterDirection.Input, false, EmployeeID);
            using (IDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    privileges = readFolderPrivilegeMask(reader);
                }
            }
            return(privileges);
        }
Exemplo n.º 2
0
 /// <summary>
 /// Возвращает текст скрипта создания временной таблицы для insert'ов.
 /// При первом (для типа) обращении вызывает createTempTableCreationScript и кеширует результат.
 /// Наименование временной таблицы {sTempTableName}
 /// </summary>
 /// <param name="xs">Реализация XStorageConnection</param>
 /// <param name="sTempTableName">Наименование временной таблицы</param>
 /// <param name="xtype">метаданные типа</param>
 /// <returns>текст скрипта</returns>
 protected override string getTempTableCreationScript(XStorageConnection xs, string sTempTableName, XTypeInfo xtype)
 {
     return("CREATE TABLE " + sTempTableName +
            "("
            + cacheTempTableCreationScripts.GetValue(xtype, dlgCreateTempTableCreationScript, xs) +
            ")");
 }
Exemplo n.º 3
0
        private void fillDataSetWithChildFoldersWithUpdatedState(XStorageConnection con, DomainObjectDataSet dataSet, Guid objectID, FolderStates folderState)
        {
            // зачитаем идентификаторы всех подчиненных папок, состояние которых отличается от требуемого
            XDbCommand cmd = con.CreateCommand(@"
				SELECT f.ObjectID
				FROM Folder f_s WITH(NOLOCK)
					JOIN Folder f  WITH(NOLOCK) ON f.LIndex > f_s.LIndex AND f.RIndex < f_s.RIndex AND f.Customer = f_s.Customer
				WHERE f_s.ObjectID = @ObjectID AND f.State <> @TargetState
				"                );

            // закрытие закрывает все вложенные папки без учета их состояния:
            // if (folderState == FolderStates.Closed) - Nothing to do

            // замораживание замораживает открытые и ожидающие закрытия
            if (folderState == FolderStates.Frozen)
            {
                cmd.CommandText = cmd.CommandText + " AND f.State IN (" + FolderStatesItem.Open.IntValue + "," + FolderStatesItem.WaitingToClose.IntValue + ")";
            }
            // перевод в "ожидание закрытие" применим только для открытых (т.е. замороженные и закрытые не трогаются)
            //else if (folderState == FolderStates.WaitingToClose)
            //cmd.CommandText = cmd.CommandText + " AND f.State = " + FolderStatesItem.Open.IntValue;

            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID);
            cmd.Parameters.Add("TargetState", DbType.Int16, ParameterDirection.Input, false, (Int16)folderState);
            using (IDataReader reader = cmd.ExecuteReader())
            {
                DomainObjectData xobjSubFolder;
                while (reader.Read())
                {
                    xobjSubFolder = dataSet.GetLoadedStub("Folder", reader.GetGuid(0));
                    xobjSubFolder.SetUpdatedPropValue("State", folderState);
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Запускает сохранение в рамках текущей трпнзакции.
        /// </summary>
        /// <param name="xs">Реализация XStorageConnection</param>
        /// <param name="datagram">множество объектов</param>
        protected void saveWithinTransaction(XStorageConnection xs, XDatagram datagram)
        {
            const string SAVEPOINT_NAME = "SP_XStorage_Save";
            bool         bSavePointUsed = xs.IsSavePointAllowed;

            if (bSavePointUsed)
            {
                xs.SetSavePoint(SAVEPOINT_NAME);
            }
            try
            {
                DoSave(xs, datagram);
                if (bSavePointUsed)
                {
                    xs.ReleaseSavePoint();
                }
            }
            catch (XDbDeadlockException)
            {
                // если произошел Dealock, то не будем пытаться откатить транзакцию, т.к. она уже не существует
                throw;
            }
            catch
            {
                if (bSavePointUsed)
                {
                    xs.RollbackToSavePoint();
                }
                throw;
            }
        }
Exemplo n.º 5
0
        private void UpdateChildDepartments(XStorageConnection con, DomainObjectDataSet dataSet, Guid objectID, bool IsArchive)
        {
            // Обновляем вложенные департаменты, если мы меняем признак на "Архивный".
            // Если признак "Архивный" снимается, каскадной разархивации не происходит.
            // зачитаем идентификаторы всех подчиненных департаментов, состояние которых отличается от требуемого
            if (IsArchive)
            {
                XDbCommand cmd = con.CreateCommand(@"
				    SELECT d.ObjectID
				    FROM dbo.Department as d_s WITH(NOLOCK)
					    JOIN dbo.Department as d  WITH(NOLOCK) ON d.LIndex > d_s.LIndex AND d.RIndex < d_s.RIndex AND d.Organization = d_s.Organization
				    WHERE d_s.ObjectID = @ObjectID AND d.IsArchive <> @IsArchive
				    "                );
                cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID);
                cmd.Parameters.Add("IsArchive", DbType.Boolean, ParameterDirection.Input, false, IsArchive);
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    DomainObjectData xobjSubDepartment;
                    while (reader.Read())
                    {
                        xobjSubDepartment = dataSet.GetLoadedStub("Department", reader.GetGuid(0));
                        xobjSubDepartment.SetUpdatedPropValue("IsArchive", IsArchive);
                    }
                }
            }
        }
Exemplo n.º 6
0
        protected Guid GetScalarObjectPropValueFromDB(XStorageConnection con, string sObjectType, Guid ObjectID, string[] aPathParts, int nStartIndex)
        {
            string sObjectType_cur = sObjectType;
            Guid   oid_cur         = ObjectID;
            string sQuery          = "@ObjectID";
            object vPropValue;                                                                          // значение свойства

            for (int nIndex = nStartIndex; nIndex < aPathParts.Length; ++nIndex)
            {
                sQuery = String.Format("SELECT {0} FROM {1} WHERE ObjectID = ({2})",
                                       con.ArrangeSqlName(aPathParts[nIndex]),  // 0 - свойство-колонка
                                       con.GetTableQName(sObjectType_cur),      // 1 - тип-таблица
                                       sQuery                                   // 2 - вложенное условие
                                       );
                sObjectType_cur = getObjectValueTypeName(sObjectType_cur, aPathParts[nIndex], con);
            }
            XDbCommand cmd = con.CreateCommand(sQuery);

            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, oid_cur);
            vPropValue = cmd.ExecuteScalar();
            if (vPropValue == null)
            {
                return(Guid.Empty);
            }
            else if (vPropValue is DBNull)
            {
                return(Guid.Empty);
            }
            return((Guid)vPropValue);
        }
Exemplo n.º 7
0
        protected XStorageConnection getConnection()
        {
            XStorageConnection xcon = m_xsFactory.CreateConnection();

            xcon.ConnectionString = m_xsFactory.ConnectionString;
            return(xcon);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Сохраняет бинарные и большие текстовые свойства для переданного объекта
        /// </summary>
        /// <param name="xs">Реализация XStorageConnection</param>
        /// <param name="xobj">Объект, для которого требуется обновить большие (бинарные и текстовые) свойства</param>
        protected virtual void updateBinAndLongDataForObject(XStorageConnection xs, XStorageObjectToSave xobj)
        {
            string sValue;

            // по всем текстовым полям переданного объекта
            foreach (DictionaryEntry entry in xobj.GetPropsByType(XPropType.vt_text))
            {
                // установка в NULL происходит сразу в insert/update'ах
                if (entry.Value == DBNull.Value)
                {
                    sValue = null;
                }
                else
                {
                    sValue = (string)entry.Value;
                }
                xs.SaveTextData(xobj.SchemaName, xobj.ObjectType, xobj.ObjectID, (string)entry.Key, sValue);
            }

            byte[] aValue;
            // по всем бинарным полям переданного объекта
            foreach (DictionaryEntry entry in xobj.GetPropsByType(XPropType.vt_bin))
            {
                // установка в NULL происходит сразу в insert/update'ах
                if (entry.Value == DBNull.Value)
                {
                    aValue = null;
                }
                else
                {
                    aValue = (byte[])entry.Value;
                }
                xs.SaveBinData(xobj.SchemaName, xobj.ObjectType, xobj.ObjectID, (string)entry.Key, aValue);
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// Проверка на сохранение объекта в БД, поступившего от клиента, в рамках датаграммы
        /// </summary>
        /// <param name="xuser">Пользователь, сохраняющий объект</param>
        /// <param name="ex">Описание запрета</param>
        public bool HasSaveObjectPrivilege(XUser xuser, DomainObjectData xobj, out Exception ex)
        {
            ex = null;
            ITUser user = (ITUser)xuser;

            using (XStorageConnection con = getConnection())
            {
                ObjectRightsCheckerBase checker = (ObjectRightsCheckerBase)m_ObjectRightCheckers[xobj.ObjectType];
                bool   bAllow;
                string sErrorDescription;
                if (checker != null)
                {
                    bAllow = checker.HasSaveObjectRight(user, xobj, con, out sErrorDescription);
                }
                else
                {
                    bAllow = m_coveringPrivilegesManager.HasSaveObjectRight(user, xobj, con, out sErrorDescription);
                }
                if (sErrorDescription != null && sErrorDescription.Length > 0)
                {
                    ex = new XSecurityException(sErrorDescription);
                }
                return(bAllow);
            }
        }
Exemplo n.º 10
0
        /// <summary>
        /// Возвращает коллекцию ключей и значений вида : "дата","норма сотрудника на дату"
        /// </summary>
        /// <param name="con"></param>
        /// <param name="dtStart">Дата начала периода</param>
        /// <param name="dtEnd">Дата окончания периода</param>
        /// <param name="dtEnd">Идентификатор сотрудника</param>
        private Dictionary <DateTime, int> GetDayRates(XStorageConnection con, DateTime dtStart, DateTime dtEnd, Guid uidUserId)
        {
            if (dtStart > dtEnd)
            {
                throw new ArgumentException("Дата начала периода должна быть меньше даты окончания периода");
            }

            XDbCommand cmd = con.CreateCommand(
                "SELECT CalendarDate, Rate FROM  dbo.GetEmployeeCalendar(@dtStart,@dtEnd,@EmpID) as empCal");

            cmd.Parameters.Add("dtStart", DbType.Date, ParameterDirection.Input, false, dtStart);
            cmd.Parameters.Add("dtEnd", DbType.Date, ParameterDirection.Input, false, dtEnd);
            cmd.Parameters.Add("EmpID", DbType.Guid, ParameterDirection.Input, false, uidUserId);
            Dictionary <DateTime, int> dictDateRates = new Dictionary <DateTime, int>();

            using (IXDataReader reader = cmd.ExecuteXReader())
            {
                while (reader.Read())
                {
                    DateTime dt        = reader.GetDateTime(reader.GetOrdinal("CalendarDate"));
                    int      nDateRate = reader.GetInt16(reader.GetOrdinal("Rate"));
                    dictDateRates.Add(dt, nDateRate);
                }
            }
            return(dictDateRates);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Формирует список устаревших и список удаленных объектов после неудачной процедуры обновления.
        /// Метод должен вызываться в рамках процедуры обновления измененных объектов когда количество обновленных
        /// объектов в БД не совпало с ожидаемым количество. Это означает, что некоторые объекты (из списка aUptObjects)
        /// либо "устарели", либо удалены. Данный метод как раз выявляет эти объекты
        /// Списки objects_obsolete и objects_deleted содержат объекты типов XObjectIdentity.
        /// </summary>
        /// <param name="xs">Наследник XStorageConnection</param>
        /// <param name="aUptObjects">Список обновляемых объектов</param>
        /// <param name="objects_obsolete">Возвращаемый список устаревших объектов</param>
        /// <param name="objects_deleted">Возвращаемый список удаленных объектов</param>
        protected void getOutdatedObjects(XStorageConnection xs, IList aUptObjects, out ArrayList objects_obsolete, out ArrayList objects_deleted)
        {
            XDbCommand cmd;                                     // команда
            ArrayList  objects_notdeleted = new ArrayList();    // список не удаленных объектов

            objects_obsolete = new ArrayList();                 // список устаревших объектов
            objects_deleted  = new ArrayList();                 // список удаленных объектов
            XStorageObjectToSave xobjFirst;                     // первый объект группы однотипных объектов
            // пойдем по группам однотипных объектов
            IEnumerator   enumerator = XDatagram.GetEnumerator(aUptObjects);
            StringBuilder cmdBuilder = new StringBuilder();

            while (enumerator.MoveNext())
            {
                ArrayList aGroup = (ArrayList)enumerator.Current;
                xobjFirst         = (XStorageObjectToSave)aGroup[0];
                cmdBuilder.Length = 0;
                cmdBuilder.AppendFormat("SELECT {0}, ts FROM {1} WHERE ",
                                        xs.ArrangeSqlName("ObjectID"),                               // 0
                                        xs.GetTableQName(xobjFirst.SchemaName, xobjFirst.ObjectType) // 1
                                        );
                foreach (XStorageObjectToSave xobj in aGroup)
                {
                    cmdBuilder.AppendFormat("{0}={1} OR ",
                                            xs.ArrangeSqlName("ObjectID"), xs.ArrangeSqlGuid(xobj.ObjectID));
                }
                // отрежем последний " OR "
                cmdBuilder.Length -= 4;
                // получим список удаленных объектов:
                // для этого сначала получим список неудаленных объектов
                objects_notdeleted.Clear();
                cmd = xs.CreateCommand(cmdBuilder.ToString());
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        // под индексом 0 здесь ObjectID объекта, он всегда NOT NULL, поэтому IsDbNull не проверяем
                        objects_notdeleted.Add(new XObjectIdentity(xobjFirst.ObjectType, reader.GetGuid(0), reader.GetInt64(1)));
                    }
                }
                // теперь у нас есть изначальный список объектов, и список неудаленных объектов, их разность и будет список удаленных объектов
                foreach (XStorageObjectToSave xobj in aGroup)
                {
                    // объект для поиска
                    XObjectIdentity xobjID = new XObjectIdentity(xobj.ObjectType, xobj.ObjectID);
                    int             nIndex = objects_notdeleted.IndexOf(xobjID);
                    // если текущего объекта нет в списке неудаленных объектов, значит он удаленный
                    if (nIndex == -1)
                    {
                        objects_deleted.Add(xobjID);
                    }
                    // иначе, если у зачитанного объекта отличается ts от текущего, значит он устаревший
                    else if ((objects_notdeleted[nIndex] as XObjectIdentity).TS != xobj.TS && xobj.AnalyzeTS)
                    {
                        objects_obsolete.Add(xobjID);
                    }
                }
            }
        }
Exemplo n.º 12
0
        public XPrivilegeSet GetPrivileges(ITUser user, Guid FolderID, XStorageConnection con)
        {
            Debug.Assert(con != null);
            Debug.Assert(FolderID != Guid.Empty);

            int privileges = m_cache.GetPrivilege(user, FolderID, con);

            return(PrivilegesHelper.CreatePrivilegeSet((FolderPrivileges)privileges));
        }
Exemplo n.º 13
0
 /// <summary>
 /// Сохраняет бинарные и большие текстовые свойства у всех объектов
 /// (из списка новых и списка обновляемых объектов)
 /// </summary>
 /// <param name="xs">Реализация XStorageConnection</param>
 /// <param name="datagram">Множество обрабатываемых объектов</param>
 protected void updateBinAndLongData(XStorageConnection xs, XDatagram datagram)
 {
     foreach (XStorageObjectToSave xobj in datagram.ObjectsToInsert)
     {
         updateBinAndLongDataForObject(xs, xobj);
     }
     foreach (XStorageObjectToSave xobj in datagram.ObjectsToUpdate)
     {
         updateBinAndLongDataForObject(xs, xobj);
     }
 }
Exemplo n.º 14
0
        /// <summary>
        /// Возвращает полный путь до инцидента, заданного идентификатором, либо номером
        /// </summary>
        /// <param name="con"></param>
        /// <param name="IncidentNumber">номер инцидента</param>
        /// <param name="IncidentOID">идентификатор инцидента или Guid.Empty</param>
        /// <returns></returns>
        private XTreePath GetIncidentFullPath(XStorageConnection con, Int32 IncidentNumber, Guid IncidentOID)
        {
            Guid organizationID = Guid.Empty;                           // идентификатор организации, в которой расположен инцидент
            Guid activityTypeID = Guid.Empty;                           // идентификатор вида активности,на которую ссылается папка, в которой разположен инцидент

            // сфомируем путь из каталогов
            string sQuery = String.Format(
                @"SELECT i.ObjectID AS IncidentID, f.ObjectID, f_s.Customer, f_s.ActivityType
				FROM Incident i with (nolock)
					JOIN Folder f_s with (nolock) ON i.Folder = f_s.ObjectID
						JOIN Folder f with (nolock) ON f.LIndex <= f_s.LIndex AND f.RIndex >= f_s.RIndex AND f.Customer = f_s.Customer
				WHERE {0}
				ORDER BY f.LRLevel DESC"                ,
                IncidentOID == Guid.Empty ?
                "i.Number = @Number" :
                "i.ObjectID = @ObjectID"
                );
            XDbCommand cmd = con.CreateCommand(sQuery);

            if (IncidentOID == Guid.Empty)
            {
                cmd.Parameters.Add("Number", DbType.Int32, ParameterDirection.Input, false, IncidentNumber);
            }
            else
            {
                cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, IncidentOID);
            }

            XTreePath path = new XTreePath();                   // путь

            using (IDataReader reader = cmd.ExecuteReader())
            {
                int nObjectIDIndex = -1;                                        // индекс поля ObjectID
                while (reader.Read())
                {
                    if (nObjectIDIndex < 0)
                    {
                        // первая итерация
                        IncidentOID    = reader.GetGuid(reader.GetOrdinal("IncidentID"));
                        organizationID = reader.GetGuid(reader.GetOrdinal("Customer"));
                        activityTypeID = reader.GetGuid(reader.GetOrdinal("ActivityType"));
                        nObjectIDIndex = reader.GetOrdinal("ObjectID");
                    }
                    path.Append(TYPE_Folder, reader.GetGuid(nObjectIDIndex));
                }
            }
            if (path.Length > 0)
            {
                path.Append(GetPathToFolder(con, organizationID, activityTypeID));
                path.InsertAtBeginning(TYPE_Incident, IncidentOID);
            }

            return(path);
        }
Exemplo n.º 15
0
 /// <summary>
 /// Метод возвращает описание списка по метанаименованию. Использует кэш <b>m_ListInfoCache</b>.
 /// </summary>
 /// <param name="sName">Наименование списка.</param>
 /// <param name="sTypeName">Наименование типа.</param>
 /// <param name="connection">Экземпляр реализации <see cref="Croc.XmlFramework.Data.XStorageConnection" text="XStorageConnection" />.</param>
 /// <returns>
 /// Описание списка.
 /// </returns>
 public ListInfoWithAccessCheck GetListInfo(String sName, string sTypeName, XStorageConnection connection)
 {
     if (sTypeName == null)
     {
         throw new ArgumentNullException("sTypeName");
     }
     if (connection == null)
     {
         throw new ArgumentNullException("connection");
     }
     return(m_ListInfoCache.GetValue(sTypeName + ":" + sName, m_dlgCreateListInfo, connection));
 }
Exemplo n.º 16
0
        /// <summary>
        /// Запрос разрешенных действий при создании объекта
        /// </summary>
        /// <param name="xuser">Пользователь</param>
        /// <param name="xobj"></param>
        /// <returns></returns>
        public XNewObjectRights GetRightsOnNewObject(XUser xuser, DomainObjectData xobj)
        {
            ITUser user = (ITUser)xuser;

            using (XStorageConnection con = getConnection())
            {
                ObjectRightsCheckerBase checker = (ObjectRightsCheckerBase)m_ObjectRightCheckers[xobj.ObjectType];
                if (checker != null)
                {
                    return(checker.GetRightsOnNewObject(user, xobj, con));
                }
                return(m_coveringPrivilegesManager.GetRightsOnNewObject(user, xobj, con));
            }
        }
Exemplo n.º 17
0
        /// <summary>
        /// Обновляет кросс-таблицы для массивных свойств (collection, collection-membership, array)
        /// </summary>
        /// <param name="xs">Реализация XStorageConnection</param>
        /// <param name="datagram">датаграмма</param>
        protected void updateCrossTables(XStorageConnection xs, XDatagram datagram)
        {
            XDbStatementDispatcher disp = xs.CreateStatementDispatcher();

            foreach (XStorageObjectToSave xobj in datagram.ObjectsToInsert)
            {
                updateCrossTablesForObject(xs, disp, xobj);
            }
            foreach (XStorageObjectToSave xobj in datagram.ObjectsToUpdate)
            {
                updateCrossTablesForObject(xs, disp, xobj);
            }
            disp.ExecutePendingStatementsAndReturnTotalRowsAffected();
        }
Exemplo n.º 18
0
        public override Guid GetScalarObjectPropValue(XStorageConnection con, IXObjectIdentity xobj_id, string sOPath)
        {
            XStorageObjectToSave xobj;
            object vPropValue;                                  // значение свойства
            Guid   oid_cur         = xobj_id.ObjectID;
            string sObjectType_cur = xobj_id.ObjectType;

            string[] aPathParts = sOPath.Split('.');
            bool     bLoad;

            for (int i = 0; i < aPathParts.Length; ++i)
            {
                xobj  = m_datagram.GetObjectToSave(sObjectType_cur, oid_cur);
                bLoad = false;
                if (xobj == null)
                {
                    // объекта нет в датаграмме, зачитаем из БД его и все последующие
                    bLoad = true;
                }
                else
                {
                    string sPropName = aPathParts[i];
                    if (sPropName == "ObjectID")
                    {
                        oid_cur = xobj.ObjectID;
                    }
                    else if (xobj.Props.Contains(sPropName))
                    {
                        vPropValue = xobj.Props[sPropName];
                        if (vPropValue == null)
                        {
                            return(Guid.Empty);
                        }
                        oid_cur         = (Guid)vPropValue;
                        sObjectType_cur = getObjectValueTypeName(sObjectType_cur, sPropName, con);
                    }
                    else
                    {
                        // объект есть в датаграмме, но свойства нет - зачитаем его из БД и все последующие
                        bLoad = true;
                    }
                }
                if (bLoad)
                {
                    return(GetScalarObjectPropValueFromDB(con, sObjectType_cur, oid_cur, aPathParts, i));
                }
            }
            return(oid_cur);
        }
Exemplo n.º 19
0
        /// <summary>
        /// Параметр делегата CreateCacheValue - вызывает при отсутствии запрощенного объекта в кэше
        /// </summary>
        /// <param name="key">ключ в кэше - реализация IXObjectIdentity (XObjectIdentity или наследники XObjectBase)</param>
        /// <param name="param">экземпляр XStorageConnection</param>
        /// <returns>Данные запрошенного объекта - экземпляр DomainObjectData</returns>
        private static object loadObject(object key, object param)
        {
            Debug.Assert(key != null);
            Debug.Assert(param != null);
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }

            IXObjectIdentity    obj_id  = (IXObjectIdentity)key;
            XStorageConnection  con     = (XStorageConnection)param;
            DomainObjectDataSet dataSet = new DomainObjectDataSet(con.MetadataManager.XModel);

            return(dataSet.Load(con, obj_id.ObjectType, obj_id.ObjectID));
        }
Exemplo n.º 20
0
        /// <summary>
        /// Создает описание списка при первом обращении.
        /// Параметр делегата CreateCacheValue.
        /// </summary>
        /// <param name="sKey">Ключ в формате {Наименование типа}:{Наименование списка}</param>
        /// <param name="value">XStorageConnection</param>
        /// <returns>экземпляр ListInfoWithAccessCheck</returns>
        private static ListInfoWithAccessCheck createListInfo(string sKey, object value)
        {
            #region Copy-paste кода из XInterfaceObjectsHolder::createListInfo

            XStorageConnection connection      = (XStorageConnection)value;
            XMetadataManager   metadataManager = connection.MetadataManager;

            // Ключ для сохранения в реестре (кеше) XModel в данном случае
            // ДОЛЖЕН БЫТЬ в виде {Наименование типа}:{Наименование списка}
            // Разберем этот ключ - выделим наименование типа и наименование списка
            Debug.Assert(sKey.IndexOf(":") > -1, "Отсутствует символ ':' в ключе");
            int    nIndex    = sKey.IndexOf(":");
            string sTypeName = sKey.Substring(0, nIndex);
            Debug.Assert(sTypeName.Length > 0, "Не задан тип");
            string sName = sKey.Substring(nIndex + 1, sKey.Length - nIndex - 1);

            // Сформируем XPath-запрос и загрузим метаописание списка; при формировании
            // запроса учитваем что метанаименование списка - параметр необязательный
            string sXPath = "ds:type[@n='" + sTypeName + "']/i:objects-list";
            if (sName.Length > 0)
            {
                sXPath = sXPath + "[@n='" + sName + "']";
            }

            XmlElement xmlList = (XmlElement)metadataManager.SelectSingleNode(sXPath);
            if (xmlList == null)
            {
                throw new ArgumentException(
                          "Неизвестное определение списка i:objects-list с метанаименованием " +
                          "'" + sName + "', для типа '" + sTypeName + "' " +
                          "(не найдено в метаданных, XPath='" + sXPath + "')");
            }

            #endregion
            //Создаем описание списка ListInfoWithAccessCheck.
            ListInfoWithAccessCheck listInfo = new ListInfoWithAccessCheck(xmlList, connection.MetadataManager.NamespaceManager, connection.MetadataManager.XModel);
            XPrivilegeSet           privSet  = new XPrivilegeSet();

            //Зачитываем из метаданных необходимые привилегии для доступа к заданному списку и записываем их в контейнер привилегий.
            foreach (XmlElement xmlNode in xmlList.SelectNodes("it-sec:access-requirements/*", connection.MetadataManager.NamespaceManager))
            {
                string            sPrivName = xmlNode.GetAttribute("n");
                ITSystemPrivilege priv      = new ITSystemPrivilege(SystemPrivilegesItem.GetItem(sPrivName));
                privSet.Add(priv);
            }
            listInfo.AccessSecurity.SetRequiredPrivileges(privSet);
            return(listInfo);
        }
Exemplo n.º 21
0
 /// <summary>
 /// Запускает сохранение при отсутствии внещней транзакции, создает транзакцию внутри
 /// </summary>
 /// <param name="xs">Реализация XStorageConnection</param>
 /// <param name="datagram">множество объектов</param>
 protected void saveWithoutTransaction(XStorageConnection xs, XDatagram datagram)
 {
     xs.BeginTransaction();
     try
     {
         DoSave(xs, datagram);
         xs.CommitTransaction();
     }
     catch (XDbDeadlockException)
     {
         // если произошел Dealock, то не будем пытаться откатить транзакцию, т.к. она уже не существует
         throw;
     }
     catch
     {
         xs.RollbackTransaction();
         throw;
     }
 }
Exemplo n.º 22
0
        /// <summary>
        /// Удаление множества объектов
        /// </summary>
        /// <param name="xs">XStorage</param>
        /// <param name="aDelObjects">Удаляемые объекты</param>
        /// <returns>Количество удаленных объектов</returns>
        public int Delete(XStorageConnection xs, IXObjectIdentity[] aDelObjects)
        {
            if (aDelObjects == null)
            {
                throw new ArgumentNullException("aDelObjects");
            }
            if (aDelObjects.Length == 0)
            {
                return(0);
            }
            XStorageObjectToDelete[] aDelObjectsToDelete = new XStorageObjectToDelete[aDelObjects.Length];
            int i = -1;

            foreach (IXObjectIdentity xobj in aDelObjects)
            {
                aDelObjectsToDelete[++i] = new XStorageObjectToDelete(xs.MetadataManager.GetTypeInfo(xobj.ObjectType), xobj.ObjectID, xobj.TS, true);
            }
            return(deleteObjectsFromDelete(xs, aDelObjectsToDelete));
        }
Exemplo n.º 23
0
        /// <summary>
        /// Метод получения идентификатора объекта "Сотрудник" по идентификатору объекта "Пользователь приложения"
        /// </summary>
        private Guid getEmployeeID(XStorageConnection con, Guid objectID)
        {
            Guid uidEmployeeID = Guid.Empty;  // идентификатор сотрудника
            // Зачитаем идентификатор
            XDbCommand cmd = con.CreateCommand(@"SELECT e.ObjectID
                    FROM [dbo].[Employee] e
	                JOIN [dbo].[SystemUser] su ON e.SystemUser = su.ObjectID
                    WHERE su.ObjectID = @ObjectID
            ");

            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID);
            using (IDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    uidEmployeeID = reader.GetGuid(0);
                }
            }
            return(uidEmployeeID);
        }
Exemplo n.º 24
0
        /// <summary>
        /// Вставляет новые объекты
        /// </summary>
        /// <param name="xs">Реализация XStorageConnection</param>
        /// <param name="disp">диспетчер запросов</param>
        /// <param name="datagram">Множество обрабатываемых объектов</param>
        /// <param name="bSuppressMagicBit">признак того, что надо исключить обработку поля MagicBit</param>
        protected virtual void insertObjects(XStorageConnection xs, XDbStatementDispatcher disp, XDatagram datagram, bool bSuppressMagicBit)
        {
            int        nIndex;                                          // порядковый индекс объекта
            XDbCommand cmd;                                             // команда как фабрика для создания параметров

            // получим упорядоченный список новых объектов упорядоченный по индексу зависимости
            IList aInsObjects = datagram.ObjectsToInsert;

            if (aInsObjects.Count == 0)
            {
                return;
            }
            nIndex = -1;
            cmd    = xs.CreateCommand();
            // для каждого объекта создадим заготовку ADO-команды с оператором insert и коллекцией параметров
            foreach (XStorageObjectToSave xobj in aInsObjects)
            {
                insertObject(xs, disp, xobj, cmd, ++nIndex, bSuppressMagicBit);
            }
        }
Exemplo n.º 25
0
        /// <summary>
        /// Сохраняет chunked-данные заданного объекта
        /// </summary>
        /// <param name="xobj">объект</param>
        /// <param name="con">соединение с БД</param>
        /// <returns>true - объект содержал chunked данные, иначе false</returns>
        protected static bool saveObjectChunkedData(XStorageObjectToSave xobj, XStorageConnection con)
        {
            string sPropName;                   // наименование свойтсва
            Guid   ownerID;                     // идентификатор цепочки кусочных данных свойства
            bool   bChunkedDataFound = false;

            // найдем свойства, чьи данные были загруженны по частам
            foreach (DictionaryEntry entry in xobj.PropertiesWithChunkedData)
            {
                sPropName         = (string)entry.Key;
                ownerID           = (Guid)entry.Value;
                bChunkedDataFound = true;
                XChunkStorageGateway.MergePropertyChunkedData(
                    ownerID,
                    xobj.ObjectType,
                    sPropName,
                    xobj.ObjectID,
                    con);
            }
            return(bChunkedDataFound);
        }
Exemplo n.º 26
0
        private void readUserManagedOrganizations(ITUser user, XStorageConnection con)
        {
            XDbCommand cmd = con.CreateCommand();

            cmd.CommandText = @"
				SELECT o.ObjectID
				FROM Organization o WITH (nolock)
					JOIN Organization o_p WITH (nolock) ON o_p.LIndex <= o.LIndex AND o_p.RIndex >= o.RIndex and o_p.Director = @EmployeeID		
			"            ;
            cmd.Parameters.Add("EmployeeID", DbType.Guid, ParameterDirection.Input, false, user.EmployeeID);
            using (IXDataReader reader = cmd.ExecuteXReader())
            {
                ArrayList aOrgIDs = new ArrayList();
                while (reader.Read())
                {
                    aOrgIDs.Add(reader.GetGuid(0));
                }
                user.ManagedOrganizations = new Guid[aOrgIDs.Count];
                aOrgIDs.CopyTo(user.ManagedOrganizations);
            }
        }
Exemplo n.º 27
0
        /// <summary>
        /// Выполняет указанный источник данных; ожидается, что в результате
        /// выполнения этого источника данных получим идентификатор некого
        /// объекта (тип тут не задан)
        /// </summary>
        /// <param name="sDataSourceName">Наименование источника данных</param>
        /// <param name="dictionaryParams">
        /// Хеш параметров; здесь в паре ключ пары - наименование параметра,
        /// значение пары - собственно значение параметра. Последний может быть
        /// типизированным значением, значением в стрковом представленнии.
        /// Технически допустимо значение в виде массива типизированных значений
        /// или их строковых представлений - в этом случае такие данные
        /// приводят к формированию условий виде Param IN (value1, ..., valueN)
        /// </param>
        /// <param name="connection">Соединение с СУБД; на момент вызова д.б. открыто</param>
        /// <returns>Значение ObjectID экземпляра объекта</returns>
        protected Guid processDataSource(
            string sDataSourceName,
            Hashtable dictionaryParams,
            XStorageConnection connection)
        {
            // Получим источник данных, подставим переданные параметры и выполним его:
            XDataSource dataSource = connection.GetDataSource(sDataSourceName);

            dataSource.SubstituteNamedParams(dictionaryParams, true);
            dataSource.SubstituteOrderBy();

            object oResult = dataSource.ExecuteScalar();
            // Ожидается, что в результате мы получаем GUID:
            Guid uidResult = Guid.Empty;

            if (null != oResult && DBNull.Value != oResult)
            {
                uidResult = connection.Behavior.CastGuidValueFromDB(oResult);
            }

            return(uidResult);
        }
Exemplo n.º 28
0
        /// <summary>
        /// Возвращает полный путь к проекту: Folder|oid|..|Folder|{oid}|ActivitType|{oid}|Organization|{oid}
        /// </summary>
        /// <param name="con"></param>
        /// <param name="FolderExID">Код проекта</param>
        /// <returns></returns>
        public XTreePath GetFolderFullPath(XStorageConnection con, string FolderExID)
        {
            // сфомируем путь из каталогов
            XDbCommand cmd = con.CreateCommand(@"
				SELECT f.ObjectID, f.Customer, f_s.ActivityType
				FROM Folder f_s with (nolock)
						JOIN Folder f with (nolock) ON f.LIndex <= f_s.LIndex AND f.RIndex >= f_s.RIndex AND f.Customer = f_s.Customer
				WHERE f_s.ExternalID = @FolderExID
				ORDER BY f.LRLevel DESC"
                                               );

            cmd.Parameters.Add("FolderExID", DbType.String, ParameterDirection.Input, false, FolderExID);
            XTreePath path           = new XTreePath(); // путь
            Guid      organizationID = Guid.Empty;      // идентификатор организации, в которой расположен инцидент
            Guid      activityTypeID = Guid.Empty;      // идентификатор вида активности,на которую ссылается папка, в которой разположен инцидент

            using (IDataReader reader = cmd.ExecuteReader())
            {
                int nObjectIDIndex = -1;                        // индекс поля ObjectID
                while (reader.Read())
                {
                    if (nObjectIDIndex < 0)
                    {
                        organizationID = reader.GetGuid(reader.GetOrdinal("Customer"));
                        activityTypeID = reader.GetGuid(reader.GetOrdinal("ActivityType"));
                        nObjectIDIndex = reader.GetOrdinal("ObjectID");
                    }
                    path.Append(TYPE_Folder, reader.GetGuid(nObjectIDIndex));
                }
            }
            // Сформируем путь из организаций и типов проектных затрат
            if (path.Length > 0)
            {
                XTreePath pathToFolder = GetPathToFolder(con, organizationID, activityTypeID);
                path.Append(pathToFolder);
            }
            return(path);
        }
Exemplo n.º 29
0
        /// <summary>
        /// Процедура, формирующая операцию UPDATE с использованием данных из временной таблицы
        /// </summary>
        /// <param name="xs">Реализация XStorageConnection</param>
        /// <param name="disp">XDbStatementDispatcher</param>
        /// <param name="sTempTableName">Имя временной таблице (уже заэнкоженное)</param>
        /// <param name="bUseMagicBit">Признак использование "магического бита"</param>
        /// <param name="sTypeName">Имя типа обновляемой группы объектов</param>
        /// <param name="sSchemaName">Наименование схемы</param>
        /// <param name="xmlTypeMD">Метаданные типа</param>
        protected override void updateWithTempTable(
            XStorageConnection xs,
            XDbStatementDispatcher disp,
            string sTempTableName,
            bool bUseMagicBit,
            string sSchemaName,
            string sTypeName,
            XmlElement xmlTypeMD)
        {
            StringBuilder cmdBuilder;

            cmdBuilder = new StringBuilder();
            cmdBuilder.AppendFormat(
                "UPDATE {0} SET {1}{2} = CASE WHEN s.{3} ='1' THEN CASE WHEN d.{2}<{3} THEN d.{2}+1 ELSE 1 END ELSE d.{2} END{1}",
                xs.GetTableQName(sSchemaName, sTypeName),               // 0
                xs.Behavior.SqlNewLine,                                 // 1
                xs.ArrangeSqlName("ts"),                                // 2
                xs.ArrangeSqlName("x_ts"),                              // 3
                Int64.MaxValue                                          // 4
                );
            // Для каждого скалярного свойства update на значение из временной таблице, если в колонке x_{имя_свойства} лежит 1, иначе само на себя
            foreach (XmlElement xmlPropMD in xmlTypeMD.SelectNodes("ds:prop[@cp='scalar' and @vt!='bin' and @vt!='text']", xs.MetadataManager.NamespaceManager))
            {
                cmdBuilder.AppendFormat(",[{0}] = CASE WHEN s.[x{0}]='1' THEN s.[c{0}] ELSE d.[{0}] END{1}",
                                        xmlPropMD.GetAttribute("n"),    // 0
                                        xs.Behavior.SqlNewLine          // 1
                                        );
            }
            if (bUseMagicBit)
            {
                cmdBuilder.Append(",[MagicBit]=1" + xs.Behavior.SqlNewLine);
            }
            cmdBuilder.AppendFormat("FROM {0} d JOIN {1} s ON d.ObjectID = s.ObjectID AND (d.ts = s.ts OR s.ts IS NULL)",
                                    xs.GetTableQName(sSchemaName, sTypeName),   // 0
                                    sTempTableName                              // 1
                                    );
            disp.DispatchStatement(cmdBuilder.ToString(), true);
        }
Exemplo n.º 30
0
        private void readUserActivityTypes(ITUser user, XStorageConnection con)
        {
            XDbCommand cmd = con.CreateCommand();

            cmd.CommandText = @"
				SELECT at.ObjectID, at.Name, at.Code, at.AccountRelated, at.FolderType, at.StartDate, at.EndDate 
				FROM dbo.SystemUser_ActivityTypes su_at WITH (nolock)
					JOIN dbo.ActivityType at WITH (nolock) ON su_at.Value = at.ObjectID
				WHERE su_at.ObjectID = @ObjectID
				UNION
				SELECT at.ObjectID, at.Name, at.Code, at.AccountRelated, at.FolderType, at.StartDate, at.EndDate 
				FROM dbo.SystemUser_SystemRoles su_sr WITH (nolock)
					JOIN dbo.SystemRole_ActivityTypes sr_at WITH (nolock) ON su_sr.Value = sr_at.ObjectID
						JOIN dbo.ActivityType at WITH (nolock) ON sr_at.Value = at.ObjectID
				WHERE su_sr.ObjectID = @ObjectID
				"                ;
            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, user.SystemUserID);
            using (IXDataReader reader = cmd.ExecuteXReader())
            {
                user.ActivityTypes = new Hashtable();
                while (reader.Read())
                {
                    DomainObject_ActivityType xobj = new DomainObject_ActivityType();
                    xobj.ObjectID       = reader.GetGuid(reader.GetOrdinal("ObjectID"));
                    xobj.Name           = reader.GetString(reader.GetOrdinal("Name"));
                    xobj.Code           = reader.GetString(reader.GetOrdinal("Code"));
                    xobj.AccountRelated = reader.GetBoolean(reader.GetOrdinal("AccountRelated"));
                    xobj.FolderType     = (FolderTypeFlags)reader.GetInt16(reader.GetOrdinal("FolderType"));
                    xobj.StartDate      = reader.GetDateTime(reader.GetOrdinal("StartDate"));
                    if (!reader.IsDBNull(reader.GetOrdinal("EndDate")))
                    {
                        xobj.EndDate = reader.GetDateTime(reader.GetOrdinal("EndDate"));
                    }
                    user.ActivityTypes.Add(xobj.ObjectID, xobj);
                }
            }
        }