| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package index
- import (
- "TsDB2/DB/core/page"
- "unsafe"
- )
- // insertEntrySorted 鍦ㄧ储寮曢〉涓湁搴忔彃鍏ヤ竴涓潯鐩?
- func insertEntrySorted(buf []byte, hdr *page.IndexHead, entry []byte) {
- entryLen := int(hdr.EntryLen)
- count := int(hdr.Count)
- entries := buf[page.IndexHeadSize : page.IndexHeadSize+count*entryLen]
- pos := count
- left, right := 0, count-1
- for left <= right {
- mid := (left + right) / 2
- midEntry := entries[mid*entryLen : (mid+1)*entryLen]
- cmp := compareEntryKeys(midEntry, entry, entryLen-4)
- if cmp >= 0 {
- pos = mid
- right = mid - 1
- } else {
- left = mid + 1
- }
- }
- allEntries := buf[page.IndexHeadSize : page.IndexHeadSize+(count+1)*entryLen]
- copy(allEntries[(pos+1)*entryLen:(count+1)*entryLen], allEntries[pos*entryLen:count*entryLen])
- copy(allEntries[pos*entryLen:(pos+1)*entryLen], entry)
- hdr.Count++
- hdr.Hdr.UseSize += uint32(entryLen)
- }
- func compareEntryKeys(a, b []byte, keyLen int) int {
- for i := 0; i < keyLen; i++ {
- if a[i] < b[i] {
- return -1
- }
- if a[i] > b[i] {
- return 1
- }
- }
- return 0
- }
- // writeToNewIndexPage 鍒涘缓鏂扮殑绱㈠紩椤碉紝鍐欏叆涓€涓潯鐩紝骞堕摼鎺ュ埌绱㈠紩閾?
- func writeToNewIndexPage(handle page.HandleDb, entryPage *uint32, entry []byte, lastIdxPageID uint32) error {
- newIdxPID := handle.NewPage()
- newBuf := make([]byte, page.IndexPageSize)
- newHdr := (*page.IndexHead)(unsafe.Pointer(&newBuf[0]))
- newHdr.Hdr.Type = page.IndexDataIndex
- newHdr.Hdr.PageID = newIdxPID
- newHdr.Hdr.UseSize = uint32(page.IndexHeadSize) + uint32(len(entry))
- newHdr.EntryLen = uint16(len(entry))
- newHdr.IsLeaf = 1
- newHdr.Count = 1
- copy(newBuf[page.IndexHeadSize:], entry)
- _ = handle.SavePage(newIdxPID, newBuf)
- if *entryPage == 0 {
- *entryPage = newIdxPID
- } else if lastIdxPageID != 0 {
- linkBuf := make([]byte, page.IndexPageSize)
- if err := handle.ReadPage(lastIdxPageID, linkBuf); err == nil {
- linkHdr := (*page.IndexHead)(unsafe.Pointer(&linkBuf[0]))
- linkHdr.Hdr.NextPage = newIdxPID
- _ = handle.SavePage(lastIdxPageID, linkBuf)
- }
- }
- return nil
- }
|