美文网首页
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(六)元素的插入

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