예제 #1
0
파일: Mailbox.cs 프로젝트: itadapter/nfx
 public CRUDSubscriptionEvent(EventType type, Schema schema, Row row, DataTimeStamp version)
 {
     Type = type;
       Schema = schema;
       Row = row;
       Version = version;
 }
예제 #2
0
 public CRUDSubscriptionEvent(EventType type, Schema schema, Row row, DataTimeStamp version)
 {
     Type    = type;
     Schema  = schema;
     Row     = row;
     Version = version;
 }
예제 #3
0
 public ErlCRUDQueryExecutionContext(ErlDataStore store, ErlMbox erlMBox = null, DataTimeStamp? ts = null)
 {
     this.DataStore = store;
       ErlMailBox = erlMBox;
       SubscriptionTimestamp = ts;
 }
예제 #4
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);
      }
    }