Documentation ¶
Overview ¶
Package goque provides embedded, disk-based implementations of stack, queue, and priority queue data structures.
Motivation for creating this project was the need for a persistent priority queue that remained performant while growing well beyond the available memory of a given machine. While there are many packages for Go offering queues, they all seem to be memory based and/or standalone solutions that are not embeddable within an application.
Instead of using an in-memory heap structure to store data, everything is stored using the Go port of LevelDB (https://github.com/syndtr/goleveldb). This results in very little memory being used no matter the size of the database, while read and write performance remains near constant.
See README.md or visit https://github.com/ldmtam/goque/v2 for more info.
Example (Object) ¶
ExampleObject demonstrates enqueuing a struct object.
// Open/create a queue. q, err := goque.OpenQueue("data_dir") if err != nil { fmt.Println(err) return } defer q.Close() // Define our struct. type object struct { X int Y int } // Enqueue an object. item, err := q.EnqueueObject(object{X: 1, Y: 2}) if err != nil { fmt.Println(err) return } fmt.Println(item.ID) // 1 fmt.Println(item.Key) // [0 0 0 0 0 0 0 1] // Dequeue an item. deqItem, err := q.Dequeue() if err != nil { fmt.Println(err) return } // Create variable to hold our object in. var obj object // Decode item into our struct type. if err := deqItem.ToObject(&obj); err != nil { fmt.Println(err) return } fmt.Printf("%+v\n", obj) // {X:1 Y:2} // Delete the queue and its database. q.Drop()
Output:
Example (PrefixQueue) ¶
ExamplePrefixQueue demonstrates the implementation of a Goque queue.
// Open/create a prefix queue. pq, err := goque.OpenPrefixQueue("data_dir") if err != nil { fmt.Println(err) return } defer pq.Close() // Enqueue an item. item, err := pq.Enqueue([]byte("prefix"), []byte("item value")) if err != nil { fmt.Println(err) return } fmt.Println(item.ID) // 1 fmt.Println(item.Key) // [112 114 101 102 105 120 0 0 0 0 0 0 0 0 1] fmt.Println(item.Value) // [105 116 101 109 32 118 97 108 117 101] fmt.Println(item.ToString()) // item value // Change the item value in the queue. item, err = pq.Update([]byte("prefix"), item.ID, []byte("new item value")) if err != nil { fmt.Println(err) return } fmt.Println(item.ToString()) // new item value // Dequeue the next item. deqItem, err := pq.Dequeue([]byte("prefix")) if err != nil { fmt.Println(err) return } fmt.Println(deqItem.ToString()) // new item value // Delete the queue and its database. pq.Drop()
Output:
Example (PriorityQueue) ¶
ExamplePriorityQueue demonstrates the implementation of a Goque queue.
// Open/create a priority queue. pq, err := goque.OpenPriorityQueue("data_dir", goque.ASC) if err != nil { fmt.Println(err) return } defer pq.Close() // Enqueue the item. item, err := pq.Enqueue(0, []byte("item value")) if err != nil { fmt.Println(err) return } fmt.Println(item.ID) // 1 fmt.Println(item.Priority) // 0 fmt.Println(item.Key) // [0 58 0 0 0 0 0 0 0 1] fmt.Println(item.Value) // [105 116 101 109 32 118 97 108 117 101] fmt.Println(item.ToString()) // item value // Change the item value in the queue. item, err = pq.Update(item.Priority, item.ID, []byte("new item value")) if err != nil { fmt.Println(err) return } fmt.Println(item.ToString()) // new item value // Dequeue the next item. deqItem, err := pq.Dequeue() if err != nil { fmt.Println(err) return } fmt.Println(deqItem.ToString()) // new item value // Delete the queue and its database. pq.Drop()
Output:
Example (Queue) ¶
ExampleQueue demonstrates the implementation of a Goque queue.
// Open/create a queue. q, err := goque.OpenQueue("data_dir") if err != nil { fmt.Println(err) return } defer q.Close() // Enqueue an item. item, err := q.Enqueue([]byte("item value")) if err != nil { fmt.Println(err) return } fmt.Println(item.ID) // 1 fmt.Println(item.Key) // [0 0 0 0 0 0 0 1] fmt.Println(item.Value) // [105 116 101 109 32 118 97 108 117 101] fmt.Println(item.ToString()) // item value // Change the item value in the queue. item, err = q.Update(item.ID, []byte("new item value")) if err != nil { fmt.Println(err) return } fmt.Println(item.ToString()) // new item value // Dequeue the next item. deqItem, err := q.Dequeue() if err != nil { fmt.Println(err) return } fmt.Println(deqItem.ToString()) // new item value // Delete the queue and its database. q.Drop()
Output:
Example (Stack) ¶
ExampleStack demonstrates the implementation of a Goque stack.
// Open/create a stack. s, err := goque.OpenStack("data_dir") if err != nil { fmt.Println(err) return } defer s.Close() // Push an item onto the stack. item, err := s.Push([]byte("item value")) if err != nil { fmt.Println(err) return } fmt.Println(item.ID) // 1 fmt.Println(item.Key) // [0 0 0 0 0 0 0 1] fmt.Println(item.Value) // [105 116 101 109 32 118 97 108 117 101] fmt.Println(item.ToString()) // item value // Change the item value in the stack. item, err = s.Update(item.ID, []byte("new item value")) if err != nil { fmt.Println(err) return } fmt.Println(item.ToString()) // new item value // Pop an item off the stack. popItem, err := s.Pop() if err != nil { fmt.Println(err) return } fmt.Println(popItem.ToString()) // new item value // Delete the stack and its database. s.Drop()
Output:
Index ¶
- Constants
- Variables
- type Item
- type PrefixQueue
- func (pq *PrefixQueue) Close() error
- func (pq *PrefixQueue) Dequeue(prefix []byte) (*Item, error)
- func (pq *PrefixQueue) DequeueString(prefix string) (*Item, error)
- func (pq *PrefixQueue) Drop() error
- func (pq *PrefixQueue) Enqueue(prefix, value []byte) (*Item, error)
- func (pq *PrefixQueue) EnqueueObject(prefix []byte, value interface{}) (*Item, error)
- func (pq *PrefixQueue) EnqueueObjectAsJSON(prefix []byte, value interface{}) (*Item, error)
- func (pq *PrefixQueue) EnqueueString(prefix, value string) (*Item, error)
- func (pq *PrefixQueue) Length() uint64
- func (pq *PrefixQueue) Peek(prefix []byte) (*Item, error)
- func (pq *PrefixQueue) PeekByID(prefix []byte, id uint64) (*Item, error)
- func (pq *PrefixQueue) PeekByIDString(prefix string, id uint64) (*Item, error)
- func (pq *PrefixQueue) PeekString(prefix string) (*Item, error)
- func (pq *PrefixQueue) Update(prefix []byte, id uint64, newValue []byte) (*Item, error)
- func (pq *PrefixQueue) UpdateObject(prefix []byte, id uint64, newValue interface{}) (*Item, error)
- func (pq *PrefixQueue) UpdateObjectAsJSON(prefix []byte, id uint64, newValue interface{}) (*Item, error)
- func (pq *PrefixQueue) UpdateString(prefix string, id uint64, value string) (*Item, error)
- type PriorityItem
- type PriorityQueue
- func (pq *PriorityQueue) Close() error
- func (pq *PriorityQueue) Dequeue() (*PriorityItem, error)
- func (pq *PriorityQueue) DequeueByPriority(priority uint8) (*PriorityItem, error)
- func (pq *PriorityQueue) Drop() error
- func (pq *PriorityQueue) Enqueue(priority uint8, value []byte) (*PriorityItem, error)
- func (pq *PriorityQueue) EnqueueObject(priority uint8, value interface{}) (*PriorityItem, error)
- func (pq *PriorityQueue) EnqueueObjectAsJSON(priority uint8, value interface{}) (*PriorityItem, error)
- func (pq *PriorityQueue) EnqueueString(priority uint8, value string) (*PriorityItem, error)
- func (pq *PriorityQueue) Length() uint64
- func (pq *PriorityQueue) Peek() (*PriorityItem, error)
- func (pq *PriorityQueue) PeekByOffset(offset uint64) (*PriorityItem, error)
- func (pq *PriorityQueue) PeekByPriorityID(priority uint8, id uint64) (*PriorityItem, error)
- func (pq *PriorityQueue) Update(priority uint8, id uint64, newValue []byte) (*PriorityItem, error)
- func (pq *PriorityQueue) UpdateObject(priority uint8, id uint64, newValue interface{}) (*PriorityItem, error)
- func (pq *PriorityQueue) UpdateObjectAsJSON(priority uint8, id uint64, newValue interface{}) (*PriorityItem, error)
- func (pq *PriorityQueue) UpdateString(priority uint8, id uint64, newValue string) (*PriorityItem, error)
- type Queue
- func (q *Queue) Close() error
- func (q *Queue) Dequeue() (*Item, error)
- func (q *Queue) DequeueBlock() (*Item, error)
- func (q *Queue) Drop() error
- func (q *Queue) Enqueue(value []byte) (*Item, error)
- func (q *Queue) EnqueueObject(value interface{}) (*Item, error)
- func (q *Queue) EnqueueObjectAsJSON(value interface{}) (*Item, error)
- func (q *Queue) EnqueueString(value string) (*Item, error)
- func (q *Queue) Length() uint64
- func (q *Queue) Peek() (*Item, error)
- func (q *Queue) PeekBlock() (*Item, error)
- func (q *Queue) PeekByID(id uint64) (*Item, error)
- func (q *Queue) PeekByOffset(offset uint64) (*Item, error)
- func (q *Queue) Update(id uint64, newValue []byte) (*Item, error)
- func (q *Queue) UpdateObject(id uint64, newValue interface{}) (*Item, error)
- func (q *Queue) UpdateObjectAsJSON(id uint64, newValue interface{}) (*Item, error)
- func (q *Queue) UpdateString(id uint64, newValue string) (*Item, error)
- type Stack
- func (s *Stack) Close() error
- func (s *Stack) Drop() error
- func (s *Stack) Length() uint64
- func (s *Stack) Peek() (*Item, error)
- func (s *Stack) PeekByID(id uint64) (*Item, error)
- func (s *Stack) PeekByOffset(offset uint64) (*Item, error)
- func (s *Stack) Pop() (*Item, error)
- func (s *Stack) Push(value []byte) (*Item, error)
- func (s *Stack) PushObject(value interface{}) (*Item, error)
- func (s *Stack) PushObjectAsJSON(value interface{}) (*Item, error)
- func (s *Stack) PushString(value string) (*Item, error)
- func (s *Stack) Update(id uint64, newValue []byte) (*Item, error)
- func (s *Stack) UpdateObject(id uint64, newValue interface{}) (*Item, error)
- func (s *Stack) UpdateObjectAsJSON(id uint64, newValue interface{}) (*Item, error)
- func (s *Stack) UpdateString(id uint64, newValue string) (*Item, error)
Examples ¶
Constants ¶
const ( ASC order = iota // Set priority level 0 as most important. DESC // Set priority level 255 as most important. )
Defines which priority order to dequeue in.
Variables ¶
var ( // ErrIncompatibleType is returned when the opener type is // incompatible with the stored Goque type. ErrIncompatibleType = errors.New("goque: Opener type is incompatible with stored Goque type") // ErrEmpty is returned when the stack or queue is empty. ErrEmpty = errors.New("goque: Stack or queue is empty") // ErrOutOfBounds is returned when the ID used to lookup an item // is outside of the range of the stack or queue. ErrOutOfBounds = errors.New("goque: ID used is outside range of stack or queue") // ErrDBClosed is returned when the Close function has already // been called, causing the stack or queue to close, as well as // its underlying database. ErrDBClosed = errors.New("goque: Database is closed") )
Functions ¶
This section is empty.
Types ¶
type Item ¶
Item represents an entry in either a stack or queue.
func (*Item) ToObject ¶
ToObject decodes the item value into the given value type using encoding/gob.
The value passed to this method should be a pointer to a variable of the type you wish to decode into. The variable pointed to will hold the decoded object.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to decode simple types.
func (*Item) ToObjectFromJSON ¶
ToObjectFromJSON decodes the item value into the given value type using encoding/json.
The value passed to this method should be a pointer to a variable of the type you wish to decode into. The variable pointed to will hold the decoded object.
type PrefixQueue ¶
PrefixQueue is a standard FIFO (first in, first out) queue that separates each given prefix into its own queue.
func OpenPrefixQueue ¶
func OpenPrefixQueue(dataDir string) (*PrefixQueue, error)
OpenPrefixQueue opens a prefix queue if one exists at the given directory. If one does not already exist, a new prefix queue is created.
func (*PrefixQueue) Close ¶
func (pq *PrefixQueue) Close() error
Close closes the LevelDB database of the prefix queue.
func (*PrefixQueue) Dequeue ¶
func (pq *PrefixQueue) Dequeue(prefix []byte) (*Item, error)
Dequeue removes the next item in the prefix queue and returns it.
func (*PrefixQueue) DequeueString ¶
func (pq *PrefixQueue) DequeueString(prefix string) (*Item, error)
DequeueString is a helper function for Dequeue that accepts the prefix as a string rather than a byte slice.
func (*PrefixQueue) Drop ¶
func (pq *PrefixQueue) Drop() error
Drop closes and deletes the LevelDB database of the prefix queue.
func (*PrefixQueue) Enqueue ¶
func (pq *PrefixQueue) Enqueue(prefix, value []byte) (*Item, error)
Enqueue adds an item to the queue.
func (*PrefixQueue) EnqueueObject ¶
func (pq *PrefixQueue) EnqueueObject(prefix []byte, value interface{}) (*Item, error)
EnqueueObject is a helper function for Enqueue that accepts any value type, which is then encoded into a byte slice using encoding/gob.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to encode simple types.
func (*PrefixQueue) EnqueueObjectAsJSON ¶
func (pq *PrefixQueue) EnqueueObjectAsJSON(prefix []byte, value interface{}) (*Item, error)
EnqueueObjectAsJSON is a helper function for Enqueue that accepts any value type, which is then encoded into a JSON byte slice using encoding/json.
Use this function to handle encoding of complex types.
func (*PrefixQueue) EnqueueString ¶
func (pq *PrefixQueue) EnqueueString(prefix, value string) (*Item, error)
EnqueueString is a helper function for Enqueue that accepts the prefix and value as a string rather than a byte slice.
func (*PrefixQueue) Length ¶
func (pq *PrefixQueue) Length() uint64
Length returns the total number of items in the prefix queue.
func (*PrefixQueue) Peek ¶
func (pq *PrefixQueue) Peek(prefix []byte) (*Item, error)
Peek returns the next item in the given queue without removing it.
func (*PrefixQueue) PeekByID ¶
func (pq *PrefixQueue) PeekByID(prefix []byte, id uint64) (*Item, error)
PeekByID returns the item with the given ID without removing it.
func (*PrefixQueue) PeekByIDString ¶
func (pq *PrefixQueue) PeekByIDString(prefix string, id uint64) (*Item, error)
PeekByIDString is a helper function for Peek that accepts the prefix as a string rather than a byte slice.
func (*PrefixQueue) PeekString ¶
func (pq *PrefixQueue) PeekString(prefix string) (*Item, error)
PeekString is a helper function for Peek that accepts the prefix as a string rather than a byte slice.
func (*PrefixQueue) Update ¶
Update updates an item in the given queue without changing its position.
func (*PrefixQueue) UpdateObject ¶
func (pq *PrefixQueue) UpdateObject(prefix []byte, id uint64, newValue interface{}) (*Item, error)
UpdateObject is a helper function for Update that accepts any value type, which is then encoded into a byte slice using encoding/gob.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to encode simple types.
func (*PrefixQueue) UpdateObjectAsJSON ¶
func (pq *PrefixQueue) UpdateObjectAsJSON(prefix []byte, id uint64, newValue interface{}) (*Item, error)
UpdateObjectAsJSON is a helper function for Update that accepts any value type, which is then encoded into a JSON byte slice using encoding/json.
Use this function to handle encoding of complex types.
func (*PrefixQueue) UpdateString ¶
UpdateString is a helper function for Update that accepts the prefix and value as a string rather than a byte slice.
type PriorityItem ¶
PriorityItem represents an entry in a priority queue.
func (*PriorityItem) ToObject ¶
func (pi *PriorityItem) ToObject(value interface{}) error
ToObject decodes the item value into the given value type using encoding/gob.
The value passed to this method should be a pointer to a variable of the type you wish to decode into. The variable pointed to will hold the decoded object.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to decode simple types.
func (*PriorityItem) ToObjectFromJSON ¶
func (pi *PriorityItem) ToObjectFromJSON(value interface{}) error
ToObjectFromJSON decodes the item value into the given value type using encoding/json.
The value passed to this method should be a pointer to a variable of the type you wish to decode into. The variable pointed to will hold the decoded object.
func (*PriorityItem) ToString ¶
func (pi *PriorityItem) ToString() string
ToString returns the priority item value as a string.
type PriorityQueue ¶
PriorityQueue is a standard FIFO (first in, first out) queue with priority levels.
func OpenPriorityQueue ¶
func OpenPriorityQueue(dataDir string, order order) (*PriorityQueue, error)
OpenPriorityQueue opens a priority queue if one exists at the given directory. If one does not already exist, a new priority queue is created.
func (*PriorityQueue) Close ¶
func (pq *PriorityQueue) Close() error
Close closes the LevelDB database of the priority queue.
func (*PriorityQueue) Dequeue ¶
func (pq *PriorityQueue) Dequeue() (*PriorityItem, error)
Dequeue removes the next item in the priority queue and returns it.
func (*PriorityQueue) DequeueByPriority ¶
func (pq *PriorityQueue) DequeueByPriority(priority uint8) (*PriorityItem, error)
DequeueByPriority removes the next item in the given priority level and returns it.
func (*PriorityQueue) Drop ¶
func (pq *PriorityQueue) Drop() error
Drop closes and deletes the LevelDB database of the priority queue.
func (*PriorityQueue) Enqueue ¶
func (pq *PriorityQueue) Enqueue(priority uint8, value []byte) (*PriorityItem, error)
Enqueue adds an item to the priority queue.
func (*PriorityQueue) EnqueueObject ¶
func (pq *PriorityQueue) EnqueueObject(priority uint8, value interface{}) (*PriorityItem, error)
EnqueueObject is a helper function for Enqueue that accepts any value type, which is then encoded into a byte slice using encoding/gob.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to encode simple types.
func (*PriorityQueue) EnqueueObjectAsJSON ¶
func (pq *PriorityQueue) EnqueueObjectAsJSON(priority uint8, value interface{}) (*PriorityItem, error)
EnqueueObjectAsJSON is a helper function for Enqueue that accepts any value type, which is then encoded into a JSON byte slice using encoding/json.
Use this function to handle encoding of complex types.
func (*PriorityQueue) EnqueueString ¶
func (pq *PriorityQueue) EnqueueString(priority uint8, value string) (*PriorityItem, error)
EnqueueString is a helper function for Enqueue that accepts a value as a string rather than a byte slice.
func (*PriorityQueue) Length ¶
func (pq *PriorityQueue) Length() uint64
Length returns the total number of items in the priority queue.
func (*PriorityQueue) Peek ¶
func (pq *PriorityQueue) Peek() (*PriorityItem, error)
Peek returns the next item in the priority queue without removing it.
func (*PriorityQueue) PeekByOffset ¶
func (pq *PriorityQueue) PeekByOffset(offset uint64) (*PriorityItem, error)
PeekByOffset returns the item located at the given offset, starting from the head of the queue, without removing it.
func (*PriorityQueue) PeekByPriorityID ¶
func (pq *PriorityQueue) PeekByPriorityID(priority uint8, id uint64) (*PriorityItem, error)
PeekByPriorityID returns the item with the given ID and priority without removing it.
func (*PriorityQueue) Update ¶
func (pq *PriorityQueue) Update(priority uint8, id uint64, newValue []byte) (*PriorityItem, error)
Update updates an item in the priority queue without changing its position.
func (*PriorityQueue) UpdateObject ¶
func (pq *PriorityQueue) UpdateObject(priority uint8, id uint64, newValue interface{}) (*PriorityItem, error)
UpdateObject is a helper function for Update that accepts any value type, which is then encoded into a byte slice using encoding/gob.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to encode simple types.
func (*PriorityQueue) UpdateObjectAsJSON ¶
func (pq *PriorityQueue) UpdateObjectAsJSON(priority uint8, id uint64, newValue interface{}) (*PriorityItem, error)
UpdateObjectAsJSON is a helper function for Update that accepts any value type, which is then encoded into a JSON byte slice using encoding/json.
Use this function to handle encoding of complex types.
func (*PriorityQueue) UpdateString ¶
func (pq *PriorityQueue) UpdateString(priority uint8, id uint64, newValue string) (*PriorityItem, error)
UpdateString is a helper function for Update that accepts a value as a string rather than a byte slice.
type Queue ¶
type Queue struct { DataDir string // contains filtered or unexported fields }
Queue is a standard FIFO (first in, first out) queue.
func OpenQueue ¶
OpenQueue opens a queue if one exists at the given directory. If one does not already exist, a new queue is created.
func (*Queue) DequeueBlock ¶
func (*Queue) EnqueueObject ¶
EnqueueObject is a helper function for Enqueue that accepts any value type, which is then encoded into a byte slice using encoding/gob.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to encode simple types.
func (*Queue) EnqueueObjectAsJSON ¶
EnqueueObjectAsJSON is a helper function for Enqueue that accepts any value type, which is then encoded into a JSON byte slice using encoding/json.
Use this function to handle encoding of complex types.
func (*Queue) EnqueueString ¶
EnqueueString is a helper function for Enqueue that accepts a value as a string rather than a byte slice.
func (*Queue) PeekByOffset ¶
PeekByOffset returns the item located at the given offset, starting from the head of the queue, without removing it.
func (*Queue) UpdateObject ¶
UpdateObject is a helper function for Update that accepts any value type, which is then encoded into a byte slice using encoding/gob.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to encode simple types.
func (*Queue) UpdateObjectAsJSON ¶
UpdateObjectAsJSON is a helper function for Update that accepts any value type, which is then encoded into a JSON byte slice using encoding/json.
Use this function to handle encoding of complex types.
type Stack ¶
Stack is a standard LIFO (last in, first out) stack.
func OpenStack ¶
OpenStack opens a stack if one exists at the given directory. If one does not already exist, a new stack is created.
func (*Stack) PeekByOffset ¶
PeekByOffset returns the item located at the given offset, starting from the head of the stack, without removing it.
func (*Stack) PushObject ¶
PushObject is a helper function for Push that accepts any value type, which is then encoded into a byte slice using encoding/gob.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to encode simple types.
func (*Stack) PushObjectAsJSON ¶
PushObjectAsJSON is a helper function for Push that accepts any value type, which is then encoded into a JSON byte slice using encoding/json.
Use this function to handle encoding of complex types.
func (*Stack) PushString ¶
PushString is a helper function for Push that accepts a value as a string rather than a byte slice.
func (*Stack) UpdateObject ¶
UpdateObject is a helper function for Update that accepts any value type, which is then encoded into a byte slice using encoding/gob.
Objects containing pointers with zero values will decode to nil when using this function. This is due to how the encoding/gob package works. Because of this, you should only use this function to encode simple types.
func (*Stack) UpdateObjectAsJSON ¶
UpdateObjectAsJSON is a helper function for Update that accepts any value type, which is then encoded into a JSON byte slice using encoding/json.
Use this function to handle encoding of complex types.