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