From: nishi Date: Wed, 22 May 2024 01:58:18 +0000 (+0000) Subject: can list database now X-Git-Url: http://10.10.0.4:5575/?a=commitdiff_plain;h=481bdf06661619eed84c7887facdf44ce5898701;p=dataworks.git can list database now git-svn-id: file:///raid/svn-main/nishi-dataworks/trunk@64 d4a5a174-5a4a-5b4b-b672-37683c10d7d5 --- diff --git a/Client/main.c b/Client/main.c index c7b221b..e733867 100644 --- a/Client/main.c +++ b/Client/main.c @@ -152,18 +152,19 @@ int main(int argc, char** argv) { printf("Shows the version of DataWorks.\n"); padleft(16, ".tables"); printf("Shows the table list.\n"); - } else if(__dw_strcaseequ(buf, ".tables")){ + } else if(__dw_strcaseequ(buf, ".tables")) { char** list = dataworks_database_get_table_list(db); - if(list != NULL){ + if(list != NULL) { int i; - for(i = 0; list[i] != NULL; i++); + for(i = 0; list[i] != NULL; i++) + ; printf("%d tables found.\n", i); - for(i = 0; list[i] != NULL; i++){ + for(i = 0; list[i] != NULL; i++) { printf(" %s\n", list[i]); free(list[i]); } free(list); - }else{ + } else { printf("Failed to get the list.\n"); } } else { diff --git a/Library/database.c b/Library/database.c index 0b85657..a550720 100644 --- a/Library/database.c +++ b/Library/database.c @@ -120,40 +120,47 @@ int dataworks_database_get_version(struct dataworks_db* db) { return db->version uint64_t dataworks_database_get_mtime(struct dataworks_db* db) { return db->mtime; } #define buffer_to_db_v1_indexentry(buf, index) \ - memcpy(&index.flag, buf, 1); \ - uint64_t be_count; \ - memcpy(&be_count, buf + 1, 8); \ - __dw_native_endian(be_count, uint64_t, index.count = __converted); \ - memcpy(&index.dbname_len, buf + 1 + 8, 1); \ - memcpy(index.dbname, buf + 1 + 8 + 1, 256); \ - memcpy(index.fields, buf + 1 + 8 + 1 + 256, 4096); + memcpy(&index.flag, buf, 1); \ + uint64_t be_count; \ + memcpy(&be_count, buf + 1, 8); \ + __dw_native_endian(be_count, uint64_t, index.count = __converted); \ + memcpy(&index.dbname_len, buf + 1 + 8, 1); \ + memcpy(index.dbname, buf + 1 + 8 + 1, 256); \ + memcpy(index.fields, buf + 1 + 8 + 1 + 256, 4096); -char** dataworks_database_get_table_list(struct dataworks_db* db){ - if(db->version == 1){ +char** dataworks_database_get_table_list(struct dataworks_db* db) { + if(db->version == 1) { __dw_lockfile(db->fp); fseek(db->fp, sizeof(sig) + 10, SEEK_SET); int i; struct dataworks_db_v1_indexentry index; char* buf = malloc(1 + 8 + 1 + 256 + 4096); - for(i = 0; i < 256; i++){ + int c = 0; + for(i = 0; i < 256; i++) { fread(buf, 1, 1 + 8 + 1 + 256 + 4096, db->fp); buffer_to_db_v1_indexentry(buf, index); + if(index.flag & DATAWORKS_V1_INDEXENTRY_USED) { + c++; + } } + char** list = malloc(sizeof(*list) * (c + 1)); fseek(db->fp, sizeof(sig) + 10, SEEK_SET); - for(i = 0; i < 256; i++){ + c = 0; + for(i = 0; i < 256; i++) { fread(buf, 1, 1 + 8 + 1 + 256 + 4096, db->fp); buffer_to_db_v1_indexentry(buf, index); - if(index.flag & DATAWORKS_V1_INDEXENTRY_USED){ - printf("%d\n", index.dbname_len); - printf("["); - fflush(stdout); - fwrite(index.dbname, 1, index.dbname_len, stdout); - printf("]\n"); + if(index.flag & DATAWORKS_V1_INDEXENTRY_USED) { + list[c] = malloc(index.dbname_len + 1); + memcpy(list[c], index.dbname, index.dbname_len); + list[c][index.dbname_len] = 0; + c++; } } + list[c] = NULL; free(buf); __dw_unlockfile(db->fp); - }else{ + return list; + } else { /* Not implemented for the version */ return NULL; } diff --git a/Library/dw_database.h b/Library/dw_database.h index f8b463f..7777781 100644 --- a/Library/dw_database.h +++ b/Library/dw_database.h @@ -1,4 +1,4 @@ -/* $Id: dw_database.h 7 2024-05-16 15:56:44Z nishi $ */ +/* $Id$ */ /* --- START LICENSE --- */ /* -------------------------------------------------------------------------- */ /* Copyright (c) 2024 Nishi. */ @@ -155,7 +155,7 @@ uint64_t dataworks_database_get_mtime(struct dataworks_db* db); * @~english * @brief Get the table list of the database. * @param db Database - * @return Table list of the databas + * @return Table list of the databas * */ char** dataworks_database_get_table_list(struct dataworks_db* db); diff --git a/Library/dw_parser.h b/Library/dw_parser.h index b14c38c..d734e61 100644 --- a/Library/dw_parser.h +++ b/Library/dw_parser.h @@ -1,4 +1,4 @@ -/* $Id: dw_util.h 7 2024-05-16 15:56:44Z nishi $ */ +/* $Id$ */ /* --- START LICENSE --- */ /* -------------------------------------------------------------------------- */ /* Copyright (c) 2024 Nishi. */ diff --git a/Library/dw_util.h b/Library/dw_util.h index 549b0e5..e6c97a3 100644 --- a/Library/dw_util.h +++ b/Library/dw_util.h @@ -45,6 +45,7 @@ extern "C" { #include "dataworks.h" +char* __dw_strdup(const char* a); bool __dw_strcaseequ(const char* a, const char* b); bool __dw_lockfile(FILE* fp); bool __dw_unlockfile(FILE* fp); diff --git a/Library/util.c b/Library/util.c index dd53f41..11b7d3a 100644 --- a/Library/util.c +++ b/Library/util.c @@ -37,6 +37,13 @@ #include #endif +char* __dw_strdup(const char* a) { + char* str = malloc(strlen(a) + 1); + memcpy(str, a, strlen(a)); + str[strlen(a)] = 0; + return str; +} + bool __dw_strcaseequ(const char* a, const char* b) { if(strlen(a) != strlen(b)) return false; int i;