//This sends the error to the client. func sendError(sendReply mysqlctl.SendUpdateStreamResponse, reqIdentifier string, inputErr error, blpPos *mysqlctl.BlPosition) { var err error streamBuf := new(mysqlctl.BinlogResponse) streamBuf.Error = inputErr.Error() if blpPos != nil { streamBuf.BlPosition = *blpPos } buf := []*mysqlctl.BinlogResponse{streamBuf} err = sendStream(sendReply, buf) if err != nil { relog.Error("Error in communicating message %v with the client: %v", inputErr, err) } }
//This builds BinlogResponse for each transaction. func (blp *Blp) buildTxnResponse() (txnResponseList []*mysqlctl.BinlogResponse, dmlCount int64) { var line []byte var keyspaceIdStr string var keyspaceId key.KeyspaceId dmlBuffer := make([]string, 0, 10) for _, event := range blp.txnLineBuffer { line = event.LogLine if bytes.HasPrefix(line, mysqlctl.BINLOG_BEGIN) { streamBuf := new(mysqlctl.BinlogResponse) streamBuf.BlPosition = event.BlPosition streamBuf.SqlType = mysqlctl.BEGIN txnResponseList = append(txnResponseList, streamBuf) continue } if bytes.HasPrefix(line, mysqlctl.BINLOG_COMMIT) { commitEvent := createCommitEvent(event) txnResponseList = append(txnResponseList, commitEvent) continue } sqlType := mysqlctl.GetSqlType(event.firstKw) if sqlType == mysqlctl.DML { keyspaceIdStr, keyspaceId = parseKeyspaceId(line, mysqlctl.GetDmlType(event.firstKw)) if keyspaceIdStr == "" { continue } if !blp.keyspaceRange.Contains(keyspaceId) { dmlBuffer = dmlBuffer[:0] continue } dmlCount += 1 //extract keyspace id - match it with client's request, //extract index ids. dmlBuffer = append(dmlBuffer, string(line)) dmlEvent := blp.createDmlEvent(event, keyspaceIdStr) dmlEvent.Sql = make([]string, len(dmlBuffer)) dmlLines := copy(dmlEvent.Sql, dmlBuffer) if dmlLines < len(dmlBuffer) { relog.Warning("The entire dml buffer was not properly copied") } txnResponseList = append(txnResponseList, dmlEvent) dmlBuffer = dmlBuffer[:0] } else { //add as prefixes to the DML from last DML. //start a new dml buffer and keep adding to it. dmlBuffer = append(dmlBuffer, string(line)) } } return txnResponseList, dmlCount }