1
0
mirror of https://github.com/fumiama/fumidb.git synced 2026-06-08 20:10:25 +08:00

finish remove

This commit is contained in:
源文雨
2022-05-04 14:52:00 +08:00
parent 544f900870
commit 18513f6e6f
4 changed files with 90 additions and 2 deletions

View File

@@ -12,7 +12,7 @@ Most part of this README and the docs in `api` folder is written in Chinese. If
- [x] [插入表项](/api/table.md#表项的增加)
- [x] 查询表项
- [x] 按索引修改表项
- [ ] 按索引[删除表项](/api/table.md#表项的删除)
- [x] 按索引[删除表项](/api/table.md#表项的删除)
- [ ] 对非主键(无[unique约束](/api/types.md#类型修饰符))进行[索引](/api/index.md)
## 关于并发

View File

@@ -43,6 +43,9 @@ uint64_t add_table_index(int fd, void* table, uint16_t pos);
// 0 成功
int remove_table_index(int fd, void* table, uint16_t pos);
// 获取 ptr 位置的行的长度
int get_row_length(int fd, void* table, uint64_t ptr);
// 插入一行,如果 pk 有值则替换
// list 以 key_t 为单元
// 如果当前项有 nullable 属性,需要在此项之前

View File

@@ -283,6 +283,52 @@ uint64_t add_table_index(int fd, void* table, uint16_t pos) {
return *(uint64_t*)(table+len);
}
#define DEBUG
int get_row_length(int fd, void* table, uint64_t ptr) {
if(lseek(fd, ptr, SEEK_SET) < 0) return EOF;
int len = 8+2+le16(table+8);
int rlen = le16(table+len);
int sz = 0; // 本行长度
len += 2;
for(int i = 0; i < rlen; i++) {
type_t t = ((type_t*)table)[len+i];
#ifdef DEBUG
printf("type: %d, ", (int)t);
#endif
int size = _calc_type_size(t);
sz += size;
#ifdef DEBUG
printf("skip: %d, size: %d\n", size, sz);
#endif
if(lseek(fd, size, SEEK_CUR) < 0) return EOF;
int blen;
switch(t&7) {
case TYPE_STRING: // 是 string/binary多读取一个长度
case TYPE_BINARY:
lseek(fd, -2, SEEK_CUR);
readle16(fd, blen);
#ifdef DEBUG
printf("blen: %d, ", blen);
#endif
if(blen > PAGESZ/2 || blen <= 0) { // 长度超标
errno = EFBIG;
return 0;
}
sz += blen;
if(lseek(fd, blen, SEEK_CUR) < 0) return EOF;
break;
default: break;
}
}
#ifdef DEBUG
printf("total size: %d\n", sz);
#endif
return sz;
}
// 删除 pos 位置的列的索引。不可用于 0 列,即 pk 列,因为 pk 必有索引
// 返回:
// 非 0 失败,详见 errno
@@ -549,7 +595,41 @@ int find_row_by(int fd, void* table, int (*f)(uint64_t), int row_len, const void
// 非 0 失败,详见 errno
// 0 成功
int remove_row_by_pk(int fd, void* table, key_t k) {
return 1;
int len = 8+2+le16(table+8);
int rlen = le16(table+len);
len += 2;
uint64_t indexptr = *(uint64_t*)(table+len+rlen);
#ifdef DEBUG
printf("indexptr: %016llx, ", indexptr);
#endif
type_t t = ((type_t*)table)[len];
int indexsz = _calc_index_size(t);
#ifdef DEBUG
printf("indexsz: %d, ", indexsz);
#endif
uint64_t ptr = find_row_by_pk(fd, table, k);
if(ptr == 0) return 0;
len = get_row_length(fd, table, ptr);
if(len <= 0) return EOF;
void* buf = malloc(indexsz);
if(buf == NULL) return EOF;
if(add_block(fd, len, ptr)) {
free(buf);
return EOF;
}
void* index = load_index(fd, t, indexptr, buf);
if(index == NULL) {
free(buf);
return EOF;
}
if(remove_index(fd, t, index)) {
free(buf);
return EOF;
}
free(buf);
return 0;
}
// 根据任意匹配值删除行

View File

@@ -71,6 +71,8 @@ int main() {
return 8;
}
if(get_row_length(fd, table, ptr) != 57) return 1;
if(lseek(fd, ptr, SEEK_SET) < 0) return 9;
readle16(fd, ptr);
if((uint16_t)ptr != 2333) {
@@ -119,6 +121,9 @@ int main() {
}
read(fd, buf, 5);
if(strcmp(buf, "\x45\xff\x12\xda")) return 15;
if(remove_row_by_pk(fd, table, 2333)) return 16;
ptr = find_row_by_pk(fd, table, 2333);
if(ptr != 0) return 8;
close(fd);
// remove("table_test_tmp.bin");
}