forked from mirkokiefer/LivelyC
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLCFileStore.c
90 lines (74 loc) · 2.66 KB
/
LCFileStore.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "LCFileStore.h"
#include "LCString.h"
#include "LCUtils.h"
FILE* fileStoreWrite(void *cookie, LCTypeRef type, char *key);
void fileStoreDelete(void *cookie, LCTypeRef type, char *key);
FILE* fileStoreRead(void *cookie, LCTypeRef type, char *key);
void fileStoreDealloc(LCObjectRef store);
static void* fileStoreInitData();
LCStringRef createDirectoryPath(LCFileStoreRef store, LCTypeRef type);
LCStringRef createFilePath(LCFileStoreRef store, LCTypeRef type, char *hash);
typedef struct fileStoreData* fileStoreDataRef;
struct fileStoreData {
LCStringRef location;
};
struct LCType typeFileStore = {
.initData = fileStoreInitData,
.dealloc = fileStoreDealloc
};
LCTypeRef LCTypeFileStore = &typeFileStore;
static void* fileStoreInitData() {
fileStoreDataRef data = malloc(sizeof(struct fileStoreData));
if (data) {
data->location = NULL;
}
return data;
}
LCFileStoreRef LCFileStoreCreate(char *location) {
fileStoreDataRef data = fileStoreInitData();
data->location = LCStringCreate(location);
makeDirectory(location);
return objectCreate(LCTypeFileStore, data);
}
static char* fileStoreLocation(LCFileStoreRef store) {
fileStoreDataRef data = objectData(store);
return LCStringChars(data->location);
}
LCStoreRef LCFileStoreStoreObject(LCFileStoreRef store) {
return storeCreate(store, fileStoreWrite, fileStoreDelete, fileStoreRead);
}
FILE* fileStoreWrite(void *cookie, LCTypeRef type, char *key) {
LCStringRef directoryPath = createDirectoryPath(cookie, type);
makeDirectory(LCStringChars(directoryPath));
LCStringRef filePath = createFilePath(cookie, type, key);
FILE *fp = fopen(LCStringChars(filePath), "w");
objectRelease(filePath);
return fp;
}
void fileStoreDelete(void *cookie, LCTypeRef type, char *key) {
// TODO
}
FILE* fileStoreRead(void *cookie, LCTypeRef type, char *key) {
LCStringRef filePath = createFilePath(cookie, type, key);
FILE *fp = fopen(LCStringChars(filePath), "r");
objectRelease(filePath);
return fp;
}
void fileStoreDealloc(LCObjectRef store) {
fileStoreDataRef data = objectData(store);
objectRelease(data->location);
lcFree(data);
}
LCStringRef createDirectoryPath(LCFileStoreRef store, LCTypeRef type) {
char *storeLocation = fileStoreLocation(store);
char *typeString = typeName(type);
char *strings[] = {storeLocation, typeString, "/"};
return LCStringCreateFromStringArray(strings, 3);
}
LCStringRef createFilePath(LCFileStoreRef store, LCTypeRef type, char *key) {
LCStringRef directory = createDirectoryPath(store, type);
char *strings[] = {LCStringChars(directory), key, ".txt"};
LCStringRef path = LCStringCreateFromStringArray(strings, 3);
objectRelease(directory);
return path;
}