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); } }
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); }
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); //} } } }
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); } }