コード例 #1
0
ファイル: Delete.cs プロジェクト: ren85/linqdb
        void DeleteStringColumn(WriteBatchWithConstraints batch, short TableNumber, short ColumnNumber, TableInfo table_info, LinqDbTypes ColumnType, int id, Dictionary <string, KeyValuePair <byte[], HashSet <int> > > cache)
        {
            var key_info = new IndexKeyInfo()
            {
                ColumnNumber = ColumnNumber,
                TableNumber  = TableNumber,
                ColumnType   = ColumnType,
                Id           = id
            };
            var    value_key      = MakeStringValueKey(key_info);
            var    old_val        = leveld_db.Get(value_key);
            string old_val_string = null;

            if (old_val != null && old_val.Length != 1)
            {
                old_val_string = Encoding.Unicode.GetString(old_val.Skip(1).ToArray());
            }
            var index_key = MakeIndexKey(new IndexKeyInfo()
            {
                TableNumber  = TableNumber,
                ColumnNumber = ColumnNumber,
                ColumnType   = ColumnType,
                Val          = (old_val == null || old_val.Length == 1) ? NullConstant : CalculateMD5Hash(old_val_string.ToLower(CultureInfo.InvariantCulture)),
                Id           = id
            });

            batch.Delete(index_key);
            batch.Delete(value_key);
            var column_name = table_info.ColumnNumbers.Select(f => new { f.Key, f.Value }).Where(f => f.Value == ColumnNumber).FirstOrDefault().Key;

            if (column_name.ToLower().EndsWith("search"))
            {
                UpdateIndex(old_val_string, null, id, batch, ColumnNumber, TableNumber, cache, false);
            }
            if (column_name.ToLower().EndsWith("searchs"))
            {
                UpdateIndex(old_val_string, null, id, batch, ColumnNumber, TableNumber, cache, true);
            }
        }
コード例 #2
0
ファイル: Delete.cs プロジェクト: ren85/linqdb
        void DeleteBinaryColumn(WriteBatchWithConstraints batch, short TableNumber, short ColumnNumber, LinqDbTypes ColumnType, int id)
        {
            var key_info = new IndexKeyInfo()
            {
                ColumnNumber = ColumnNumber,
                TableNumber  = TableNumber,
                ColumnType   = ColumnType,
                Id           = id
            };
            var value_key = MakeBinaryValueKey(key_info);
            var old_val   = leveld_db.Get(value_key);

            var index_key = MakeIndexKey(new IndexKeyInfo()
            {
                TableNumber  = TableNumber,
                ColumnNumber = ColumnNumber,
                ColumnType   = ColumnType,
                Val          = (old_val == null || old_val.Length == 1) ? NullConstant : NotNullFiller,
                Id           = id
            });

            batch.Delete(index_key);
            batch.Delete(value_key);
        }
コード例 #3
0
ファイル: String.cs プロジェクト: ren85/linqdb
        void UpdateIndex(string old_val, string new_val, int id, WriteBatchWithConstraints batch, short ColumnNumber, short TableNumber, Dictionary <string, KeyValuePair <byte[], HashSet <int> > > cache, bool bySpacesOnly)
        {
            int phase = id / PhaseStep;

            if (old_val != null)
            {
                old_val = old_val.ToLower(CultureInfo.InvariantCulture);
            }
            if (new_val != null)
            {
                new_val = new_val.ToLower(CultureInfo.InvariantCulture);
            }

            if (old_val == new_val)
            {
                return;
            }
            var removed = GetRemovedWords(old_val, new_val, bySpacesOnly);

            foreach (var r in removed)
            {
                var kinfo = new IndexKeyInfo()
                {
                    ColumnNumber = ColumnNumber,
                    TableNumber  = TableNumber,
                    Id           = id
                };
                var           key       = MakeStringIndexKey(kinfo, r, phase);
                HashSet <int> old_index = null;
                if (GetFromStringIndexCache(kinfo, r, cache, phase, out old_index, 0))
                {
                    old_index.Add(id);
                    PutToStringIndexCache(kinfo, r, key, old_index, cache, phase, 0);
                }
                else
                {
                    //var val = leveld_db.Get(key);
                    //if (val != null)
                    //{
                    //  old_index = ReadHashsetFromBytes(val);
                    old_index = new HashSet <int>();
                    old_index.Add(id);
                    PutToStringIndexCache(kinfo, r, key, old_index, cache, phase, 0);
                    //}
                }
            }
            var new_words = GetAddedWords(old_val, new_val, bySpacesOnly);

            foreach (var n in new_words)
            {
                var kinfo = new IndexKeyInfo()
                {
                    ColumnNumber = ColumnNumber,
                    TableNumber  = TableNumber,
                    Id           = id
                };
                var           key       = MakeStringIndexKey(kinfo, n, phase);
                HashSet <int> old_index = null;

                if (GetFromStringIndexCache(kinfo, n, cache, phase, out old_index, 1))
                {
                    old_index.Add(id);
                    PutToStringIndexCache(kinfo, n, key, old_index, cache, phase, 1);
                }
                else
                {
                    //var val = leveld_db.Get(key);
                    //if (val != null)
                    //{
                    //    old_index = ReadHashsetFromBytes(val);
                    //    old_index.Add(id);
                    //    PutToStringIndexCache(kinfo, n, key, old_index, cache, phase);
                    //}
                    //else
                    //{
                    var index = new HashSet <int>();
                    index.Add(id);
                    PutToStringIndexCache(kinfo, n, key, index, cache, phase, 1);
                    //}
                }
            }
        }
コード例 #4
0
ファイル: Delete.cs プロジェクト: ren85/linqdb
        void DeleteDataColumn(WriteBatchWithConstraints batch, short TableNumber, short ColumnNumber, LinqDbTypes ColumnType, int id, IndexDeletedData index_deleted)
        {
            var key_info = new IndexKeyInfo()
            {
                ColumnNumber = ColumnNumber,
                TableNumber  = TableNumber,
                ColumnType   = ColumnType,
                Id           = id
            };
            var value_key = MakeValueKey(key_info);
            var old_val   = leveld_db.Get(value_key);

            if (old_val == null) //maybe new column added and delete invoked
            {
                return;
            }
            bool is_old_negative = false;

            if (ValsEqual(old_val, NullConstant))
            {
                is_old_negative = false;
            }
            else if (ColumnType == LinqDbTypes.double_ && BitConverter.ToDouble(old_val.MyReverseWithCopy(), 0) < 0)
            {
                is_old_negative = true;
                old_val         = BitConverter.GetBytes((BitConverter.ToDouble(old_val.MyReverseWithCopy(), 0) * -1)).MyReverseNoCopy();
            }
            else if (ColumnType == LinqDbTypes.int_ && BitConverter.ToInt32(old_val.MyReverseWithCopy(), 0) < 0)
            {
                is_old_negative = true;
                old_val         = BitConverter.GetBytes((BitConverter.ToInt32(old_val.MyReverseWithCopy(), 0) * -1)).MyReverseNoCopy();
            }

            byte[] index_key = null;
            if (is_old_negative)
            {
                index_key = MakeIndexKey(new IndexKeyInfo()
                {
                    TableNumber  = TableNumber,
                    ColumnNumber = (short)(-1 * ColumnNumber),
                    ColumnType   = ColumnType,
                    Val          = old_val,
                    Id           = id
                });
            }
            else
            {
                index_key = MakeIndexKey(new IndexKeyInfo()
                {
                    TableNumber  = TableNumber,
                    ColumnNumber = ColumnNumber,
                    ColumnType   = ColumnType,
                    Val          = old_val,
                    Id           = id
                });
            }

            batch.Delete(value_key);
            batch.Delete(index_key);

            //keep up the memory index, if there is one
            if (index_deleted != null)
            {
                index_deleted.Ids.Add(id);
            }
        }