Jump To …

Cursor.coffee

EventEmitter = (require 'events').EventEmitter
ListNode = (require '../list/ListNode.coffee').ListNode
ExodusError = (require '../errors/ExodusError.coffee').ExodusError

class Cursor extends EventEmitter

@private

  store: undefined

@private

  txn: undefined

@private

  node: undefined

@private

  begin: undefined

@private

  end: undefined

@private

  isClosed: undefined

  @create$Store$TransactionDescriptor: (store, txn, o) ->
    if !o? then o = new Cursor()
    o.store = store
    o.txn = txn
    o.node = ListNode.create$Log store.getList().log
    o.node.next = store.getList().rootNode.next
    o.node.nextAddr = store.getList().rootNode.nextAddr
    o.begin = true
    o.end = false
    o.isClosed = false
    return o

Move to next record.

@return boolean

  getNext$emit: () ->
    oldnode = @node
    @node = @node.next
    if @node?
      @node.once 'getNode', (ok, newnode) =>
        if ok? && !newnode.isEmpty()
          @begin = false
          @node = newnode
          @node.prev = oldnode
          @emit 'getNext', true
        else
          @end = true
          @node = oldnode
          @emit 'getNext', false
      @node.getNode()
    else
      @end = true
      @emit 'getNext', @node?

Move to next record.

@return boolean TODO getNextDup: () ->

TODO getNextNoDup: () ->

  getLast$emit: () ->
    @begin = false
    @end = true
    if @node.next?
      @once 'getNext', (success) =>
        if success
          @getLast$emit()
        else
          @emit 'getLast', true
      @getNext$emit()
    else
      @emit 'getLast', true

Move to previous record.

@return

  getPrev: () ->
    if @node.prev? && !@node.prev.keyAddr.equals$Addr64 @node.nullAddr
      @node = @node.prev
      @end = false
      return true
    else
      @begin = true
      return false

Move to previous record.

@return TODO getPrevDup: () ->

TODO getPrevNoDup: () ->

  getKey: () ->
    return @node.key

  getValue: () ->
    return @node.value

ByteIterable Nullable TODO getSearchKey$ByteIterable: (key) ->

ByteIterable Nullable TODO getSearchKeyRange$ByteIterable: (key) ->

boolean TODO getSearchBoth$ByteIterable$ByteIterable: (key, value) ->

ByteIterable Nullable TODO getSearchBothRange$ByteIterable$ByteIterable: (key, value) ->

  count: () ->
    return @store.count()

  close: () ->
    if @isClosed
      throw new ExodusError "Cursor is already closed"
    @isClosed = true

  deleteCurrent: () ->
    if @begin
      return false
    else
      @node = @store.getList().deleteNode$ListNode @node
      return true

exports.Cursor = Cursor