public string LinqTypeToString(LinqDbTypes type) { if (type == LinqDbTypes.int_) { return("int"); } else if (type == LinqDbTypes.string_) { return("string"); } else if (type == LinqDbTypes.double_) { return("double"); } else if (type == LinqDbTypes.DateTime_) { return("DateTime"); } else if (type == LinqDbTypes.binary_) { return("byte[]"); } else { throw new LinqDbException("Linqdb: unknown column type."); } }
public IndexChangedData(string ColumnName, LinqDbTypes Type) { IntValues = new Dictionary <int, int>(); DoubleValues = new Dictionary <int, double>(); this.ColumnName = ColumnName; this.Type = Type; }
public IndexNewData(string ColumnName, LinqDbTypes Type) { Ids = new List <int>(); IntValues = new List <int>(); DoubleValues = new List <double>(); this.ColumnName = ColumnName; this.Type = Type; }
short GetColumnsNumber(short table_number, string column_name, LinqDbTypes column_type) { lock (_counter_lock_) { var res = struct_db.Get(":column_number:" + table_number + ":" + column_name); if (string.IsNullOrEmpty(res)) { var r = GetNextTableColumnNumber(table_number); struct_db.Put(":column_number:" + table_number + ":" + column_name, r.ToString()); struct_db.Put(":column_type:" + table_number + ":" + r, LinqTypeToString(column_type)); return(r); } else { return(Convert.ToInt16(res)); } } }
Tuple <List <KeyValuePair <int, int> >, List <KeyValuePair <int, double> >, List <int> > MatchesFromIndex(List <int> ids, IndexGeneric index, IndexGeneric ids_index, LinqDbTypes type) { List <KeyValuePair <int, int> > res_int = null; List <KeyValuePair <int, double> > res_double = null; int max = Int32.MinValue; bool is_sorted = true; int curr = Int32.MinValue; for (int i = 0; i < ids.Count(); i++) { if (max < ids[i]) { max = ids[i]; } if (is_sorted && curr > ids[i]) { is_sorted = false; } curr = ids[i]; } int max_size = 300000000; if (max < max_size) { List <bool> check_list = new List <bool>(max + 1); for (int i = 0; i < max + 1; i++) { check_list.Add(false); } foreach (var id in ids) { check_list[id] = true; } if (type == LinqDbTypes.int_) { res_int = new List <KeyValuePair <int, int> >(ids.Count()); for (int i = 0; i < index.Parts.Count(); i++) { var val_part = index.Parts[i]; var iids = ids_index.Parts[i].IntValues; int icount = iids.Count(); for (int j = 0; j < icount; j++) { var id = iids[j]; if (id <= max && check_list[id]) { res_int.Add(new KeyValuePair <int, int>(id, val_part.IntValues[j])); } } } } else { res_double = new List <KeyValuePair <int, double> >(ids.Count()); for (int i = 0; i < index.Parts.Count(); i++) { var val_part = index.Parts[i]; var iids = ids_index.Parts[i].IntValues; int icount = iids.Count(); for (int j = 0; j < icount; j++) { var id = iids[j]; if (id <= max && check_list[id]) { res_double.Add(new KeyValuePair <int, double>(id, val_part.DoubleValues[j])); } } } } return(new Tuple <List <KeyValuePair <int, int> >, List <KeyValuePair <int, double> >, List <int> >(res_int, res_double, null)); } else { int bloom_size = 30000000; List <bool> bloom_filter = new List <bool>(bloom_size); for (int i = 0; i < bloom_size; i++) { bloom_filter.Add(false); } foreach (var id in ids) { bloom_filter[id % bloom_size] = true; } if (!is_sorted) { ids = ids.OrderBy(f => f).ToList(); } if (type == LinqDbTypes.int_) { res_int = new List <KeyValuePair <int, int> >(ids.Count()); for (int i = 0; i < ids_index.Parts.Count(); i++) { var val_part = index.Parts[i]; var iids = ids_index.Parts[i].IntValues; int icount = iids.Count(); for (int j = 0; j < icount; j++) { var id = iids[j]; if (bloom_filter[id % bloom_size] && ids.BinarySearch(id) >= 0) { res_int.Add(new KeyValuePair <int, int>(id, val_part.IntValues[j])); } } } } else { res_double = new List <KeyValuePair <int, double> >(ids.Count()); for (int i = 0; i < ids_index.Parts.Count(); i++) { var val_part = index.Parts[i]; var iids = ids_index.Parts[i].IntValues; int icount = iids.Count(); for (int j = 0; j < icount; j++) { var id = iids[j]; if (bloom_filter[id % bloom_size] && ids.BinarySearch(id) >= 0) { res_double.Add(new KeyValuePair <int, double>(id, val_part.DoubleValues[j])); } } } } return(new Tuple <List <KeyValuePair <int, int> >, List <KeyValuePair <int, double> >, List <int> >(res_int, res_double, ids)); } }
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 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); } }
public IndexDeletedData(string ColumnName, LinqDbTypes Type) { Ids = new HashSet <int>(); this.ColumnName = ColumnName; this.Type = Type; }
public void GenericUpdate <T, TKey>(Expression <Func <T, TKey> > keySelector, Dictionary <int, object> values, LinqdbTransactionInternal trans, LinqDbTypes type) { CheckTableInfo <T>(); var par = keySelector.Parameters.First(); var name = SharedUtils.GetPropertyName(keySelector.Body.ToString()); var table_info = GetTableInfo(typeof(T).Name); if (table_info.Columns[name] != type) { throw new LinqDbException("Linqdb: wrong data type for given column."); } var info = new UpdateInfo() { TableNumber = table_info.TableNumber, ColumnNumber = table_info.ColumnNumbers[name], ColumnType = table_info.Columns[name], TableInfo = table_info, ColumnName = name }; var data = new Dictionary <int, object>(); foreach (var v in values) { data[v.Key] = v.Value; } Update <T>(info, data, table_info, trans); }