コード例 #1
0
        internal bool InsertTransaction <T>(Guid docid, T doc)
        {
            apimapper api = new apimapper(_viewmanager, this);

            if (basetype == doc.GetType())
            {
                View <T> view = (View <T>)_view;

                try
                {
                    if (view.Mapper != null)
                    {
                        view.Mapper(api, docid, doc);
                    }
                }
                catch (Exception ex)
                {
                    _log.Error(ex);
                    return(false);
                }
            }
            else if (mapper != null)
            {
                mapper(api, docid, doc);
            }

            if (api._RollBack == true)
            {
                return(false);
            }

            // map emitobj -> rows
            foreach (var d in api.emitobj)
            {
                api.emit.Add(d.Key, ExtractRows(d.Value));
            }

            //Dictionary<Guid, List<object[]>> rows = new Dictionary<Guid, List<object[]>>();
            tran_data data = new tran_data();

            if (_transactions.TryGetValue(Thread.CurrentThread.ManagedThreadId, out data))
            {
                // TODO : exists -> merge data??
            }
            else
            {
                data       = new tran_data();
                data.docid = docid;
                data.rows  = api.emit;
                _transactions.Add(Thread.CurrentThread.ManagedThreadId, data);
            }

            return(true);
        }
コード例 #2
0
        // FEATURE : add query caching here
        internal Result <object> Query <T>(Expression <Predicate <T> > filter, int start, int count, string orderby)
        {
            if (filter == null)
            {
                return(Query(start, count));
            }

            DateTime dt = FastDateTime.Now;

            _log.Debug("query : " + _view.Name);

            WAHBitArray ba = new WAHBitArray();

            QueryVisitor qv = new QueryVisitor(QueryColumnExpression);

            qv.Visit(filter);
            var delbits = _deletedRows.GetBits();

            ba = ((WAHBitArray)qv._bitmap.Pop()).AndNot(delbits);
            List <T> trows = null;

            if (_viewmanager.inTransaction())
            {
                // query from transaction own data
                tran_data data = null;
                if (_transactions.TryGetValue(Thread.CurrentThread.ManagedThreadId, out data))
                {
                    List <T> rrows = new List <T>();
                    foreach (var kv in data.rows)
                    {
                        foreach (var r in kv.Value)
                        {
                            object o = FastCreateObject(_view.Schema);
                            rrows.Add((T)_rowfiller(o, r));
                        }
                    }
                    trows = rrows.FindAll(filter.Compile());
                }
            }

            var order = SortBy(orderby);

            _log.Debug("query bitmap done (ms) : " + FastDateTime.Now.Subtract(dt).TotalMilliseconds);
            dt = FastDateTime.Now;
            // exec query return rows
            return(ReturnRows <T>(ba, trows, start, count, order));
        }
コード例 #3
0
        internal void Commit(int ID)
        {
            tran_data data = null;

            // save data to indexes
            if (_transactions.TryGetValue(ID, out data))
            {
                // delete any items with docid in view
                if (_view.DeleteBeforeInsert)
                {
                    DeleteRowsWith(data.docid);
                }
                SaveAndIndex(data.rows);
            }
            // remove in memory data
            _transactions.Remove(ID);
        }