X-Git-Url: https://git.deb.at/?a=blobdiff_plain;ds=sidebyside;f=database.c;h=da6890f11aba80f44583370aaec7d94d37f8f027;hb=b8c3c825e80317c07c8864d4dfb5054f8a5b8658;hp=bd8877164e61675b85f3d3b4ca3749797d212ed6;hpb=409a820589a0453197e0970e7048b82ad412c4c3;p=pkg%2Fabook.git diff --git a/database.c b/database.c index bd88771..da6890f 100644 --- a/database.c +++ b/database.c @@ -26,9 +26,10 @@ abook_field_list *fields_list = NULL; int fields_count = 0; list_item *database = NULL; -int items = 0; +static int items = 0; #define ITEM_SIZE (fields_count * sizeof(char *)) +#define LAST_ITEM (items - 1) #define INITIAL_LIST_CAPACITY 30 static int list_capacity = 0; @@ -56,7 +57,7 @@ abook_field standard_fields[] = { {"nick", N_("Nickname/Alias"), FIELD_STRING}, /* NICK */ {"url", N_("URL"), FIELD_STRING}, /* URL */ {"notes", N_("Notes"), FIELD_STRING}, /* NOTES */ - {"anniversary", N_("Anniversary day"), FIELD_DAY}, /* ANNIVERSARY */ + {"anniversary", N_("Anniversary day"), FIELD_DATE}, /* ANNIVERSARY */ {0} /* ITEM_FIELDS */ }; @@ -120,7 +121,7 @@ real_find_field(char *key, abook_field_list *list, int *number) } void -get_field_keyname(int i, char **key, char **name) +get_field_info(int i, char **key, char **name, int *type) { abook_field_list *cur = fields_list; int j; @@ -134,6 +135,8 @@ get_field_keyname(int i, char **key, char **name) *key = (i < 0) ? NULL : cur->field->key; if(name) *name = (i < 0) ? NULL : cur->field->name; + if(type) + *type = (i < 0) ? -1 : cur->field->type; } void @@ -176,8 +179,8 @@ declare_new_field(char *key, char *name, char *type, int accept_standard) f->type = FIELD_EMAILS; else if(0 == strcasecmp("list", type)) f->type = FIELD_LIST; - else if(0 == strcasecmp("day", type)) - f->type = FIELD_DAY; + else if(0 == strcasecmp("date", type)) + f->type = FIELD_DATE; else return _("unknown type"); @@ -202,9 +205,11 @@ declare_unknown_field(char *key) if(!database) return; - for(i = 0; i < fields_count; i++) - if(database[i]) + for(i = 0; i < items; i++) + if(database[i]) { database[i] = xrealloc(database[i], ITEM_SIZE); + database[i][fields_count - 1] = NULL; + } } /* @@ -355,18 +360,13 @@ save_database() goto out; } - if(list_is_empty()) { - fclose(out); - unlink(datafile); - ret = 1; - goto out; - } + if(!list_is_empty()) + /* + * Possibly should check if write_database failed. + * Currently it returns always zero. + */ + write_database(out, e); - /* - * Possibly should check if write_database failed. - * Currently it returns always zero. - */ - write_database(out, e); fclose(out); if(access(datafile, F_OK) == 0 && @@ -430,7 +430,7 @@ validate_item(list_item item) case FIELD_STRING: max_field_len = MAX_FIELD_LEN; break; - case FIELD_DAY: + case FIELD_DATE: break; default: assert(0); @@ -540,9 +540,6 @@ surnamecmp(const void *i1, const void *i2) int ret, idx = field_id(NAME); char *n1, *n2, *s1, *s2; - if(idx == 0) - return 0; /* no 'name' field */ - n1 = (*(list_item *)i1)[idx]; n2 = (*(list_item *)i2)[idx]; @@ -660,6 +657,17 @@ is_valid_item(int item) return item <= LAST_ITEM && item >= 0; } +int +last_item() +{ + return LAST_ITEM; +} + +int +db_n_items() +{ + return items; +} int real_db_enumerate_items(struct db_enumerator e) @@ -823,3 +831,22 @@ db_item_get(int i) return database[i]; } +/* Fetch addresses from all fields of FIELD_EMAILS type */ +/* Memory has to be freed by the caller */ +char * +db_email_get(int item) +{ + int i; + char *res; + abook_field_list *cur; + abook_list *emails = NULL; + + for(cur = fields_list, i = 0; cur; cur = cur->next, i++) + if(cur->field->type == FIELD_EMAILS && *database[item][i]) + abook_list_append(&emails, database[item][i]); + + res = abook_list_to_csv(emails); + abook_list_free(&emails); + return res ? res : xstrdup(""); +} +