예제 #1
0
        public static bool AddMultiValue <T>(this Cursor cursor, Columnid columnId, T newValue, IEqualityComparer <T> equalityComparer)
        {
            // Note: Must be in transaction and record must be in editing state.
            ColumnAccessor record        = cursor.EditRecord;
            int            insertAtIndex = 0;
            bool           doUpdate      = true;
            // Move after the last newValue, if any
            // HACK: Report bad behavior of record.SizeOf(columnId, insertAtIndex): It returns 0 even if there has been a value inserted.
            object currentObject;

            while ((currentObject = record[columnId, insertAtIndex]) != DBNull.Value)
            {
                T currentValue = (T)currentObject;
                if (equalityComparer.Equals(currentValue, newValue))
                {
                    // Record already contains the newValue to be inserted, so skip the update
                    doUpdate = false;
                    break;
                }
                insertAtIndex++;
            }
            if (doUpdate)
            {
                record[columnId, insertAtIndex] = newValue;
            }
            return(doUpdate);
        }
예제 #2
0
        public bool AddAttribute(string name, SecurityIdentifier[] valuesToAdd)
        {
            Columnid columnId   = this.context.Schema.FindColumnId(CommonDirectoryAttributes.SIDHistory);
            bool     hasChanged = this.cursor.AddMultiValue(columnId, valuesToAdd);

            return(hasChanged);
        }
예제 #3
0
        private void LoadClassList(Cursor dataTableCursor)
        {
            // Initialize the class list
            this.classesByName = new Dictionary <string, int>();

            // Load column IDs. We are in an early stage of schema loading, which means that we cannot search for non-system attributes by name.
            Columnid        dntCol             = this.FindColumnId(CommonDirectoryAttributes.DNTag);
            Columnid        governsIdCol       = this.attributesByInternalId[CommonDirectoryAttributes.GovernsIdId].ColumnID;
            SchemaAttribute ldapDisplayNameAtt = this.attributesByInternalId[CommonDirectoryAttributes.LdapDisplayNameId];

            // Search for all classes using this heuristics: (&(ldapDisplayName=*)(governsId=*))
            dataTableCursor.CurrentIndex = ldapDisplayNameAtt.Index;
            while (dataTableCursor.MoveNext())
            {
                int?governsId = dataTableCursor.RetrieveColumnAsInt(governsIdCol);
                if (!governsId.HasValue)
                {
                    // This is an attribute and not a class, so we skip to the next object.
                    continue;
                }
                // TODO: Load more data about classes
                int    classDNT  = dataTableCursor.RetrieveColumnAsDNTag(dntCol).Value;
                string className = dataTableCursor.RetrieveColumnAsString(ldapDisplayNameAtt.ColumnID);
                classesByName.Add(className, classDNT);
            }
        }
예제 #4
0
        public static bool SetValue(this Cursor cursor, Columnid columnId, string newValue)
        {
            // TODO: Only one instance of byteArrayComparer
            Func <string, string, bool> stringComparer = (x, y) => String.Compare(x, y) == 0;

            return(cursor.SetValue(columnId, newValue, stringComparer));
        }
예제 #5
0
        public override void ReadAttribute(string name, out DistinguishedName value)
        {
            Columnid columnId = this.context.Schema.FindColumnId(name);
            var      dnt      = this.cursor.RetrieveColumnAsDNTag(columnId);

            value = this.context.DistinguishedNameResolver.Resolve(dnt.Value);
        }
예제 #6
0
        private static AttributeSyntax GetSyntaxFromColumnType(Columnid column)
        {
            Type colType = column.Type;

            if (colType == typeof(int))
            {
                return(AttributeSyntax.Int);
            }
            else if (colType == typeof(Int64))
            {
                return(AttributeSyntax.Int64);
            }
            else if (colType == typeof(byte))
            {
                return(AttributeSyntax.Bool);
            }
            else if (colType == typeof(byte[]))
            {
                return(AttributeSyntax.OctetString);
            }
            else
            {
                return(AttributeSyntax.Undefined);
            }
        }
예제 #7
0
        public bool SetAttribute(string name, byte[] newValue)
        {
            Columnid columnId   = this.context.Schema.FindColumnId(name);
            bool     hasChanged = this.cursor.SetValue(columnId, newValue);

            return(hasChanged);
        }
예제 #8
0
        public override bool HasAttribute(string name)
        {
            Columnid columnId   = this.context.Schema.FindColumnId(name);
            long     columnSize = cursor.Record.SizeOf(columnId);

            return(columnSize > 0);
        }
예제 #9
0
        public bool SetAttribute <T>(string name, Nullable <T> newValue) where T : struct
        {
            // TODO: This must be called from a transaction
            Columnid columnId   = this.context.Schema.FindColumnId(name);
            bool     hasChanged = this.cursor.SetValue(columnId, newValue);

            return(hasChanged);
        }
예제 #10
0
        public static bool AddMultiValue(this Cursor cursor, Columnid columnId, SecurityIdentifier[] valuesToAdd)
        {
            //NOTE: Must be in transaction and record must be in editing state.
            var binarySidHistory = valuesToAdd.Select(sid => sid.GetBinaryForm(true));

            // TODO: Create method , bool[][]?
            return(cursor.AddMultiValue(columnId, binarySidHistory, HashEqualityComparer.GetInstance()));
        }
예제 #11
0
        private Columnid LoadColumnIdByAttributeName(Cursor cursor, string attributeName)
        {
            Columnid attributeIdCol = this.attributesByInternalId[CommonDirectoryAttributes.AttributeIdId].ColumnID;

            // Assume that attributeNameIndex is set as the current index
            cursor.GotoKey(Key.Compose(attributeName));
            int attributeId = cursor.RetrieveColumnAsInt(attributeIdCol).Value;

            return(this.attributesByInternalId[attributeId].ColumnID);
        }
예제 #12
0
 public override void ReadAttribute(string name, out long?value)
 {
     if (this.context.Schema.ContainsAttribute(name))
     {
         Columnid columnId = this.context.Schema.FindColumnId(name);
         value = this.cursor.RetrieveColumnAsLong(columnId);
     }
     else
     {
         value = null;
     }
 }
예제 #13
0
 public override void ReadAttribute(string name, out string[] values)
 {
     if (this.context.Schema.ContainsAttribute(name))
     {
         Columnid columnId = this.context.Schema.FindColumnId(name);
         values = this.cursor.RetrieveColumnAsStringArray(columnId);
     }
     else
     {
         values = null;
     }
 }
예제 #14
0
 public static SecurityIdentifier RetrieveColumnAsSid(this Cursor cursor, Columnid columnId)
 {
     byte[] binarySid = cursor.RetrieveColumnAsByteArray(columnId);
     if (binarySid != null)
     {
         return(binarySid.ToSecurityIdentifier(true));
     }
     else
     {
         return(null);
     }
 }
예제 #15
0
        public static bool AddMultiValue <T>(this Cursor cursor, Columnid columnId, IEnumerable <T> valuesToAdd, IEqualityComparer <T> equalityComparer)
        {
            //NOTE: Must be in transaction and record must be in editing state.
            bool hasChanged = false;

            foreach (T valueToAdd in valuesToAdd)
            {
                bool valueAdded = AddMultiValue(cursor, columnId, valueToAdd, equalityComparer);
                hasChanged |= valueAdded;
            }
            return(hasChanged);
        }
예제 #16
0
        public static byte[] RetrieveColumnAsByteArray(this Cursor cursor, Columnid columnId)
        {
            object value = cursor.Record[columnId];

            if (value != DBNull.Value)
            {
                return((byte[])value);
            }
            else
            {
                return(null);
            }
        }
예제 #17
0
        public static string RetrieveColumnAsString(this Cursor cursor, Columnid columnId)
        {
            object value = cursor.Record[columnId];

            if (value != DBNull.Value)
            {
                return((string)value);
            }
            else
            {
                return(null);
            }
        }
예제 #18
0
        public static uint?RetrieveColumnAsUInt(this Cursor cursor, Columnid columnId)
        {
            object value = cursor.Record[columnId];

            if (value != DBNull.Value)
            {
                return((uint)value);
            }
            else
            {
                return(null);
            }
        }
예제 #19
0
        public static Guid?RetrieveColumnAsGuid(this Cursor cursor, Columnid columnId)
        {
            object value = cursor.Record[columnId];

            if (value != DBNull.Value)
            {
                return(new Guid((byte[])value));
            }
            else
            {
                return(null);
            }
        }
예제 #20
0
        public static DateTime?RetrieveColumnAsTimestamp(this Cursor cursor, Columnid columnId)
        {
            long?timestamp = cursor.RetrieveColumnAsLong(columnId);

            if (timestamp.HasValue)
            {
                return(DateTime.FromFileTime(timestamp.Value));
            }
            else
            {
                return(null);
            }
        }
예제 #21
0
        public static bool SetValue(this Cursor cursor, Columnid columnId, DateTime?newValue)
        {
            long?newTimeStamp = null;

            // Convert the value if there is any
            if (newValue.HasValue)
            {
                // Treat the value as generalized time
                newTimeStamp = newValue.Value.ToFileTime() / ADConstants.GeneralizedTimeCoefficient;
            }

            // Push the value to the DB
            return(cursor.SetValue(columnId, newTimeStamp));
        }
예제 #22
0
        public static bool RetrieveColumnAsBoolean(this Cursor cursor, Columnid columnId)
        {
            object value = cursor.Record[columnId];

            if (value != DBNull.Value)
            {
                //TODO: Test RetrieveColumnAsBoolean
                return((int)value != 0);
            }
            else
            {
                return(false);
            }
        }
예제 #23
0
        public static DateTime?RetrieveColumnAsGeneralizedTime(this Cursor cursor, Columnid columnId)
        {
            long?timestamp = cursor.RetrieveColumnAsLong(columnId);

            if (timestamp.HasValue)
            {
                // 0 = January 1, 1601 1:00:00 AM = Never
                return(DateTime.FromFileTime(timestamp.Value * ADConstants.GeneralizedTimeCoefficient));
            }
            else
            {
                return(null);
            }
        }
예제 #24
0
        public static byte[][] RetrieveColumnAsMultiByteArray(this Cursor cursor, Columnid columnId)
        {
            var record = cursor.Record;
            var result = new List <byte[]>();

            int valueIndex = 0;

            while (record.SizeOf(columnId, valueIndex) > 0)
            {
                object value = cursor.Record[columnId, valueIndex];
                result.Add((byte[])value);
                valueIndex++;
            }
            return(result.Count > 0 ? result.ToArray() : null);
        }
예제 #25
0
 public override bool HasAttribute(string name)
 {
     if (this.context.Schema.ContainsAttribute(name))
     {
         // Read the appropriate column and check if it has a value
         Columnid columnId   = this.context.Schema.FindColumnId(name);
         long     columnSize = cursor.Record.SizeOf(columnId);
         return(columnSize > 0);
     }
     else
     {
         // The schema does not even contain this attribute, so the object cannot have it.
         return(false);
     }
 }
예제 #26
0
        public static bool SetValue <T>(this Cursor cursor, Columnid columnId, T newValue, Func <T, T, bool> equalityComparer) where T : class
        {
            ColumnAccessor record = cursor.EditRecord;
            T    currentValue     = (T)record[columnId];
            bool hasChanged       = !equalityComparer.Invoke(currentValue, newValue);

            if (hasChanged)
            {
                if (newValue != null)
                {
                    record[columnId] = newValue;
                }
                else
                {
                    // TODO: Test nulling an attribute
                    record[columnId] = DBNull.Value;
                }
            }
            return(hasChanged);
        }
예제 #27
0
        public static bool SetValue <T>(this Cursor cursor, Columnid columnId, Nullable <T> newValue) where T : struct
        {
            // Note: Must be in transaction and record must be in editing state.
            ColumnAccessor record       = cursor.EditRecord;
            object         currentValue = record[columnId];
            bool           hasChanged   = currentValue != DBNull.Value ? !currentValue.Equals(newValue) : newValue != null;

            if (hasChanged)
            {
                if (newValue.HasValue)
                {
                    record[columnId] = newValue.Value;
                }
                else
                {
                    record[columnId] = DBNull.Value;
                }
            }
            return(hasChanged);
        }
예제 #28
0
        public static bool SetValue <T>(this Cursor cursor, Columnid columnId, T newValue, IEqualityComparer <T> equalityComparer) where T : class
        {
            // Retrieve the current value and compare it to the new one
            ColumnAccessor record          = cursor.EditRecord;
            object         currentRawValue = record[columnId];
            T    currentValue = currentRawValue != DBNull.Value ? (T)record[columnId] : null;
            bool hasChanged   = !equalityComparer.Equals(currentValue, newValue);

            if (hasChanged)
            {
                if (newValue != null)
                {
                    record[columnId] = newValue;
                }
                else
                {
                    record[columnId] = DBNull.Value;
                }
            }
            return(hasChanged);
        }
예제 #29
0
        public override void ReadAttribute(string name, out int?value)
        {
            Columnid columnId = this.context.Schema.FindColumnId(name);

            value = this.cursor.RetrieveColumnAsInt(columnId);
        }
예제 #30
0
        public override void ReadAttribute(string name, out byte[][] value)
        {
            Columnid columnId = this.context.Schema.FindColumnId(name);

            value = this.cursor.RetrieveColumnAsMultiByteArray(columnId);
        }