X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/9067f2344057a247dab19e6ce6756cb7d560d992..9174dbe8a9057e240fd9c3825c5720d13f2fafc2:/hotline/transaction.go diff --git a/hotline/transaction.go b/hotline/transaction.go index ece2924..9b0ac40 100644 --- a/hotline/transaction.go +++ b/hotline/transaction.go @@ -1,6 +1,7 @@ package hotline import ( + "bytes" "encoding/binary" "errors" "fmt" @@ -131,23 +132,24 @@ func ReadTransaction(buf []byte) (*Transaction, int, error) { }, tranLen, nil } -func readTransactions(buf []byte) ([]Transaction, int, error) { - var transactions []Transaction +const tranHeaderLen = 20 // fixed length of transaction fields before the variable length fields - bufLen := len(buf) +// transactionScanner implements bufio.SplitFunc for parsing incoming byte slices into complete tokens +func transactionScanner(data []byte, _ bool) (advance int, token []byte, err error) { + // The bytes that contain the size of a transaction are from 12:16, so we need at least 16 bytes + if len(data) < 16 { + return 0, nil, nil + } - var bytesRead = 0 - for bytesRead < bufLen { - t, tReadLen, err := ReadTransaction(buf[bytesRead:]) - if err != nil { - return transactions, bytesRead, err - } - bytesRead += tReadLen + totalSize := binary.BigEndian.Uint32(data[12:16]) - transactions = append(transactions, *t) + // tranLen represents the length of bytes that are part of the transaction + tranLen := int(tranHeaderLen + totalSize) + if tranLen > len(data) { + return 0, nil, nil } - return transactions, bytesRead, nil + return tranLen, data[0:tranLen], nil } const minFieldLen = 4 @@ -237,3 +239,7 @@ func (t *Transaction) GetField(id int) Field { return Field{} } + +func (t *Transaction) IsError() bool { + return bytes.Compare(t.ErrorCode, []byte{0, 0, 0, 1}) == 0 +}