forked from Telodendria/Telodendria
Implement DbList()
This commit is contained in:
parent
ce6d483135
commit
8c4e6aa594
3 changed files with 48 additions and 4 deletions
2
TODO.txt
2
TODO.txt
|
@ -16,7 +16,7 @@ Milestone: v0.2.0
|
||||||
[~] Db API
|
[~] Db API
|
||||||
[x] If object is in cache, but doesn't exist on disk, delete from cache
|
[x] If object is in cache, but doesn't exist on disk, delete from cache
|
||||||
[ ] Allow cache to be totally disabled (no MIN_CACHE_SIZE)
|
[ ] Allow cache to be totally disabled (no MIN_CACHE_SIZE)
|
||||||
[ ] List keys under a path (DbList() using POSIX opendir())
|
[x] List keys under a path (DbList() using POSIX opendir())
|
||||||
[~] User login
|
[~] User login
|
||||||
[x] User manipulation functions (so we don't use the DB directly)
|
[x] User manipulation functions (so we don't use the DB directly)
|
||||||
[x] Refresh tokens
|
[x] Refresh tokens
|
||||||
|
|
47
src/Db.c
47
src/Db.c
|
@ -28,6 +28,9 @@
|
||||||
#include <Util.h>
|
#include <Util.h>
|
||||||
#include <Str.h>
|
#include <Str.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -214,12 +217,12 @@ DbHashKey(Array * args)
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
DbDirName(Db * db, Array * args)
|
DbDirName(Db * db, Array * args, size_t strip)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
char *str = StrConcat(2, db->dir, "/");
|
char *str = StrConcat(2, db->dir, "/");
|
||||||
|
|
||||||
for (i = 0; i < ArraySize(args) - 1; i++)
|
for (i = 0; i < ArraySize(args) - strip; i++)
|
||||||
{
|
{
|
||||||
char *tmp;
|
char *tmp;
|
||||||
|
|
||||||
|
@ -597,7 +600,7 @@ DbCreate(Db * db, size_t nArgs,...)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dir = DbDirName(db, args);
|
dir = DbDirName(db, args, 1);
|
||||||
if (UtilMkdir(dir, 0750) < 0)
|
if (UtilMkdir(dir, 0750) < 0)
|
||||||
{
|
{
|
||||||
Free(file);
|
Free(file);
|
||||||
|
@ -798,6 +801,11 @@ Array *
|
||||||
DbList(Db * db, size_t nArgs,...)
|
DbList(Db * db, size_t nArgs,...)
|
||||||
{
|
{
|
||||||
Array *result;
|
Array *result;
|
||||||
|
Array *path;
|
||||||
|
DIR* files;
|
||||||
|
struct dirent* file;
|
||||||
|
char* dir;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
if (!db || !nArgs)
|
if (!db || !nArgs)
|
||||||
{
|
{
|
||||||
|
@ -810,9 +818,42 @@ DbList(Db * db, size_t nArgs,...)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
va_start(ap, nArgs);
|
||||||
|
path = ArrayFromVarArgs(nArgs, ap);
|
||||||
|
dir = DbDirName(db, path, 0);
|
||||||
|
|
||||||
|
files = opendir(dir);
|
||||||
|
if (!files)
|
||||||
|
{
|
||||||
|
ArrayFree(path);
|
||||||
|
Free(dir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
while((file = readdir(files))) {
|
||||||
|
if (file->d_type == DT_REG && file->d_namlen > 5)
|
||||||
|
{
|
||||||
|
int nameOffset = file->d_namlen - 5;
|
||||||
|
if (strcmp(file->d_name + nameOffset, ".json") == 0)
|
||||||
|
{
|
||||||
|
file->d_name[nameOffset] = '\0';
|
||||||
|
ArrayAdd(result, StrDuplicate(file->d_name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(files);
|
||||||
|
|
||||||
|
ArrayFree(path);
|
||||||
|
Free(dir);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DbListFree(Array *arr)
|
||||||
|
{
|
||||||
|
StringArrayFree(arr);
|
||||||
|
}
|
||||||
|
|
||||||
HashMap *
|
HashMap *
|
||||||
DbJson(DbRef * ref)
|
DbJson(DbRef * ref)
|
||||||
{
|
{
|
||||||
|
|
|
@ -60,6 +60,9 @@ extern int
|
||||||
extern Array *
|
extern Array *
|
||||||
DbList(Db *, size_t,...);
|
DbList(Db *, size_t,...);
|
||||||
|
|
||||||
|
extern void
|
||||||
|
DbListFree(Array *);
|
||||||
|
|
||||||
extern HashMap *
|
extern HashMap *
|
||||||
DbJson(DbRef *);
|
DbJson(DbRef *);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue