Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
69f0fedd66
|
|||
335ef4d8e8
|
|||
61801ff20d
|
98
dataext/ringBuffer.go
Normal file
98
dataext/ringBuffer.go
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
package dataext
|
||||||
|
|
||||||
|
import "iter"
|
||||||
|
|
||||||
|
type RingBuffer[T any] struct {
|
||||||
|
items []T //
|
||||||
|
capacity int // max number of items the buffer can hold
|
||||||
|
size int // how many items are in the buffer
|
||||||
|
head int // ptr to next item
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRingBuffer[T any](capacity int) *RingBuffer[T] {
|
||||||
|
return &RingBuffer[T]{
|
||||||
|
items: make([]T, capacity),
|
||||||
|
capacity: capacity,
|
||||||
|
size: 0,
|
||||||
|
head: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Push(item T) {
|
||||||
|
if rb.size < rb.capacity {
|
||||||
|
rb.size++
|
||||||
|
}
|
||||||
|
rb.items[rb.head] = item
|
||||||
|
rb.head = (rb.head + 1) % rb.capacity
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Peek() (T, bool) {
|
||||||
|
if rb.size == 0 {
|
||||||
|
return *new(T), false
|
||||||
|
}
|
||||||
|
return rb.items[(rb.head-1+rb.capacity)%rb.capacity], true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Items() []T {
|
||||||
|
if rb.size < rb.capacity {
|
||||||
|
return rb.items[:rb.size]
|
||||||
|
}
|
||||||
|
return append(rb.items[rb.head:], rb.items[:rb.head]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Size() int {
|
||||||
|
return rb.size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Capacity() int {
|
||||||
|
return rb.capacity
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Clear() {
|
||||||
|
rb.size = 0
|
||||||
|
rb.head = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) IsFull() bool {
|
||||||
|
return rb.size == rb.capacity
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) At(i int) T {
|
||||||
|
if i < 0 || i >= rb.size {
|
||||||
|
panic("Index out of bounds")
|
||||||
|
}
|
||||||
|
if rb.size < rb.capacity {
|
||||||
|
return rb.items[i]
|
||||||
|
}
|
||||||
|
return rb.items[(rb.head+i)%rb.capacity]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Get(i int) (T, bool) {
|
||||||
|
if i < 0 || i >= rb.size {
|
||||||
|
return *new(T), false
|
||||||
|
}
|
||||||
|
if rb.size < rb.capacity {
|
||||||
|
return rb.items[i], true
|
||||||
|
}
|
||||||
|
return rb.items[(rb.head+i)%rb.capacity], true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Iter() iter.Seq[T] {
|
||||||
|
return func(yield func(T) bool) {
|
||||||
|
for i := 0; i < rb.size; i++ {
|
||||||
|
if !yield(rb.At(i)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RingBuffer[T]) Iter2() iter.Seq2[int, T] {
|
||||||
|
return func(yield func(int, T) bool) {
|
||||||
|
for i := 0; i < rb.size; i++ {
|
||||||
|
if !yield(i, rb.At(i)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
package goext
|
package goext
|
||||||
|
|
||||||
const GoextVersion = "0.0.521"
|
const GoextVersion = "0.0.524"
|
||||||
|
|
||||||
const GoextVersionTimestamp = "2024-10-05T01:06:36+0200"
|
const GoextVersionTimestamp = "2024-10-05T01:41:10+0200"
|
||||||
|
@@ -75,7 +75,7 @@ func (db *database) Exec(ctx context.Context, sqlstr string, prep PP) (sql.Resul
|
|||||||
|
|
||||||
postMeta := PostExecMeta{Context: ctx, TransactionConstructorContext: nil, Init: t0, Start: t1, End: time.Now()}
|
postMeta := PostExecMeta{Context: ctx, TransactionConstructorContext: nil, Init: t0, Start: t1, End: time.Now()}
|
||||||
for _, v := range db.lstr {
|
for _, v := range db.lstr {
|
||||||
v.PostExec(nil, origsql, sqlstr, prep, postMeta)
|
v.PostExec(nil, origsql, sqlstr, prep, err, postMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -104,7 +104,7 @@ func (db *database) Query(ctx context.Context, sqlstr string, prep PP) (*sqlx.Ro
|
|||||||
|
|
||||||
postMeta := PostQueryMeta{Context: ctx, TransactionConstructorContext: nil, Init: t0, Start: t1, End: time.Now()}
|
postMeta := PostQueryMeta{Context: ctx, TransactionConstructorContext: nil, Init: t0, Start: t1, End: time.Now()}
|
||||||
for _, v := range db.lstr {
|
for _, v := range db.lstr {
|
||||||
v.PostQuery(nil, origsql, sqlstr, prep, postMeta)
|
v.PostQuery(nil, origsql, sqlstr, prep, err, postMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -92,8 +92,8 @@ type Listener interface {
|
|||||||
PostTxBegin(txid uint16, result error, meta PostTxBeginMeta)
|
PostTxBegin(txid uint16, result error, meta PostTxBeginMeta)
|
||||||
PostTxCommit(txid uint16, result error, meta PostTxCommitMeta)
|
PostTxCommit(txid uint16, result error, meta PostTxCommitMeta)
|
||||||
PostTxRollback(txid uint16, result error, meta PostTxRollbackMeta)
|
PostTxRollback(txid uint16, result error, meta PostTxRollbackMeta)
|
||||||
PostQuery(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostQueryMeta)
|
PostQuery(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostQueryMeta)
|
||||||
PostExec(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostExecMeta)
|
PostExec(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostExecMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
type genListener struct {
|
type genListener struct {
|
||||||
@@ -107,8 +107,8 @@ type genListener struct {
|
|||||||
postTxBegin func(txid uint16, result error, meta PostTxBeginMeta)
|
postTxBegin func(txid uint16, result error, meta PostTxBeginMeta)
|
||||||
postTxCommit func(txid uint16, result error, meta PostTxCommitMeta)
|
postTxCommit func(txid uint16, result error, meta PostTxCommitMeta)
|
||||||
postTxRollback func(txid uint16, result error, meta PostTxRollbackMeta)
|
postTxRollback func(txid uint16, result error, meta PostTxRollbackMeta)
|
||||||
postQuery func(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostQueryMeta)
|
postQuery func(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostQueryMeta)
|
||||||
postExec func(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostExecMeta)
|
postExec func(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostExecMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g genListener) PrePing(ctx context.Context, meta PrePingMeta) error {
|
func (g genListener) PrePing(ctx context.Context, meta PrePingMeta) error {
|
||||||
@@ -183,15 +183,15 @@ func (g genListener) PostTxRollback(txid uint16, result error, meta PostTxRollba
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g genListener) PostQuery(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostQueryMeta) {
|
func (g genListener) PostQuery(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostQueryMeta) {
|
||||||
if g.postQuery != nil {
|
if g.postQuery != nil {
|
||||||
g.postQuery(txID, sqlOriginal, sqlReal, params, meta)
|
g.postQuery(txID, sqlOriginal, sqlReal, params, result, meta)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g genListener) PostExec(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostExecMeta) {
|
func (g genListener) PostExec(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostExecMeta) {
|
||||||
if g.postExec != nil {
|
if g.postExec != nil {
|
||||||
g.postExec(txID, sqlOriginal, sqlReal, params, meta)
|
g.postExec(txID, sqlOriginal, sqlReal, params, result, meta)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,21 +246,21 @@ func NewPostTxRollbackListener(f func(txid uint16, result error, meta PostTxRoll
|
|||||||
return genListener{postTxRollback: f}
|
return genListener{postTxRollback: f}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPostQueryListener(f func(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostQueryMeta)) Listener {
|
func NewPostQueryListener(f func(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostQueryMeta)) Listener {
|
||||||
return genListener{postQuery: f}
|
return genListener{postQuery: f}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPostExecListener(f func(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostExecMeta)) Listener {
|
func NewPostExecListener(f func(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostExecMeta)) Listener {
|
||||||
return genListener{postExec: f}
|
return genListener{postExec: f}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPostListener(f func(cmdtype string, txID *uint16, sqlOriginal string, sqlReal string, params PP)) Listener {
|
func NewPostListener(f func(cmdtype string, txID *uint16, sqlOriginal string, sqlReal string, result error, params PP)) Listener {
|
||||||
return genListener{
|
return genListener{
|
||||||
postExec: func(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostExecMeta) {
|
postExec: func(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostExecMeta) {
|
||||||
f("EXEC", txID, sqlOriginal, sqlReal, params)
|
f("EXEC", txID, sqlOriginal, sqlReal, result, params)
|
||||||
},
|
},
|
||||||
postQuery: func(txID *uint16, sqlOriginal string, sqlReal string, params PP, meta PostQueryMeta) {
|
postQuery: func(txID *uint16, sqlOriginal string, sqlReal string, params PP, result error, meta PostQueryMeta) {
|
||||||
f("QUERY", txID, sqlOriginal, sqlReal, params)
|
f("QUERY", txID, sqlOriginal, sqlReal, result, params)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -128,7 +128,7 @@ func (tx *transaction) Exec(ctx context.Context, sqlstr string, prep PP) (sql.Re
|
|||||||
|
|
||||||
postMeta := PostExecMeta{Context: ctx, TransactionConstructorContext: tx.constructorContext, Init: t0, Start: t1, End: time.Now()}
|
postMeta := PostExecMeta{Context: ctx, TransactionConstructorContext: tx.constructorContext, Init: t0, Start: t1, End: time.Now()}
|
||||||
for _, v := range tx.db.lstr {
|
for _, v := range tx.db.lstr {
|
||||||
v.PostExec(langext.Ptr(tx.id), origsql, sqlstr, prep, postMeta)
|
v.PostExec(langext.Ptr(tx.id), origsql, sqlstr, prep, err, postMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -161,7 +161,7 @@ func (tx *transaction) Query(ctx context.Context, sqlstr string, prep PP) (*sqlx
|
|||||||
|
|
||||||
postMeta := PostQueryMeta{Context: ctx, TransactionConstructorContext: tx.constructorContext, Init: t0, Start: t1, End: time.Now()}
|
postMeta := PostQueryMeta{Context: ctx, TransactionConstructorContext: tx.constructorContext, Init: t0, Start: t1, End: time.Now()}
|
||||||
for _, v := range tx.db.lstr {
|
for _, v := range tx.db.lstr {
|
||||||
v.PostQuery(langext.Ptr(tx.id), origsql, sqlstr, prep, postMeta)
|
v.PostQuery(langext.Ptr(tx.id), origsql, sqlstr, prep, err, postMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Reference in New Issue
Block a user