return db;
}
-database *loadDatabase(const char* path){
- FILE *fp = fopen(path, "rb");
- char *header = calloc(2, sizeof(char));
- fread(header, sizeof(char), 2, fp);
- if(!sameStr(header, "DB")){
- fprintf(stderr, "Header is '%s' not 'DB'\n", header);
- }
-
- char name[32];
- fread(&name, sizeof(char), 32, fp);
- database *db = newDatabase(name);
- db->lfiles = loadLtable(fp);
- db->ltags = loadLtable(fp);
- db->cfiles = loadCtable(fp);
- db->ctags = loadCtable(fp);
- db->hfiles = loadAVLTree(fp);
- db->htags = loadAVLTree(fp);
- db->map = loadMtable(fp);
-
- char *end = calloc(3, sizeof(char));
- fread(end, sizeof(char), 3, fp);
- if(!sameStr(end, "END")){
- fprintf(stderr, "End is '%s' not 'END'\n", end);
- }
- fclose(fp);
- return db;
-}
-
-int storeDatabase(database *db, const char *path){
- FILE *fp = fopen(path, "wb");
-
- char header[2] = "DB";
- fwrite(header, sizeof(char), 2, fp);
- fwrite(db->name, sizeof(char), 32, fp);
-
- storeLtable(db->lfiles, fp);
- storeLtable(db->ltags, fp);
- storeCtable(db->cfiles, fp);
- storeCtable(db->ctags, fp);
- storeAVLTree(db->hfiles, fp);
- storeAVLTree(db->htags, fp);
- storeMtable(db->map, fp);
-
- char end[3] = "END";
- fwrite(end, sizeof(char), 3, fp);
-
- fclose(fp);
- return 0;
-}
-
static void increaseCount(ctable *ct, uint64_t i){
ct->table[i]++;
}
+static void decreaseCount(ctable *ct, uint64_t i){
+ ct->table[i]--;
+}
+
uint64_t addFile(database *db, char *file){
uint32_t l;
file = normalizeStrLimit(file, &l, MAXPATH-1);
return 0;
}
+int removeFile(database *db, char *file){
+ uint32_t l;
+ file = normalizeStrLimit(file, &l, MAXPATH-1);
+ uint64_t i = ltableSearch(db->lfiles, file);
+ if(i == -1){
+ return -1;
+ }
+ uint64_t *r, rl;
+ searchFile(db, file, 0, &r, &rl);
+ for(uint64_t j = 0; j < rl; ++j){
+ decreaseCount(db->ctags, r[j]);
+ }
+ uint64_t h = crc64(0, file, l);
+ ltableRemove(db->lfiles, file);
+ ctableRemove(db->cfiles, i);
+ deleteNode(db->hfiles, h);
+ mtableRemoveFile(db->map, i);
+ return 0;
+}
+
+int removeTag(database *db, char *tag){
+ uint32_t l;
+ tag = normalizeStrLimit(tag, &l, MAXPATH-1);
+ uint64_t i = ltableSearch(db->ltags, tag);
+ if(i == -1){
+ return -1;
+ }
+ uint64_t *r, rl;
+ searchTag(db, tag, 0, &r, &rl);
+ for(uint64_t j = 0; j < rl; ++j){
+ decreaseCount(db->cfiles, r[j]);
+ }
+ uint64_t h = crc64(0, tag, l);
+ ltableRemove(db->ltags, tag);
+ ctableRemove(db->ctags, i);
+ deleteNode(db->htags, h);
+ mtableRemoveTag(db->map, i);
+ return 0;
+}
+
// Stores in r a list with the indexes of the first n tags that this file has
// If n is 0 or lower, it returns all of them. Stores in rl the length of r
int searchFile(database *db, char *file, uint64_t n, uint64_t **r, uint64_t *rl){
return 0;
}
+int storeDatabase(database *db, const char *path){
+ FILE *fp = fopen(path, "wb");
+
+ char header[2] = "DB";
+ fwrite(header, sizeof(char), 2, fp);
+ fwrite(db->name, sizeof(char), 32, fp);
+
+ storeLtable(db->lfiles, fp);
+ storeLtable(db->ltags, fp);
+ storeCtable(db->cfiles, fp);
+ storeCtable(db->ctags, fp);
+ storeAVLTree(db->hfiles, fp);
+ storeAVLTree(db->htags, fp);
+ storeMtable(db->map, fp);
+
+ char end[3] = "END";
+ fwrite(end, sizeof(char), 3, fp);
+
+ fclose(fp);
+ return 0;
+}
+
+database *loadDatabase(const char* path){
+ FILE *fp = fopen(path, "rb");
+ char *header = calloc(2, sizeof(char));
+ fread(header, sizeof(char), 2, fp);
+ if(!sameStr(header, "DB")){
+ fprintf(stderr, "Header is '%s' not 'DB'\n", header);
+ }
+
+ char name[32];
+ fread(&name, sizeof(char), 32, fp);
+ database *db = newDatabase(name);
+ db->lfiles = loadLtable(fp);
+ db->ltags = loadLtable(fp);
+ db->cfiles = loadCtable(fp);
+ db->ctags = loadCtable(fp);
+ db->hfiles = loadAVLTree(fp);
+ db->htags = loadAVLTree(fp);
+ db->map = loadMtable(fp);
+
+ char *end = calloc(3, sizeof(char));
+ fread(end, sizeof(char), 3, fp);
+ if(!sameStr(end, "END")){
+ fprintf(stderr, "End is '%s' not 'END'\n", end);
+ }
+ fclose(fp);
+ return db;
+}
+
void printDatabase(database *db){
for(uint64_t i = 0; i < db->map->size; ++i){
printf("%s -> %s\n", db->lfiles->table[db->map->table[i].file], db->ltags->table[db->map->table[i].tag]);
for(uint64_t i = 0; i < db->ltags->size; ++i){
printf("\t\t+%s (%" PRIu64 ")\n", db->ltags->table[i], db->ctags->table[i]);
}
- printf("\t-hfiles: %d\n", height(db->hfiles));
+ printf("\t-hfiles: %d\n", db->lfiles->size);
debugAVLtree(db->hfiles);
- printf("\t-htags: %d\n", height(db->htags));
+ printf("\t-htags: %d\n", db->ltags->size);
debugAVLtree(db->htags);
printf("\t-map: %d\n", db->map->size);
for(uint64_t i = 0; i < db->map->size; ++i){
return 0;
}
+int ltableRemove(ltable *lt, char *str){
+ uint64_t i = ltableSearch(lt, str);
+ if(i == -1){
+ return -1;
+ }
+ lt->size--;
+ for(uint64_t j = i; j < lt->size-1; ++j){
+ lt->table[j] = lt->table[j+1];
+ }
+ return 0;
+}
+
uint64_t ltableSearch(ltable *lt, char *str){
uint32_t l;
str = normalizeStrLimit(str, &l, MAXPATH-1);
return 0;
}
-int ctableDelete(ctable *ct, uint64_t n){
- uint64_t i = ctableSearch(ct, n);
- if(i == -1){
+int ctableRemove(ctable *ct, uint64_t i){
+ if(i >= ct->size){
return -1;
}
ct->size--;
return 0;
}
+int mtableRemove(mtable *mt, relation r){
+ uint64_t i = mtableSearch(mt, r);
+ if(i == -1){
+ return -1;
+ }
+ mt->size--;
+ for(uint64_t j = i; j < mt->size-1; ++j){
+ mt->table[j] = mt->table[j+1];
+ }
+ return 0;
+}
+
+int mtableRemoveFile(mtable *mt, uint64_t file){
+ relation *nmt = malloc(mt->size*sizeof(relation));
+ uint64_t ni = 0;
+ for(uint64_t i = 0; i < mt->size; ++i){
+ if(file != mt->table[i].file){
+ nmt[ni] = mt->table[i];
+ ++ni;
+ }
+ }
+ mt->size = ni;
+ mt->table = malloc(mt->size*sizeof(relation));
+ for(uint64_t i = 0; i < mt->size; ++i){
+ mt->table[i] = nmt[i];
+ }
+ return 0;
+}
+
+int mtableRemoveTag(mtable *mt, uint64_t tag){
+ relation *nmt = malloc(mt->size*sizeof(relation));
+ uint64_t ni = 0;
+ for(uint64_t i = 0; i < mt->size; ++i){
+ if(tag != mt->table[i].tag){
+ nmt[ni] = mt->table[i];
+ ++ni;
+ }
+ }
+ mt->size = ni;
+ mt->table = malloc(mt->size*sizeof(relation));
+ for(uint64_t i = 0; i < mt->size; ++i){
+ mt->table[i] = nmt[i];
+ }
+ return 0;
+}
+
uint64_t mtableSearch(mtable *mt, relation r){
for(uint64_t i = 0; i < mt->size; ++i){
if(r.file == mt->table[i].file && r.tag == mt->table[i].tag){
return ((a > b) ? a : b);
}
-uint64_t height(node *n){
+static uint64_t height(node *n){
if(n != NULL){
return 1 + max(height(n->left), height(n->right));
}
return r;
}
- uint64_t b = balance(r), bl = balance(r->left), br = balance(r->right);
+ int64_t b = balance(r), bl = balance(r->left), br = balance(r->right);
if(b > 1 && bl >= 0){ // Left left
return rotateNodeRight(r);
}