Skip to content

Commit 5999188

Browse files
Merge pull request #50 from dreamer-coding/main
Git-like chain experiment with MyShell backend
2 parents 1d0b7fd + d01ea40 commit 5999188

20 files changed

+2390
-1314
lines changed

code/logic/cacheshell.c

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -123,19 +123,35 @@ bool fossil_bluecrab_cacheshell_set(const char *key, const char *value) {
123123

124124
bool fossil_bluecrab_cacheshell_get(const char *key, char *out_value, size_t buffer_size) {
125125
cache_entry_t *e = find_entry(key);
126-
if (!e) return false;
127-
if (e->value_size > buffer_size) return false;
128-
memcpy(out_value, e->value, e->value_size);
126+
if (!e || !e->in_use) return false;
127+
if (buffer_size == 0) return false;
128+
// Always copy at most buffer_size-1 bytes, and null-terminate
129+
size_t copy_len = e->value_size;
130+
if (copy_len > buffer_size - 1) copy_len = buffer_size - 1;
131+
memcpy(out_value, e->value, copy_len);
132+
out_value[copy_len] = '\0';
129133
return true;
130134
}
131135

132136
bool fossil_bluecrab_cacheshell_remove(const char *key) {
133-
cache_entry_t *e = find_entry(key);
134-
if (!e) return false;
135-
free(e->key);
136-
free(e->value);
137-
e->in_use = false;
138-
return true;
137+
unsigned long h = cache_hash(key) % CACHE_TABLE_SIZE;
138+
for (size_t i = 0; i < CACHE_TABLE_SIZE; i++) {
139+
size_t idx = (h + i) % CACHE_TABLE_SIZE;
140+
if (!cache_table[idx].in_use) {
141+
return false;
142+
}
143+
if (strcmp(cache_table[idx].key, key) == 0) {
144+
free(cache_table[idx].key);
145+
free(cache_table[idx].value);
146+
cache_table[idx].key = NULL;
147+
cache_table[idx].value = NULL;
148+
cache_table[idx].value_size = 0;
149+
cache_table[idx].expire_at = 0;
150+
cache_table[idx].in_use = false;
151+
return true;
152+
}
153+
}
154+
return false;
139155
}
140156

141157
bool fossil_bluecrab_cacheshell_set_with_ttl(const char *key, const char *value, unsigned int ttl_sec) {
@@ -163,6 +179,10 @@ void fossil_bluecrab_cacheshell_clear(void) {
163179
if (cache_table[i].in_use) {
164180
free(cache_table[i].key);
165181
free(cache_table[i].value);
182+
cache_table[i].key = NULL;
183+
cache_table[i].value = NULL;
184+
cache_table[i].value_size = 0;
185+
cache_table[i].expire_at = 0;
166186
cache_table[i].in_use = false;
167187
}
168188
}
@@ -183,15 +203,16 @@ size_t fossil_bluecrab_cacheshell_count(void) {
183203
}
184204

185205
bool fossil_bluecrab_cacheshell_exists(const char *key) {
186-
return find_entry(key) != NULL;
206+
cache_entry_t *e = find_entry(key);
207+
return (e != NULL && e->in_use);
187208
}
188209

189210
bool fossil_bluecrab_cacheshell_set_binary(const char *key, const void *data, size_t size) {
190211
cache_entry_t *e = find_entry(key);
191212
if (!e) e = alloc_entry(key);
192213
if (!e) return false;
193214

194-
free(e->value);
215+
if (e->value) free(e->value);
195216
e->value = malloc(size);
196217
if (!e->value) return false;
197218
memcpy(e->value, data, size);
@@ -202,9 +223,11 @@ bool fossil_bluecrab_cacheshell_set_binary(const char *key, const void *data, si
202223

203224
bool fossil_bluecrab_cacheshell_get_binary(const char *key, void *out_buf, size_t buf_size, size_t *out_size) {
204225
cache_entry_t *e = find_entry(key);
205-
if (!e) return false;
206-
if (e->value_size > buf_size) return false;
207-
memcpy(out_buf, e->value, e->value_size);
226+
if (!e || !e->in_use) return false;
208227
if (out_size) *out_size = e->value_size;
228+
if (buf_size == 0) return false;
229+
size_t copy_len = e->value_size;
230+
if (copy_len > buf_size) copy_len = buf_size;
231+
memcpy(out_buf, e->value, copy_len);
209232
return true;
210233
}

code/logic/fileshell.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ char* fossil_fileshell_strdup(const char *src) {
4949

5050
return dup;
5151
}
52+
5253
// ===========================================================
5354
// Basic File Operations
5455
// ===========================================================
@@ -92,7 +93,16 @@ bool fossil_bluecrab_fileshell_read(const char *path, char *out_buf, size_t buf_
9293

9394
bool fossil_bluecrab_fileshell_delete(const char *path) {
9495
if (!path) return false;
95-
return (remove(path) == 0);
96+
97+
// Ensure file is not open by this process (best effort, not strictly necessary)
98+
// The test itself opens and closes the file, so we don't need to do it here.
99+
100+
int result = remove(path);
101+
// After removal, check if the file still exists
102+
if (result == 0 && !fossil_bluecrab_fileshell_exists(path)) {
103+
return true;
104+
}
105+
return false;
96106
}
97107

98108
// ===========================================================

0 commit comments

Comments
 (0)