diff options
Diffstat (limited to 'src/test/storage.c')
-rw-r--r-- | src/test/storage.c | 873 |
1 files changed, 873 insertions, 0 deletions
diff --git a/src/test/storage.c b/src/test/storage.c new file mode 100644 index 0000000..ef27336 --- /dev/null +++ b/src/test/storage.c @@ -0,0 +1,873 @@ +/* -*- Mode: C -*- + ====================================================================== + FILE: storage.c + CREATOR: eric 03 April 1999 + + DESCRIPTION: + + $Id: storage.c,v 1.6 2008-01-02 20:07:46 dothebart Exp $ + $Locker: $ + + (C) COPYRIGHT 1999 Eric Busboom + http://www.softwarestudio.org + + The contents of this file are subject to the Mozilla Public License + Version 1.0 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and + limitations under the License. + + The original author is Eric Busboom + The original code is usecases.c + + + ======================================================================*/ + +#include <libical/ical.h> +#include <assert.h> +#include <string.h> /* for strdup */ +#include <stdlib.h> /* for malloc */ +#include <stdio.h> /* for printf */ +#include <time.h> /* for time() */ +#include "icalmemory.h" +#include "icaldirset.h" +#include "icalfileset.h" +#ifdef WITH_BDB4 +#include "icalbdbset.h" +#endif +#include "icalerror.h" +#include "icalrestriction.h" +#include "icalcalendar.h" + +#define OUTPUT_FILE "filesetout.ics" +#define DATABASE "calendar.db" + +/* define sample calendar struct */ +struct calendar { + int ID; + int total_size; + + /* offsets */ + int total_size_offset; + int vcalendar_size_offset; + int vcalendar_offset; + int title_size_offset; + int title_offset; + + /* data */ + int vcalendar_size; + char *vcalendar; + + int title_size; + char *title; + +}; + +int vcalendar_init(struct calendar **cal, char *vcalendar, char *title); + +#ifdef WITH_BDB4 +int get_title(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey); +char * parse_vcalendar(const DBT *dbt) ; +#endif + +char * pack_calendar(struct calendar *cal, int size); +struct calendar * unpack_calendar(char *str, int size); + +char str[] = "BEGIN:VCALENDAR\n\ +PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\ +VERSION:2.0\n\ +BEGIN:VTIMEZONE\n\ +TZID:US-Eastern\n\ +BEGIN:STANDARD\n\ +DTSTART:19981025T020000\n\ +RDATE:19981025T020000\n\ +TZOFFSETFROM:-0400\n\ +TZOFFSETTO:-0500\n\ +TZNAME:EST\n\ +END:STANDARD\n\ +BEGIN:DAYLIGHT\n\ +DTSTART:19990404T020000\n\ +RDATE:19990404T020000\n\ +TZOFFSETFROM:-0500\n\ +TZOFFSETTO:-0400\n\ +TZNAME:EDT\n\ +END:DAYLIGHT\n\ +END:VTIMEZONE\n\ +BEGIN:VEVENT\n\ +DTSTAMP:19980309T231000Z\n\ +UID:guid-1.host1.com\n\ +ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\ +ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\ +DESCRIPTION:Project XYZ Review Meeting\n\ +CATEGORIES:MEETING\n\ +CLASS:PUBLIC\n\ +CREATED:19980309T130000Z\n\ +SUMMARY:XYZ Project Review\n\ +DTSTART;TZID=US-Eastern:19980312T083000\n\ +DTEND;TZID=US-Eastern:19980312T093000\n\ +LOCATION:1CP Conference Room 4350\n\ +END:VEVENT\n\ +BEGIN:BOOGA\n\ +DTSTAMP:19980309T231000Z\n\ +X-LIC-FOO:Booga\n\ +DTSTOMP:19980309T231000Z\n\ +UID:guid-1.host1.com\n\ +END:BOOGA\n\ +END:VCALENDAR"; + +char str2[] = "BEGIN:VCALENDAR\n\ +PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\ +VERSION:2.0\n\ +BEGIN:VEVENT\n\ +DTSTAMP:19980309T231000Z\n\ +UID:guid-1.host1.com\n\ +ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\ +ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\ +DESCRIPTION:Project XYZ Review Meeting\n\ +CATEGORIES:MEETING\n\ +CLASS:PUBLIC\n\ +CREATED:19980309T130000Z\n\ +SUMMARY:XYZ Project Review\n\ +DTSTART;TZID=US-Eastern:19980312T083000\n\ +DTEND;TZID=US-Eastern:19980312T093000\n\ +LOCATION:1CP Conference Room 4350\n\ +END:VEVENT\n\ +END:VCALENDAR\n\ +"; + +void test_fileset() +{ + icalfileset *cout; + int month = 0; + int count=0; + struct icaltimetype start, end; + icalcomponent *c,*clone, *itr; + + start = icaltime_from_timet( time(0),0); + end = start; + end.hour++; + + cout = icalfileset_new(OUTPUT_FILE); + assert(cout != 0); + + c = icalparser_parse_string(str2); + assert(c != 0); + + /* Add data to the file */ + + for(month = 1; month < 10; month++){ + icalcomponent *event; + icalproperty *dtstart, *dtend; + + cout = icalfileset_new(OUTPUT_FILE); + assert(cout != 0); + + start.month = month; + end.month = month; + + clone = icalcomponent_new_clone(c); + assert(clone !=0); + event = icalcomponent_get_first_component(clone,ICAL_VEVENT_COMPONENT); + assert(event != 0); + + dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY); + assert(dtstart!=0); + icalproperty_set_dtstart(dtstart,start); + + dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); + assert(dtend!=0); + icalproperty_set_dtend(dtend,end); + + icalfileset_add_component(cout,clone); + icalfileset_commit(cout); + + icalset_free(cout); + + } + + /* Print them out */ + + cout = icalfileset_new(OUTPUT_FILE); + assert(cout != 0); + + for (itr = icalfileset_get_first_component(cout); + itr != 0; + itr = icalfileset_get_next_component(cout)){ + + icalcomponent *event; + icalproperty *dtstart, *dtend; + + count++; + + event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); + + dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY); + dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); + + printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart), + icalproperty_as_ical_string(dtend)); + + } + + /* Remove all of them */ + + icalset_free(cout); + + cout = icalfileset_new(OUTPUT_FILE); + assert(cout != 0); + + for (itr = icalfileset_get_first_component(cout); + itr != 0; + itr = icalfileset_get_next_component(cout)){ + + + icalfileset_remove_component(cout, itr); + } + + icalset_free(cout); + + + /* Print them out again */ + + cout = icalfileset_new(OUTPUT_FILE); + assert(cout != 0); + count =0; + + for (itr = icalfileset_get_first_component(cout); + itr != 0; + itr = icalfileset_get_next_component(cout)){ + + icalcomponent *event; + icalproperty *dtstart, *dtend; + + count++; + + event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); + + dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY); + dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); + + printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart), + icalproperty_as_ical_string(dtend)); + + } + + icalset_free(cout); + + +} + +/* + In this example, we're storing a calendar with several components + under the reference id "calendar_7286" and retrieving records based + on title, "month_1" through "month_10". We use a number of the + "optional" arguments to specify secondary indices, sub-databases + (i.e. having multiple databases residing within a single Berkeley + DB file), and keys for storage and retrieval. +*/ + +#ifdef WITH_BDB4 +void test_bdbset() +{ + icalbdbset *cout; + int month = 0; + int count=0; + int num_components=0; + int szdata_len=0; + int ret=0; + char *subdb, *szdata, *szpacked_data; + char uid[255]; + struct icaltimetype start, end; + icalcomponent *c,*clone, *itr; + DB *dbp, *sdbp; + DBT key, data; + DBC *dbcp; + + struct calendar *cal; + int cal_size; + + start = icaltime_from_timet( time(0),0); + end = start; + end.hour++; + + /* Note: as per the Berkeley DB ref pages: + * + * The database argument is optional, and allows applications to + * have multiple databases in a single file. Although no database + * argument needs to be specified, it is an error to attempt to + * open a second database in a file that was not initially created + * using a database name. + * + */ + + subdb = "calendar_id"; + sdbp = 0; + + /* open database, using subdb */ + dbp = icalbdbset_database_open(DATABASE, subdb, DB_HASH); + sdbp = icalbdbset_secondary_open(dbp, + DATABASE, + "title", + get_title, + DB_HASH); + + c = icalparser_parse_string(str2); + assert(c != 0); + + /* Add data to the file */ + + for(month = 1; month < 10; month++){ + icalcomponent *event; + icalproperty *dtstart, *dtend, *location; + + /* retrieve data */ + cout = icalbdbset_new(dbp, sdbp, NULL); + assert(cout != 0); + + start.month = month; + end.month = month; + + clone = icalcomponent_new_clone(c); + assert(clone !=0); + event = icalcomponent_get_first_component(clone, + ICAL_VEVENT_COMPONENT); + assert(event != 0); + + dtstart = icalcomponent_get_first_property(event, + ICAL_DTSTART_PROPERTY); + assert(dtstart!=0); + icalproperty_set_dtstart(dtstart,start); + + dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); + assert(dtend!=0); + icalproperty_set_dtend(dtend,end); + + location = icalcomponent_get_first_property(event, ICAL_LOCATION_PROPERTY); + assert(location!=0); + +#if 0 + /* change the uid to include the month */ + sprintf(uid, "%s_%d", icalcomponent_get_uid(clone), month); + icalcomponent_set_uid(clone, uid); +#endif + + icalbdbset_add_component(cout,clone); + + /* commit changes */ + icalbdbset_commit(cout); + + num_components = icalcomponent_count_components(clone, ICAL_ANY_COMPONENT); + + icalset_free(cout); + + } + + /* try out the cursor operations */ + memset(&key, 0, sizeof(DBT)); + memset(&data, 0, sizeof(DBT)); + + ret = icalbdbset_acquire_cursor(dbp, &dbcp); + ret = icalbdbset_get_first(dbcp, &key, &data); + ret = icalbdbset_get_next(dbcp, &key, &data); + ret = icalbdbset_get_last(dbcp, &key, &data); + + /* Print them out */ + + for(month = 1, count=0; month < 10; month++){ + char *title; + + icalcomponent *event; + icalproperty *dtstart, *dtend; + + cout = icalbdbset_new(dbp, sdbp, NULL); + assert(cout != 0); + + for (itr = icalbdbset_get_first_component(cout); + itr != 0; + itr = icalbdbset_get_next_component(cout)){ + + icalcomponent *event; + icalproperty *dtstart, *dtend; + + count++; + + event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); + + dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY); + dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); + + printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart), + icalproperty_as_ical_string(dtend)); + + } + icalset_free(cout); + } + + /* close database */ + icalbdbset_database_close(dbp); + icalbdbset_database_close(sdbp); + + /* open database */ + dbp = icalbdbset_database_open(DATABASE, subdb, DB_HASH); + sdbp = icalbdbset_secondary_open(dbp, + DATABASE, + "title", + get_title, + DB_HASH); + + /* Remove all of them */ + for(month = 1; month < 10; month++){ + + cout = icalbdbset_new(dbp, sdbp, NULL); + assert(cout != 0); + + for (itr = icalbdbset_get_first_component(cout); + itr != 0; + itr = icalbdbset_get_next_component(cout)){ + + icalbdbset_remove_component(cout, itr); + } + + icalbdbset_commit(cout); + icalset_free(cout); + + } + + /* Print them out again */ + + for(month = 1, count=0; month < 10; month++){ + char *title; + + icalcomponent *event; + icalproperty *dtstart, *dtend; + + cout = icalbdbset_new(dbp, sdbp, NULL); + assert(cout != 0); + + for (itr = icalbdbset_get_first_component(cout); + itr != 0; + itr = icalbdbset_get_next_component(cout)){ + + icalcomponent *event; + icalproperty *dtstart, *dtend; + + count++; + + event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); + + dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY); + dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); + + printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart), + icalproperty_as_ical_string(dtend)); + + } + icalset_free(cout); + } +} + +/* get_title -- extracts a secondary key (the vcalendar) + * from a primary key/data pair */ + +/* just create a random title for now */ + +int get_title(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey) +{ + icalcomponent *cl; + char title[255]; + + memset(skey, 0, sizeof(DBT)); + + cl = icalparser_parse_string((char *)pdata->data); + sprintf(title, "title_%s", icalcomponent_get_uid(cl)); + + skey->data = strdup(title); + skey->size = strlen(skey->data); + return (0); +} + +char * parse_vcalendar(const DBT *dbt) +{ + char *str; + struct calendar *cal; + + str = (char *)dbt->data; + cal = unpack_calendar(str, dbt->size); + + return cal->vcalendar; +} + +#endif + + +int vcalendar_init(struct calendar **rcal, char *vcalendar, char *title) +{ + int vcalendar_size, title_size, total_size; + struct calendar *cal; + + if(vcalendar) + vcalendar_size = strlen(vcalendar); + else { + vcalendar = ""; + vcalendar_size = strlen(vcalendar); + } + + if(title) + title_size = strlen(title); + else { + title = ""; + title_size = strlen(title); + } + + total_size = sizeof(struct calendar) + vcalendar_size + title_size; + + if((cal = (struct calendar *)malloc(total_size))==NULL) + return 0; + memset(cal, 0, total_size); + + /* offsets */ + cal->total_size_offset = sizeof(int); + cal->vcalendar_size_offset = (sizeof(int) * 7); + cal->vcalendar_offset = cal->vcalendar_size_offset + sizeof(int); + cal->title_size_offset = cal->vcalendar_offset + vcalendar_size; + cal->title_offset = cal->title_size_offset + sizeof(int); + + /* sizes */ + cal->total_size = total_size; + cal->vcalendar_size = vcalendar_size; + cal->title_size = title_size; + + if (vcalendar && *vcalendar) + cal->vcalendar = strdup(vcalendar); + + if (title && *title) + cal->title = strdup(title); + + *rcal = cal; + + return 0; +} + +char * pack_calendar(struct calendar *cal, int size) +{ + char *str; + + if((str = (char *)malloc(sizeof(char) * size))==NULL) + return 0; + + /* ID */ + memcpy(str, &cal->ID, sizeof(cal->ID)); + + /* total_size */ + memcpy(str + cal->total_size_offset, + &cal->total_size, + sizeof(cal->total_size)); + + /* vcalendar_size */ + memcpy(str + cal->vcalendar_size_offset, + &cal->vcalendar_size, + sizeof(cal->vcalendar_size)); + + /* vcalendar */ + memcpy(str + cal->vcalendar_offset, + cal->vcalendar, + cal->vcalendar_size); + + /* title_size */ + memcpy(str + cal->title_size_offset, + &cal->title_size, + sizeof(cal->title_size)); + + /* title */ + memcpy(str + cal->title_offset, + cal->title, + cal->title_size); + + return str; +} + +struct calendar * unpack_calendar(char *str, int size) +{ + struct calendar *cal; + if((cal = (struct calendar *) malloc(size))==NULL) + return 0; + memset(cal, 0, size); + + /* offsets */ + cal->total_size_offset = sizeof(int); + cal->vcalendar_size_offset = (sizeof(int) * 7); + cal->vcalendar_offset = cal->vcalendar_size_offset + sizeof(int); + + /* ID */ + memcpy(&cal->ID, str, sizeof(cal->ID)); + + /* total_size */ + memcpy(&cal->total_size, + str + cal->total_size_offset, + sizeof(cal->total_size)); + + /* vcalendar_size */ + memcpy(&cal->vcalendar_size, + str + cal->vcalendar_size_offset, + sizeof(cal->vcalendar_size)); + + if((cal->vcalendar = (char *)malloc(sizeof(char) * + cal->vcalendar_size))==NULL) + return 0; + + /* vcalendar */ + memcpy(cal->vcalendar, + (char *)(str + cal->vcalendar_offset), + cal->vcalendar_size); + + cal->title_size_offset = cal->vcalendar_offset + cal->vcalendar_size; + cal->title_offset = cal->title_size_offset + sizeof(int); + + /* title_size */ + memcpy(&cal->title_size, + str + cal->title_size_offset, + sizeof(cal->title_size)); + + if((cal->title = (char *)malloc(sizeof(char) * + cal->title_size))==NULL) + return 0; + + /* title*/ + memcpy(cal->title, + (char *)(str + cal->title_offset), + cal->title_size); + + return cal; +} + +int test_dirset() +{ + + icalcomponent *c, *gauge; + icalerrorenum error; + icalcomponent *itr; + icalfileset* cluster; + struct icalperiodtype rtime; + icaldirset *s = icaldirset_new("store"); + int i; + + assert(s != 0); + + rtime.start = icaltime_from_timet( time(0),0); + + cluster = icalfileset_new(OUTPUT_FILE); + + assert(cluster != 0); + +#define NUMCOMP 4 + + /* Duplicate every component in the cluster NUMCOMP times */ + + icalerror_clear_errno(); + + for (i = 1; i<NUMCOMP+1; i++){ + + /*rtime.start.month = i%12;*/ + rtime.start.month = i; + rtime.end = rtime.start; + rtime.end.hour++; + + for (itr = icalfileset_get_first_component(cluster); + itr != 0; + itr = icalfileset_get_next_component(cluster)){ + icalcomponent *clone, *inner; + icalproperty *p; + + inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); + if (inner == 0){ + continue; + } + + /* Change the dtstart and dtend times in the component + pointed to by Itr*/ + + clone = icalcomponent_new_clone(itr); + inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); + + assert(icalerrno == ICAL_NO_ERROR); + assert(inner !=0); + + /* DTSTART*/ + p = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY); + assert(icalerrno == ICAL_NO_ERROR); + + if (p == 0){ + p = icalproperty_new_dtstart(rtime.start); + icalcomponent_add_property(inner,p); + } else { + icalproperty_set_dtstart(p,rtime.start); + } + assert(icalerrno == ICAL_NO_ERROR); + + /* DTEND*/ + p = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY); + assert(icalerrno == ICAL_NO_ERROR); + + if (p == 0){ + p = icalproperty_new_dtstart(rtime.end); + icalcomponent_add_property(inner,p); + } else { + icalproperty_set_dtstart(p,rtime.end); + } + assert(icalerrno == ICAL_NO_ERROR); + + printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(inner)); + + error = icaldirset_add_component(s, + icalcomponent_new_clone(itr)); + + assert(icalerrno == ICAL_NO_ERROR); + + } + + } + + gauge = + icalcomponent_vanew( + ICAL_VCALENDAR_COMPONENT, + icalcomponent_vanew( + ICAL_VEVENT_COMPONENT, + icalproperty_vanew_summary( + "Submit Income Taxes", + icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL), + 0), + 0), + icalcomponent_vanew( + ICAL_VEVENT_COMPONENT, + icalproperty_vanew_summary( + "Bastille Day Party", + icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL), + 0), + 0), + 0); + +#if 0 + + + icaldirset_select(s,gauge); + + for(c = icaldirset_first(s); c != 0; c = icaldirset_next(s)){ + + printf("Got one! (%d)\n", count++); + + if (c != 0){ + printf("%s", icalcomponent_as_ical_string(c));; + if (icaldirset_store(s2,c) == 0){ + printf("Failed to write!\n"); + } + icalcomponent_free(c); + } else { + printf("Failed to get component\n"); + } + } + + + icalset_free(s2); +#endif + + + for(c = icaldirset_get_first_component(s); + c != 0; + c = icaldirset_get_next_component(s)){ + + if (c != 0){ + printf("%s", icalcomponent_as_ical_string(c));; + } else { + printf("Failed to get component\n"); + } + + } + + /* Remove all of the components */ + i=0; + while((c=icaldirset_get_current_component(s)) != 0 ){ + i++; + + icaldirset_remove_component(s,c); + } + + + icalset_free(s); + return 0; +} + +#if 0 +void test_calendar() +{ + icalcomponent *comp; + icalfileset *c; + icaldirset *s; + icalcalendar* calendar = icalcalendar_new("calendar"); + icalerrorenum error; + struct icaltimetype atime = icaltime_null_time(); + + comp = icalcomponent_vanew( + ICAL_VEVENT_COMPONENT, + icalproperty_new_version("2.0"), + icalproperty_new_description("This is an event"), + icalproperty_new_dtstart(atime), + icalproperty_vanew_comment( + "Another Comment", + icalparameter_new_cn("A Common Name 1"), + icalparameter_new_cn("A Common Name 2"), + icalparameter_new_cn("A Common Name 3"), + icalparameter_new_cn("A Common Name 4"), + 0), + icalproperty_vanew_xlicerror( + "This is only a test", + icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR), + 0), + + 0); + + + s = icalcalendar_get_booked(calendar); + + error = icaldirset_add_component(s,comp); + + assert(error == ICAL_NO_ERROR); + + c = icalcalendar_get_properties(calendar); + + error = icalfileset_add_component(c,icalcomponent_new_clone(comp)); + + assert(error == ICAL_NO_ERROR); + + icalcalendar_free(calendar); + +} +#endif + +int main(int argc, char *argv[]) +{ + + printf("\n------------Test File Set---------------\n"); + test_fileset(); + + printf("\n------------Test Dir Set---------------\n"); + test_dirset(); + +#ifdef WITH_BDB4 + printf("\n------------Test BerkeleyDB Set---------------\n"); + test_bdbset(); +#endif + +#if 0 + printf("\n------------Test Calendar---------------\n"); + test_calendar(); +#endif + + return 0; +} + + + |