Table.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. package DB
  2. import (
  3. "TsDB2/DB/page"
  4. "TsDB2/DB/types"
  5. "TsDB2/DB/util"
  6. "encoding/binary"
  7. "strings"
  8. "unsafe"
  9. )
  10. type RtFieldOffset struct {
  11. PageID uint32 // 页号
  12. Offset uint16 // 开始偏移
  13. }
  14. type FieldOffset struct {
  15. PageID uint32 // 页号
  16. StartOffset uint16 // 开始偏移
  17. EndOffset uint16 // 相对开始偏移
  18. }
  19. type TableInfo struct {
  20. Name [TableNameSize]byte
  21. Flag byte // 表的状态是否被删除
  22. FieldCount byte // 当前字段的总数量(包含已删除,永不减少)byte=255上限
  23. ActiveFieldCount byte // 实际活跃字段数量(不包含已删除)
  24. TotalRows uint64 // 当前表行的总数量
  25. FirstHeap uint32 // 堆链首页
  26. LastHeap uint32 // 堆链尾页
  27. FirstData uint32 // 数据链首页
  28. LastData uint32 // 数据链尾
  29. RowSize uint16 // 单条记录大小(字节)
  30. FieldAllocateSize uint16 // 当前列总分配大小
  31. IndexCount byte // 这张表有几个索引
  32. FirstIndexID uint32 // 本表第一个索引的元数据位置
  33. LastIndexID uint32 // 本表最后一个索引的元数据位置
  34. FirstOverflow uint32 // 字段溢出页首页(0表示无溢出)
  35. LastOverflow uint32 // 字段溢出页尾页
  36. }
  37. // ReadFieldsChain 读取字段链(支持溢出页)
  38. func (info *TableInfo) ReadFieldsChain(handle page.HandleDb, curPageID uint32, startOff uint16) ([]types.FieldInfo, FieldOffset) {
  39. var fields []types.FieldInfo
  40. total := int(info.FieldCount)
  41. readCount := 0
  42. readBlock := func(buf []byte, blockStart uint16) (*RtFieldOffset, uint32) {
  43. blockCount := int(buf[blockStart])
  44. if blockCount == 0 {
  45. return nil, 1
  46. }
  47. off := uint32(blockStart + 1)
  48. for i := 0; i < blockCount; i++ {
  49. typ := buf[off]
  50. nameLen := buf[off+1]
  51. name := make([]byte, nameLen)
  52. copy(name, buf[off+2:off+2+uint32(nameLen)])
  53. fields = append(fields, types.FieldInfo{
  54. FieldType: types.FieldType(typ),
  55. FieldName: name,
  56. })
  57. off += 2 + uint32(nameLen)
  58. }
  59. readCount += blockCount
  60. if readCount < total {
  61. var filedOffset = (*RtFieldOffset)(unsafe.Pointer(&buf[off]))
  62. return filedOffset, off - uint32(blockStart)
  63. }
  64. return nil, off - uint32(blockStart)
  65. }
  66. mainBuf := make([]byte, PageSize)
  67. _ = handle.ReadPage(curPageID, mainBuf)
  68. fieldOffset, offset := readBlock(mainBuf, startOff)
  69. if fieldOffset == nil {
  70. return fields, FieldOffset{
  71. PageID: curPageID,
  72. StartOffset: startOff,
  73. EndOffset: uint16(offset),
  74. }
  75. }
  76. currentPage := fieldOffset.PageID
  77. currentOffset := uint32(fieldOffset.Offset)
  78. var curFieldOffset = fieldOffset
  79. for currentPage != 0 && readCount < total {
  80. hp, err := LoadHeapPage(handle, currentPage)
  81. if err != nil {
  82. break
  83. }
  84. fieldOffset, currentOffset = readBlock(hp.Get(), fieldOffset.Offset)
  85. if readCount == total {
  86. break
  87. }
  88. currentPage = fieldOffset.PageID
  89. curFieldOffset = fieldOffset
  90. }
  91. return fields, FieldOffset{
  92. PageID: curFieldOffset.PageID,
  93. StartOffset: curFieldOffset.Offset,
  94. EndOffset: uint16(currentOffset),
  95. }
  96. }
  97. type Table struct {
  98. info *TableInfo
  99. Field []types.FieldInfo
  100. handle page.HandleDb
  101. indexMeta *IndexMetaPage
  102. tablePageID uint32 // 表ID
  103. tableStartOffset uint32 // 表所在页的偏移
  104. curOffset FieldOffset // 当前Field可以写的偏移位置
  105. }
  106. func (table *Table) CreateIndex(idxName string, typ page.IndexType, fields []byte) (*IndexMeta, error) {
  107. return table.indexMeta.CreateIndex(idxName, typ, fields)
  108. }
  109. func (table *Table) DropIndex(idx string) error { return table.indexMeta.DropIndex(idx) }
  110. // findFieldIndex 查找字段索引
  111. func (table *Table) findFieldIndex(name string) int {
  112. for i, field := range table.Field {
  113. if string(field.FieldName) == name {
  114. return i
  115. }
  116. }
  117. return -1
  118. }
  119. // calcFieldOffset 计算字段在行中的偏移
  120. func (table *Table) calcFieldOffset(fieldIdx int) uint16 {
  121. var offset uint16 = 0
  122. for i := 0; i < fieldIdx; i++ {
  123. offset += types.GetSize(table.Field[i].FieldType)
  124. }
  125. return offset
  126. }
  127. // compareValue 比较字段值是否相等
  128. func (table *Table) compareValue(row []byte, offset uint16, typ types.FieldType, value interface{}) bool {
  129. switch typ {
  130. case types.FieldType_1byte:
  131. return row[offset] == value.(byte)
  132. case types.FieldType_2byte:
  133. stored := binary.BigEndian.Uint16(row[offset:])
  134. return stored == uint16(value.(int16))
  135. case types.FieldType_4byte:
  136. stored := binary.BigEndian.Uint32(row[offset:])
  137. return stored == uint32(value.(int32))
  138. case types.FieldType_8byte:
  139. stored := binary.BigEndian.Uint64(row[offset:])
  140. return stored == value.(uint64)
  141. case types.FieldType_256byte:
  142. stored := strings.TrimRight(string(row[offset:offset+256]), "\x00")
  143. return stored == string(value.([]byte))
  144. }
  145. return false
  146. }
  147. // compareGreater 比较字段值是否大于给定值
  148. func (table *Table) compareGreater(row []byte, offset uint16, typ types.FieldType, value interface{}) bool {
  149. switch typ {
  150. case types.FieldType_8byte:
  151. stored := binary.BigEndian.Uint64(row[offset:])
  152. return stored > value.(uint64)
  153. case types.FieldType_4byte:
  154. stored := binary.BigEndian.Uint32(row[offset:])
  155. return stored > uint32(value.(int32))
  156. }
  157. return false
  158. }
  159. // compareLess 比较字段值是否小于给定值
  160. func (table *Table) compareLess(row []byte, offset uint16, typ types.FieldType, value interface{}) bool {
  161. switch typ {
  162. case types.FieldType_8byte:
  163. stored := binary.BigEndian.Uint64(row[offset:])
  164. return stored < value.(uint64)
  165. }
  166. return false
  167. }
  168. // compareGreaterOrEqual 比较字段值是否大于等于给定值
  169. func (table *Table) compareGreaterOrEqual(row []byte, offset uint16, typ types.FieldType, value interface{}) bool {
  170. return table.compareGreater(row, offset, typ, value) || table.compareValue(row, offset, typ, value)
  171. }
  172. // compareLessOrEqual 比较字段值是否小于等于给定值
  173. func (table *Table) compareLessOrEqual(row []byte, offset uint16, typ types.FieldType, value interface{}) bool {
  174. return table.compareLess(row, offset, typ, value) || table.compareValue(row, offset, typ, value)
  175. }
  176. func (table *Table) GetFieldCount() byte { return table.info.FieldCount }
  177. func (table *Table) GetActiveFieldCount() byte { return table.info.ActiveFieldCount }
  178. func (table *Table) GetFieldAllocateSize() uint16 { return table.info.FieldAllocateSize }
  179. func (table *Table) GetFirstOverflow() uint32 { return table.info.FirstOverflow }
  180. func (table *Table) GetLastOverflow() uint32 { return table.info.LastOverflow }
  181. func (table *Table) GetFirstData() uint32 { return table.info.FirstData }
  182. func (table *Table) GetFields() []types.FieldInfo {
  183. return table.Field
  184. }
  185. func (table *Table) findFieldByName(name []byte) *types.FieldInfo {
  186. target := util.BytesToString(name)
  187. for i := range table.Field {
  188. if util.BytesToString(table.Field[i].FieldName) == target {
  189. return &table.Field[i]
  190. }
  191. }
  192. return nil
  193. }
  194. func (table *Table) writeField(buf []byte, f types.FieldInfo) (*RtFieldOffset, bool) {
  195. allocSize := int(table.info.FieldAllocateSize)
  196. // 🔥 核心修复:动态获取当前缓冲区的真实长度(自动适配主页/溢出块)
  197. bufLen := len(buf)
  198. fieldSize := 2 + len(f.FieldName)
  199. // 基础校验:块起始位置不能超出缓冲区
  200. if int(table.curOffset.StartOffset) >= bufLen {
  201. return nil, false
  202. }
  203. if allocSize-6 < int(table.curOffset.EndOffset)+fieldSize {
  204. jump := (*RtFieldOffset)(unsafe.Pointer(&buf[table.curOffset.EndOffset+table.curOffset.StartOffset]))
  205. return jump, false
  206. }
  207. blockStart := table.curOffset.StartOffset
  208. blockFieldCount := buf[blockStart]
  209. off := table.curOffset.EndOffset + table.curOffset.StartOffset
  210. buf[off] = byte(f.FieldType)
  211. off++
  212. buf[off] = uint8(len(f.FieldName))
  213. off++
  214. copy(buf[off:], f.FieldName)
  215. // 字段计数+1
  216. buf[blockStart] = blockFieldCount + 1
  217. table.curOffset.EndOffset += uint16(len(f.FieldName)) + 2
  218. return nil, true
  219. }
  220. func (table *Table) AddField(newField types.FieldInfo) error {
  221. // 1. 基础校验 完整保留
  222. if int(table.info.FieldCount)+1 >= MaxFieldSize {
  223. return ErrInvalidFieldCount
  224. }
  225. if table.findFieldByName(newField.FieldName) != nil {
  226. return ErrFieldExists
  227. }
  228. allocSize := uint32(table.info.FieldAllocateSize)
  229. targetPageID := table.curOffset.PageID
  230. mainBlockEnd := uint32(0)
  231. var (
  232. ok bool
  233. fieldOffset *RtFieldOffset
  234. heap *HeapPage
  235. err error
  236. )
  237. if heap, err = LoadHeapPage(table.handle, targetPageID); err != nil {
  238. return err
  239. }
  240. mainBuf := heap.Get()
  241. for {
  242. if fieldOffset, ok = table.writeField(mainBuf, newField); ok {
  243. _ = table.handle.SavePage(targetPageID, mainBuf)
  244. table.addFieldToMem(newField)
  245. return nil
  246. }
  247. if heap.Info.Hdr.Type != page.DataOverflowPage {
  248. if table.info.LastOverflow == 0 {
  249. heap = NewHeapPage(table.handle, page.DataOverflowPage)
  250. if table.info.FirstOverflow == 0 {
  251. table.info.FirstOverflow = heap.Info.Hdr.PageID
  252. }
  253. table.info.LastOverflow = heap.Info.Hdr.PageID
  254. }
  255. if heap == nil {
  256. if fieldOffset.PageID > 0 {
  257. heap, err = LoadHeapPage(table.handle, fieldOffset.PageID)
  258. if err != nil {
  259. return err
  260. }
  261. } else {
  262. heap, err = LoadHeapPage(table.handle, table.info.LastOverflow)
  263. if err != nil {
  264. return err
  265. }
  266. }
  267. }
  268. }
  269. // 申请堆页空间
  270. targetPageID, mainBlockEnd, err = heap.Alloc(allocSize)
  271. if err != nil {
  272. return err
  273. }
  274. table.writeJump(mainBuf, targetPageID, mainBlockEnd)
  275. _ = table.handle.SavePage(table.curOffset.PageID, mainBuf)
  276. mainBuf = heap.Get()
  277. table.curOffset.PageID = targetPageID
  278. table.curOffset.StartOffset = uint16(mainBlockEnd)
  279. table.curOffset.EndOffset = 1 //让出长度1个字节
  280. table.info.LastOverflow = heap.Info.Hdr.PageID
  281. table.saveTableInfo()
  282. }
  283. }
  284. //// writeJump:在【字段结束位置】写入6字节跳转,而不是固定块尾
  285. //// 完全匹配你 ReadFieldsChain 的读取方式
  286. //func (table *Table) writeJump(buf []byte, blockStart uint32, nextPageID uint32, nextOff uint32) {
  287. // // 1. 读取块首字段数量
  288. // fieldCount := buf[blockStart]
  289. // off := blockStart + 1
  290. //
  291. // // 2. 跳过所有字段 → 找到【字段结束的位置】(你读取时的偏移)
  292. // for i := 0; i < int(fieldCount); i++ {
  293. // nameLen := buf[off+1]
  294. // off += 2 + uint32(nameLen)
  295. // }
  296. // // 3. 【核心】在字段结束位置写入6字节跳转(你读的就是这个位置!)
  297. // jump := FieldOffset{
  298. // PageID: nextPageID,
  299. // StartOffset: uint16(nextOff), // 严格转uint16,6字节总大小
  300. // }
  301. // // 直接内存写入,和你读取的代码完全对齐
  302. // *(*FieldOffset)(unsafe.Pointer(&buf[off])) = jump
  303. //}
  304. func (table *Table) writeJump(buf []byte, nextPageID uint32, nextOff uint32) {
  305. offset := table.curOffset.EndOffset + table.curOffset.StartOffset
  306. jump := FieldOffset{
  307. PageID: nextPageID,
  308. StartOffset: uint16(nextOff), // 严格转uint16,6字节总大小
  309. }
  310. // 直接内存写入,和你读取的代码完全对齐
  311. *(*FieldOffset)(unsafe.Pointer(&buf[offset])) = jump
  312. }
  313. func (table *Table) addFieldToMem(f types.FieldInfo) {
  314. table.Field = append(table.Field, f)
  315. table.info.FieldCount++
  316. table.info.ActiveFieldCount++
  317. table.saveTableInfo()
  318. }
  319. func (table *Table) saveTableInfo() {
  320. buf := make([]byte, PageSize)
  321. if err := table.handle.ReadPage(table.tablePageID, buf); err != nil {
  322. return
  323. }
  324. info := (*TableInfo)(unsafe.Pointer(&buf[table.tableStartOffset]))
  325. info.FirstOverflow = table.info.FirstOverflow
  326. info.LastOverflow = table.info.LastOverflow
  327. info.FieldCount = table.info.FieldCount
  328. info.ActiveFieldCount = table.info.ActiveFieldCount
  329. table.handle.SavePage(table.tablePageID, buf)
  330. }
  331. // =============================================================================
  332. // 删除字段(软删除)
  333. // =============================================================================
  334. func (table *Table) DropField(fieldName string) error {
  335. allocSize := uint32(table.info.FieldAllocateSize)
  336. infoSize := uint32(unsafe.Sizeof(table.info))
  337. fieldStart := table.tableStartOffset + infoSize
  338. hdrSize := uint32(unsafe.Sizeof(page.PageHdr{}))
  339. buf := make([]byte, PageSize)
  340. if err := table.handle.ReadPage(table.tablePageID, buf); err != nil {
  341. return err
  342. }
  343. searchBlock := func(buf []byte, start uint32) bool {
  344. cnt := buf[start]
  345. off := start + 1
  346. for i := byte(0); i < cnt; i++ {
  347. if off+2 > PageSize {
  348. return false
  349. }
  350. ft := types.FieldType(buf[off])
  351. nl := buf[off+1]
  352. ds := 2 + uint32(nl)
  353. if off+ds > start+allocSize {
  354. return false
  355. }
  356. if util.IsHighBitSet(byte(ft)) {
  357. off += ds
  358. continue
  359. }
  360. name := util.BytesToString(buf[off+2 : off+2+uint32(nl)])
  361. if name == fieldName {
  362. buf[off] |= 0x80
  363. return true
  364. }
  365. off += ds
  366. }
  367. return false
  368. }
  369. if searchBlock(buf, fieldStart) {
  370. table.handle.SavePage(table.tablePageID, buf)
  371. table.info.ActiveFieldCount--
  372. table.saveTableInfo()
  373. return nil
  374. }
  375. curPage := table.info.FirstOverflow
  376. for curPage != 0 {
  377. buf := make([]byte, PageSize)
  378. if err := table.handle.ReadPage(curPage, buf); err != nil {
  379. return err
  380. }
  381. if searchBlock(buf, hdrSize) {
  382. table.handle.SavePage(curPage, buf)
  383. table.info.ActiveFieldCount--
  384. table.saveTableInfo()
  385. return nil
  386. }
  387. curPage = (*page.PageHdr)(unsafe.Pointer(&buf[0])).NextPage
  388. }
  389. return ErrFieldNotFound
  390. }
  391. // ======================== 行数据序列化/反序列化 ========================
  392. // serializeRow 将 FieldValue 切片序列化为行数据字节 (不含 pkID 前缀)
  393. func (table *Table) serializeRow(values []types.FieldValue) []byte {
  394. rowSize := int(table.info.RowSize)
  395. rowData := make([]byte, rowSize)
  396. for _, fv := range values {
  397. idx := table.findFieldIndex(string(fv.FieldName))
  398. if idx < 0 {
  399. continue
  400. }
  401. off := table.calcFieldOffset(idx)
  402. ft := table.Field[idx].FieldType
  403. writeFieldValue(rowData[off:], ft, fv.Value)
  404. }
  405. return rowData
  406. }
  407. func writeFieldValue(buf []byte, ft types.FieldType, value interface{}) {
  408. switch ft {
  409. case types.FieldType_1byte:
  410. buf[0] = value.(byte)
  411. case types.FieldType_2byte:
  412. binary.BigEndian.PutUint16(buf, uint16(value.(int16)))
  413. case types.FieldType_4byte:
  414. binary.BigEndian.PutUint32(buf, uint32(value.(int32)))
  415. case types.FieldType_8byte:
  416. binary.BigEndian.PutUint64(buf, value.(uint64))
  417. default:
  418. // 所有字符串/定长类型
  419. if b, ok := value.([]byte); ok {
  420. copy(buf, b)
  421. }
  422. }
  423. }
  424. // deserializeRow 将行数据字节反序列化为 FieldValue 切片 (不含 pkID 前缀)
  425. func (table *Table) deserializeRow(rowData []byte) []types.FieldValue {
  426. var result []types.FieldValue
  427. for i, f := range table.Field {
  428. if util.IsHighBitSet(byte(f.FieldType)) {
  429. continue // 跳过已删除字段
  430. }
  431. off := table.calcFieldOffset(i)
  432. size := types.GetSize(f.FieldType)
  433. if int(off)+int(size) > len(rowData) {
  434. continue
  435. }
  436. val := readFieldValue(rowData[off:], f.FieldType, int(size))
  437. result = append(result, types.FieldValue{FieldName: f.FieldName, Value: val})
  438. }
  439. return result
  440. }
  441. func readFieldValue(buf []byte, ft types.FieldType, size int) interface{} {
  442. switch ft {
  443. case types.FieldType_1byte:
  444. return buf[0]
  445. case types.FieldType_2byte:
  446. return int16(binary.BigEndian.Uint16(buf))
  447. case types.FieldType_4byte:
  448. return int32(binary.BigEndian.Uint32(buf))
  449. case types.FieldType_8byte:
  450. return binary.BigEndian.Uint64(buf)
  451. default:
  452. // 所有字符串/定长类型
  453. result := make([]byte, size)
  454. copy(result, buf[:size])
  455. return result
  456. }
  457. }
  458. // ======================== 高层 CRUD ========================
  459. // InsertRow 插入一行数据
  460. func (table *Table) InsertRow(values []types.FieldValue) (uint64, error) {
  461. pkID := table.info.TotalRows + 1
  462. rowData := table.serializeRow(values)
  463. if err := table.indexMeta.InsertRow(table.Field, pkID, rowData); err != nil {
  464. return 0, err
  465. }
  466. table.info.TotalRows++
  467. table.saveTableInfo()
  468. return pkID, nil
  469. }
  470. // SearchByIndex 通过索引搜索一行
  471. func (table *Table) SearchByIndex(idxName string, key []byte) ([]types.FieldValue, error) {
  472. storeRow, found := table.indexMeta.SearchByIndex(idxName, key, table.Field)
  473. if !found {
  474. return nil, ErrFieldNotFound
  475. }
  476. // storeRow = [pkID(8B LE) + rowData]
  477. if len(storeRow) < 8 {
  478. return nil, ErrFieldNotFound
  479. }
  480. rowData := storeRow[8:]
  481. return table.deserializeRow(rowData), nil
  482. }
  483. // DeleteRow 通过索引删除一行
  484. func (table *Table) DeleteRow(idxName string, key []byte) error {
  485. if err := table.indexMeta.DeleteByKey(idxName, key, table.Field); err != nil {
  486. return err
  487. }
  488. table.info.TotalRows--
  489. table.saveTableInfo()
  490. return nil
  491. }
  492. // UpdateRow 通过索引更新一行
  493. func (table *Table) UpdateRow(idxName string, key []byte, values []types.FieldValue) error {
  494. newRowData := table.serializeRow(values)
  495. // 找到 pkID
  496. storeRow, found := table.indexMeta.SearchByIndex(idxName, key, table.Field)
  497. if !found {
  498. return ErrFieldNotFound
  499. }
  500. pkID := binary.BigEndian.Uint64(storeRow[:8])
  501. return table.indexMeta.UpdateByKey(idxName, key, newRowData, pkID, table.Field)
  502. }