Ejemplo n.º 1
0
 protected virtual void OnReceipt(Subscription subscription, CRUDSubscriptionEvent data, Exception error)
 {
     if (Receipt != null)
     {
         Receipt(subscription, this, data, error);
     }
 }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
 protected virtual void OnReceipt(Subscription subscription, CRUDSubscriptionEvent data, Exception error)
 {
     if (Receipt!=null)
       Receipt(subscription, this, data, error);
 }
Ejemplo n.º 6
0
        /// <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;
        }
Ejemplo n.º 7
0
    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 
          }
        );
      }
    }
Ejemplo n.º 8
0
    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);
      }
    }
Ejemplo n.º 9
0
    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);
      }
    }
Ejemplo n.º 10
0
 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;
 }