Esempio n. 1
0
 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.");
     }
 }
Esempio n. 2
0
 public IndexChangedData(string ColumnName, LinqDbTypes Type)
 {
     IntValues       = new Dictionary <int, int>();
     DoubleValues    = new Dictionary <int, double>();
     this.ColumnName = ColumnName;
     this.Type       = Type;
 }
Esempio n. 3
0
 public IndexNewData(string ColumnName, LinqDbTypes Type)
 {
     Ids             = new List <int>();
     IntValues       = new List <int>();
     DoubleValues    = new List <double>();
     this.ColumnName = ColumnName;
     this.Type       = Type;
 }
Esempio n. 4
0
 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));
         }
     }
 }
Esempio n. 5
0
        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));
            }
        }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
            }
        }
Esempio n. 9
0
 public IndexDeletedData(string ColumnName, LinqDbTypes Type)
 {
     Ids             = new HashSet <int>();
     this.ColumnName = ColumnName;
     this.Type       = Type;
 }
Esempio n. 10
0
        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);
        }