protected virtual void OnReceipt(Subscription subscription, CRUDSubscriptionEvent data, Exception error) { if (Receipt != null) { Receipt(subscription, this, data, error); } }
/// <summary> /// Delivers data to the mailbox. This method is called by subscription /// </summary> public bool Deliver(Subscription subscription, CRUDSubscriptionEvent data) { if (subscription.Store != this.Store) { return(false); } var cap = m_BufferCapacity; if (cap > 0) { lock (m_Buffer) { m_Buffer.AddLast(data); if (m_Buffer.Count > cap) { m_Buffer.RemoveFirst(); } } } OnReceipt(subscription, data, null); return(true); }
internal SynchronizedReceiptHandlerEventArgs( EventPhase phase, Table table, CRUDSubscriptionEvent.EventType et, Row row) { this.Phase = phase; this.Table = table; this.EventType = et; this.Row = row; this.Proceed = true; }
private void m_Mailbox_Receipt(Subscription subscription, Mailbox recipient, CRUDSubscriptionEvent data, Exception error) { if (error != null) { OnError(error); return; } var schema = data.Schema; var table = m_Tables.GetOrRegister(schema.Name, (s) => new table(new Table(s), subscription.Query), schema).Table; lock (table) { var proceed = OnReceipt(SynchronizedReceiptHandlerEventArgs.EventPhase.Before, table, data.Type, data.Row); if (!proceed) { return; } switch (data.Type) { case CRUDSubscriptionEvent.EventType.TableCreate: break; case CRUDSubscriptionEvent.EventType.TableClear: table.DeleteAll(); break; case CRUDSubscriptionEvent.EventType.TableDrop: m_Tables.Unregister(schema.Name); break; case CRUDSubscriptionEvent.EventType.RowInsert: table.Insert(data.Row); break; case CRUDSubscriptionEvent.EventType.RowUpdate: table.Update(data.Row); break; case CRUDSubscriptionEvent.EventType.RowUpsert: table.Upsert(data.Row); break; case CRUDSubscriptionEvent.EventType.RowDelete: table.Delete(data.Row); break; } OnReceipt(SynchronizedReceiptHandlerEventArgs.EventPhase.After, table, data.Type, data.Row); } }
protected virtual void OnReceipt(Subscription subscription, CRUDSubscriptionEvent data, Exception error) { if (Receipt!=null) Receipt(subscription, this, data, error); }
/// <summary> /// Delivers data to the mailbox. This method is called by subscription /// </summary> public bool Deliver(Subscription subscription, CRUDSubscriptionEvent data) { if (subscription.Store!=this.Store) return false; var cap = m_BufferCapacity; if (cap>0) lock(m_Buffer) { m_Buffer.AddLast(data); if (m_Buffer.Count>cap) m_Buffer.RemoveFirst(); } OnReceipt(subscription, data, null); return true; }
private void process(IQueable msg) { try { if (msg is ErlException) { this.Mailbox.DeliverError(this, (ErlException)msg); return; } var erlMsg = msg as ErlMsg; if (erlMsg == null) throw new ErlException("Invalid message type: " + msg.GetType()); var map = ((ErlDataStore)Store).Map; var binding = new ErlVarBind(); //{Schema, ChangeType :: $d | $w, [{schema, Flds...}]} %% delete, write(upsert) //{Schema, ChangeType :: $D | $C | $c, []} %% Drop, Create, Clear if (erlMsg.Msg==null || !erlMsg.Msg.Match(SUBSCRIPTION_MSG_PATTERN, binding)) return; var schemaName = ((ErlAtom)binding[SCHEMA]).Value; var op = (char)((ErlByte)binding[TYPE]).Value; var rows = ((ErlList)binding[ROWS]).Value; var schema = map.GetCRUDSchemaForName(schemaName); CRUDSubscriptionEvent.EventType etp; switch(op) { case 'd': etp = CRUDSubscriptionEvent.EventType.RowDelete; break; case 'c': etp = CRUDSubscriptionEvent.EventType.TableClear; break; case 'D': etp = CRUDSubscriptionEvent.EventType.TableDrop; break; case 'C': etp = CRUDSubscriptionEvent.EventType.TableCreate; break; default: etp = CRUDSubscriptionEvent.EventType.RowUpsert; break; } if (rows.Count>0) { foreach(var rowTuple in rows.Cast<ErlTuple>()) { var row = map.ErlTupleToRow(schemaName, rowTuple, schema); var data = new CRUDSubscriptionEvent(etp, schema, row); this.Mailbox.Deliver(this, data); } } else { var data = new CRUDSubscriptionEvent(etp, schema, null); this.Mailbox.Deliver(this, data); } } catch(Exception err) { App.Log.Write( new Log.Message { Type = Log.MessageType.Error, Topic = CoreConsts.ERLANG_TOPIC, From = "{0}.process()".Args(GetType().Name), Text = err.ToMessageWithType(), Exception = err } ); } }
private void process(IQueable msg) { try { if (msg is ErlException) { this.Mailbox.DeliverError(this, (ErlException)msg); return; } var erlMsg = msg as ErlMsg; if (erlMsg == null) throw new ErlException("Invalid message type: " + msg.GetType()); var map = ((ErlDataStore)Store).Map; var binding = new ErlVarBind(); //{Schema, TS, ChangeType :: $d | $w, [{schema, Flds...}]} %% delete, write(upsert) //{Schema, TS, ChangeType :: $D | $C | $c, []} %% Drop, Create, Clear if (erlMsg.Msg==null || !erlMsg.Msg.Match(SUBSCRIPTION_MSG_PATTERN, binding)) return; var schemaName = ((ErlAtom)binding[SCHEMA]).Value; var ts = binding[TIMESTAMP].ValueAsLong; var op = (char)((ErlByte)binding[TYPE]).Value; var rows = ((ErlList)binding[ROWS]).Value; var schema = map.GetCRUDSchemaForName(schemaName); m_LastTimeStamp = new DataTimeStamp(ts); CRUDSubscriptionEvent.EventType etp; switch(op) { case 'd': etp = CRUDSubscriptionEvent.EventType.RowDelete; break; case 'c': etp = CRUDSubscriptionEvent.EventType.TableClear; break; case 'D': etp = CRUDSubscriptionEvent.EventType.TableDrop; break; case 'C': etp = CRUDSubscriptionEvent.EventType.TableCreate; break; default: etp = CRUDSubscriptionEvent.EventType.RowUpsert; break; } if (rows.Count>0) { int errors = 0; foreach(var rowTuple in rows.Cast<ErlTuple>()) { try { var row = map.ErlTupleToRow(schemaName, rowTuple, schema); var data = new CRUDSubscriptionEvent(etp, schema, row, new DataTimeStamp(ts)); this.Mailbox.Deliver(this, data); } catch(Exception ie) { errors++; log(MessageType.Error, "prcs().forea(rTpl)", ie.ToMessageWithType(), ie); } } // TODO: Add error reporting to user } else { //used to clear data, no rows are fetched var data = new CRUDSubscriptionEvent(etp, schema, null, new DataTimeStamp(ts)); this.Mailbox.Deliver(this, data); } } catch(Exception err) { log(MessageType.Error, "prcs().outcatch{}", err.ToMessageWithType(), err); } }
private void m_Mailbox_Receipt(Subscription subscription, Mailbox recipient, CRUDSubscriptionEvent data, Exception error) { if (error!=null) { OnError(error); return; } var schema = data.Schema; var table = m_Tables.GetOrRegister(schema.Name, (s) => new table(new Table(s), subscription.Query), schema).Table; lock(table) { var proceed = OnReceipt(SynchronizedReceiptHandlerEventArgs.EventPhase.Before, table, data.Type, data.Row); if (!proceed) return; switch(data.Type) { case CRUDSubscriptionEvent.EventType.TableCreate: break; case CRUDSubscriptionEvent.EventType.TableClear: table.DeleteAll(); break; case CRUDSubscriptionEvent.EventType.TableDrop: m_Tables.Unregister(schema.Name); break; case CRUDSubscriptionEvent.EventType.RowInsert: table.Insert(data.Row); break; case CRUDSubscriptionEvent.EventType.RowUpdate: table.Update(data.Row); break; case CRUDSubscriptionEvent.EventType.RowUpsert: table.Upsert(data.Row); break; case CRUDSubscriptionEvent.EventType.RowDelete: table.Delete(data.Row); break; } OnReceipt(SynchronizedReceiptHandlerEventArgs.EventPhase.After, table, data.Type, data.Row); } }
protected bool OnReceipt(SynchronizedReceiptHandlerEventArgs.EventPhase phase, Table table, CRUDSubscriptionEvent.EventType eType, Row data) { if (Receipt!=null) { var args = new SynchronizedReceiptHandlerEventArgs(phase, table, eType, data); Receipt(this, args); return args.Proceed; } return true; }