]> err.no Git - sope/commitdiff
some date parsing fix
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sat, 9 Feb 2008 16:16:39 +0000 (16:16 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sat, 9 Feb 2008 16:16:39 +0000 (16:16 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1601 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-gdl1/PostgreSQL/ChangeLog
sope-gdl1/PostgreSQL/NSCalendarDate+PGVal.m
sope-gdl1/PostgreSQL/PostgreSQL72Channel.m
sope-gdl1/PostgreSQL/Version

index 6ff193d6421b00169191d3a19ebeb1432b91e22c..56884f26f0c167815f6dff6fb484ca4a31300cf5 100644 (file)
@@ -1,5 +1,9 @@
 2008-02-09  Helge Hess  <helge.hess@opengroupware.org>
 
+       * NSCalendarDate+PGVal.m: rewrote date parsing to use strsep(),
+         now works with date strings containing milliseconds (which we ignore)
+         (v4.7.53)
+
        * v4.7.52
 
        * NSString+PostgreSQL72.m: properly use -length, not -cStringLength
index 9498bbb4f1747389d314b1cf589e5b545fea5483..cafc969c4380bc6576ff528d97cf48732334831b 100644 (file)
@@ -2,7 +2,7 @@
    NSCalendarDate+PGVal.m
 
    Copyright (C) 1999 MDlink online service center GmbH and Helge Hess
-   Copyright (C) 2000-2005 SKYRIX Software AG and Helge Hess
+   Copyright (C) 2000-2008 SKYRIX Software AG and Helge Hess
 
    Author: Helge Hess (helge@opengroupware.org)
 
@@ -36,6 +36,7 @@ static NSString *PGSQL_DATETIME_FORMAT = @"%b %d %Y %I:%M:%S:000%p";
 /*
   Format: '2001-07-26 14:00:00+02'      (len 22)
           '2001-07-26 14:00:00+09:30'   (len 25)
+         '2008-01-31 14:00:57.249+01'  (len 26)
            0123456789012345678901234
   
   Matthew: "07/25/2003 06:00:00 CDT".
@@ -52,48 +53,63 @@ static NSTimeZone *gmt02 = nil;
   attribute:(EOAttribute *)_attribute
   adaptorChannel:(PostgreSQL72Channel *)_channel
 {
-  static char buf[28]; // reused buffer THREAD
+  char           buf[28];
   char           *p;
   NSTimeZone     *attrTZ;
   NSCalendarDate *date;
   int            year, month, day, hour, min, sec, tzOffset = 0;
+  char *tok;
   
   if (_length == 0)
     return nil;
   
-  if (_length != 22 && _length != 25) {
+  if (_length != 22 && _length != 25 && _length != 26) {
     // TODO: add support for "2001-07-26 14:00:00" (len=19)
+    // TBD: add support for "2008-01-31 14:00:57.249+01" (len=26)
     NSLog(@"ERROR(%s): unexpected string '%s' for date type '%@', returning "
          @"now (expected format: '2001-07-26 14:00:00+02')", 
          __PRETTY_FUNCTION__,
           _cstr, _type);
     return [NSCalendarDate date];
   }
-  strncpy(buf, _cstr, 25);
-  buf[25] = '\0';
+  strncpy(buf, _cstr, 26);
+  buf[26] = '\0';
   
-  /* perform on reverse, so that we don't overwrite with null-terminators */
+  tok = buf;
+  year  = atoi(strsep(&tok, "-"));
+  month = atoi(strsep(&tok, "-"));
+  day   = atoi(strsep(&tok, " "));
+  hour  = atoi(strsep(&tok, ":"));
+  min   = atoi(strsep(&tok, ":"));
   
-  if (_length == 22) {
-    p = &(buf[19]);
-    tzOffset = atoi(p) * 60;
-  }
-  else if (_length >= 25) {
-    int mins;
-    p = &(buf[23]);
-    mins = atoi(p);
-    buf[22] = '\0'; // the ':'
-    p = &(buf[19]);
-    tzOffset = atoi(p) * 60;
-    tzOffset = tzOffset > 0 ? (tzOffset + mins) : (tzOffset - mins);
+  tzOffset = 0;
+  if (tok != NULL && (p = strchr(tok, '+')) != NULL)
+    tzOffset = +1;
+  else if (tok != NULL && (p = strchr(tok, '-')) != NULL)
+    tzOffset = -1;
+  else
+    tzOffset = 0; // TBD: warn?
+  if (tzOffset != 0) {
+    int tzHours, tzMins = 0;
+    
+    p++; // skip +/-
+    tzHours = atoi(strsep(&p, ":"));
+    if (p != NULL) tzMins = atoi(p);
+    
+    tzMins = tzHours * 60 + tzMins;
+    tzOffset = tzOffset < 0 ? -tzMins : tzMins;
   }
   
-  p = &(buf[17]); buf[19] = '\0'; sec   = atoi(p);
-  p = &(buf[14]); buf[16] = '\0'; min   = atoi(p);
-  p = &(buf[11]); buf[13] = '\0'; hour  = atoi(p);
-  p = &(buf[8]);  buf[10] = '\0'; day   = atoi(p);
-  p = &(buf[5]);  buf[7]  = '\0'; month = atoi(p);
-  p = &(buf[0]);  buf[4]  = '\0'; year  = atoi(p);
+  /* extract seconds */
+  sec = atoi(strsep(&tok, ":+."));
+  
+#if HEAVY_DEBUG    
+  NSLog(@"DATE: %s => %04i-%02i-%02i %02i:%02i:%02i",
+       buf, year, month, day, hour, min, sec);
+#endif
+#if HEAVY_DEBUG
+  NSLog(@"DATE: %s => OFFSET %i", _cstr, tzOffset);
+#endif
   
   /* TODO: cache all timezones (just 26 ;-) */
   switch (tzOffset) {
index 340bf51d0d28e01ab45820c50687158c875dd626..52c20c01b9207bca783d0e9f63c3bc2edfd3fa8c 100644 (file)
@@ -2,7 +2,7 @@
    PostgreSQL72Channel.m
 
    Copyright (C) 1999 MDlink online service center GmbH and Helge Hess
-   Copyright (C) 2000-2004 SKYRIX Software AG and Helge Hess
+   Copyright (C) 2000-2008 SKYRIX Software AG and Helge Hess
 
    Author: Helge Hess (helge.hess@opengroupware.org)
 
index 3638a1634c12a2275ba5faa4e9e8edc2c8a1e6b0..5b0a6ce4cb8fda68e222b7e456aa95051fb61b9c 100644 (file)
@@ -1,5 +1,5 @@
 # version file
 
-SUBMINOR_VERSION:=52
+SUBMINOR_VERSION:=53
 
 # v4.5.41 requires libGDLAccess v4.5.50