美文网首页
BoltDB(六)元素的插入

BoltDB(六)元素的插入

作者: wayyyy | 来源:发表于2022-08-16 03:30 被阅读0次
// Put sets the value for a key in the bucket.
// If the key exist then its previous value will be overwritten.
// Supplied value must remain valid for the life of the transaction.
// Returns an error if the bucket was created from a read-only transaction,
// if the key is blank, if the key is too large, or if the value is too large.
func (b *Bucket) Put(key []byte, value []byte) error {
    if b.tx.db == nil {
        return ErrTxClosed
    } else if !b.Writable() {
        return ErrTxNotWritable
    } else if len(key) == 0 {
        return ErrKeyRequired
    } else if len(key) > MaxKeySize {
        return ErrKeyTooLarge
    } else if int64(len(value)) > MaxValueSize {
        return ErrValueTooLarge
    }
    // Move cursor to correct position.
    c := b.Cursor()
    k, _, flags := c.seek(key)
    // Return an error if there is an existing key with a bucket value.
    if bytes.Equal(key, k) && (flags&bucketLeafFlag) != 0 {
        return ErrIncompatibleValue
    }
    // Insert into node.
    key = cloneBytes(key)
    c.node().put(key, key, value, 0, 0)
    return nil
}

c.seek在前文已经描述,这里只看看

// c.node()已经定位到要插入的page对应的内存数据结构node

func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) {
    if pgid >= n.bucket.tx.meta.pgid {
        panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", pgid, n.bucket.tx.meta.pgid))
    } else if len(oldKey) <= 0 {
        panic("put: zero-length old key")
    } else if len(newKey) <= 0 {
        panic("put: zero-length new key")
    }

    // Find insertion index.
    index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, oldKey) != -1 })

    // Add capacity and shift nodes if we don't have an exact match and need to insert.
    exact := (len(n.inodes) > 0 && index < len(n.inodes) && bytes.Equal(n.inodes[index].key, oldKey))
    if !exact {
        n.inodes = append(n.inodes, inode{})
        copy(n.inodes[index+1:], n.inodes[index:])
    }

    inode := &n.inodes[index]
    inode.flags = flags
    inode.key = newKey
    inode.value = value
    inode.pgid = pgid
    _assert(len(inode.key) > 0, "put: zero-length inode key")
}

相关文章

  • BoltDB(六)元素的插入

    c.seek在前文已经描述,这里只看看

  • BoltDB(五)元素的查找

    一个 Bucket 就是一棵 B+ 树,从元素的查找从上到下分为: 首先找到 Bucket 的根节点。也就是 B+...

  • DOM 操作写法示例

    选取元素 遍历元素 创建元素 复制元素 元素的末尾插入子元素 元素的开始插入子元素 当前元素前面插入元素 当前元素...

  • jQuery 写法示例

    选择元素 遍历元素 创建元素 复制元素 元素的末尾插入子元素 元素的开始插入子元素 当前元素前面插入元素 当前元素...

  • splice 用法

    splice 的功能: 删除元素/ 插入元素/ 替换元素 删除元素的用法: 替换元素 插入元素, 和替换元素的差别...

  • boltdb源码阅读

    前言 最近抽时间看了boltdb的源码[https://github.com/boltdb/bolt],代码量不大...

  • 利用数组实现堆

    成员变量 元素个数N包含元素的数组items 方法 插入删除 插入实现 1 将元素直接插入到最后一个元素(N),N...

  • JQuery02-文档操作

    1 内部插入文档 2 外部插入文档 3 包括元素 4 替换元素 5 删除元素 6 克隆元素

  • jquery基础2

    今天继续介绍jQuerydom操作内部插入:append()插入到该元素的最后面prepend()插入到元素的最前...

  • 堆的相关操作与堆排序

    堆中插入、删除元素 先看图解: 堆中插入元素 插入元素总是插入在数组中的最后一个位置,然后从其父节点依次向上调整堆...

网友评论

      本文标题:BoltDB(六)元素的插入

      本文链接:https://www.haomeiwen.com/subject/zzfkgrtx.html