]> err.no Git - scalable-opengroupware.org/commitdiff
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@71 d1b88da0-ebda-0310-925b-ed51d8...
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 29 Jun 2004 08:48:18 +0000 (08:48 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 29 Jun 2004 08:48:18 +0000 (08:48 +0000)
OGoContentStore/OCSFolder.h
OGoContentStore/OCSFolder.m
OGoContentStore/OCSFolderManager.h
OGoContentStore/OCSFolderManager.m
OGoContentStore/OCSFolderType.h
OGoContentStore/OCSFolderType.m
OGoContentStore/sql/folderinfo.psql

index 8ccfc989cde1fede764d399e718b1d55a0fb5f61..ee2a27f07ed161e32dd5de79fda94ef110b2a759 100644 (file)
 #import <Foundation/NSObject.h>
 
 @class NSString, NSURL, NSNumber;
+@class OCSFolderManager, OCSFolderType;
 
 @interface OCSFolder : NSObject
 {
+  OCSFolderManager *folderManager;
+  OCSFolderType    *folderInfo;
+  
   NSNumber *folderId;
   NSString *folderName;
   NSString *rootName;
@@ -44,7 +48,7 @@
 - (NSString *)rootName;
 - (NSString *)path;
 - (NSURL    *)location;
-- (NSString *)folderType;
+- (NSString *)folderTypeName;
 
 @end
 
index da120631d1d5de81ba9ec83966c29a9f6adb118d..09e1a109b4641f9692452f559f53e6f87dc2d57e 100644 (file)
 // $Id$
 
 #include "OCSFolder.h"
+#include "OCSFolderManager.h"
+#include "OCSFolderType.h"
 #include "common.h"
 
 @implementation OCSFolder
 
 - (void)dealloc {
-  [self->folderId   release];
-  [self->folderName release];
-  [self->rootName   release];
-  [self->path       release];
-  [self->location   release];
-  [self->folderType release];
+  [self->folderManager release];
+  [self->folderInfo    release];
+  [self->folderId      release];
+  [self->folderName    release];
+  [self->rootName      release];
+  [self->path          release];
+  [self->location      release];
+  [self->folderType    release];
   [super dealloc];
 }
 
@@ -55,7 +59,7 @@
   return self->location;
 }
 
-- (NSString *)folderType {
+- (NSString *)folderTypeName {
   return self->folderType;
 }
 
index 2c83471b4998739328fcad44bba8572c98ff6c59..9f5d0fda088b38975c8ab93f36dca31b21313df0 100644 (file)
   model and manage the tables required for a folder.
 */
 
-@class NSString, NSArray, NSURL;
-@class OCSChannelManager, OCSFolder;
+@class NSString, NSArray, NSURL, NSDictionary;
+@class OCSChannelManager, OCSFolder, OCSFolderType;
 
 @interface OCSFolderManager : NSObject
 {
   OCSChannelManager *channelManager;
-  NSURL *folderInfoLocation;
+  NSDictionary      *nameToType;
+  NSURL             *folderInfoLocation;
 }
 
 + (id)defaultFolderManager;
 
 - (OCSFolder *)folderAtPath:(NSString *)_path;
 
+/* folder types */
+
+- (OCSFolderType *)folderTypeWithName:(NSString *)_name;
+
 /* cache management */
 
 - (void)reset;
index 31d46067ee8f5ae55f775397ec11fa6423c04108..f84bc2dd36ea1246640ddfd34542d98c6970b0a0 100644 (file)
@@ -30,9 +30,9 @@
   Required database schema:
   
     <arbitary table>
-      path
-      path1, path2, path3... [quickPathCount times]
-      folderName
+      c_path
+      c_path1, path2, path3... [quickPathCount times]
+      c_foldername
   
   TODO:
   - add a local cache?
 @implementation OCSFolderManager
 
 static OCSFolderManager *fm = nil;
-static BOOL    debugOn        = NO;
-static BOOL    debugSQLGen    = NO;
-static int     quickPathCount = 4;
-static NSArray *emptyArray    = nil;
+static BOOL       debugOn                   = NO;
+static BOOL       debugSQLGen               = NO;
+static BOOL       debugPathTraversal        = NO;
+static int        quickPathCount            = 4;
+static NSArray    *emptyArray               = nil;
+static NSString   *OCSPathColumnName        = @"c_path";
+static NSString   *OCSPathRecordName        = @"cPath";
+static NSString   *OCSTypeColumnName        = @"c_folder_type";
+static NSString   *OCSTypeRecordName        = @"cFolderType";
+static NSString   *OCSGenericFolderTypeName = @"Container";
+static const char *OCSPathColumnPattern     = "c_path%i";
 
 + (void)initialize {
   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
@@ -90,11 +97,17 @@ static NSArray *emptyArray    = nil;
   if ((self = [super init])) {
     self->channelManager = [[OCSChannelManager defaultChannelManager] retain];
     self->folderInfoLocation = [_url retain];
+    
+    self->nameToType =
+      [[NSDictionary alloc] initWithObjectsAndKeys:
+                             [OCSFolderType defaultCalendarFolderType],
+                             @"appointment", nil];
   }
   return self;
 }
 
 - (void)dealloc {
+  [self->nameToType         release];
   [self->folderInfoLocation release];
   [self->channelManager     release];
   [super dealloc];
@@ -205,7 +218,7 @@ static NSArray *emptyArray    = nil;
     NSString *pathColumn;
     unsigned char buf[32];
     
-    sprintf(buf, "\"path%i\"", (i + 1));
+    sprintf(buf, OCSPathColumnPattern, (i + 1));
     pathColumn = [[NSString alloc] initWithCString:buf];
     
     /* Note: the AND addition must be inside the if's for non-exact stuff */
@@ -221,7 +234,7 @@ static NSArray *emptyArray    = nil;
       if ([sql length] > 0) [sql appendString:@" AND "];
       [sql appendString:pathColumn];
       [sql appendString:@" IS NULL"];
-      //[self logWithFormat:@"BE EXACT, NULL columns"];
+      if (debugPathTraversal) [self logWithFormat:@"BE EXACT, NULL columns"];
     }
     else if (_directSubs) {
       /* fetch immediate subfolders */
@@ -230,12 +243,14 @@ static NSArray *emptyArray    = nil;
       if (i == count) {
        /* if it is a direct subfolder, the next path cannot be empty */
        [sql appendString:@" IS NOT NULL"];
-       //[self logWithFormat:@"DIRECT SUBS, first level"];
+       if (debugPathTraversal)
+         [self logWithFormat:@"DIRECT SUBS, first level"];
       }
       else {
        /* but for 'direct' subfolders, all following things must be empty */
        [sql appendString:@" IS NULL"];
-       //[self logWithFormat:@"DIRECT SUBS, lower level"];
+       if (debugPathTraversal) 
+         [self logWithFormat:@"DIRECT SUBS, lower level"];
       }
     }
     
@@ -243,7 +258,7 @@ static NSArray *emptyArray    = nil;
   }
   
   if (_beExact && (count > quickPathCount)) {
-    [sql appendString:@" AND \"folderName\" = '"];
+    [sql appendString:@" AND \"c_foldername\" = '"];
     [sql appendString:[_names lastObject]];
     [sql appendString:@"'"];
   }
@@ -264,7 +279,7 @@ static NSArray *emptyArray    = nil;
     return nil;
   
   sql = [NSMutableString stringWithCapacity:256];
-  [sql appendString:@"SELECT \"path\" FROM "];
+  [sql appendString:@"SELECT \"c_path\" FROM "];
   [sql appendString:[self folderInfoTableName]];
   [sql appendString:@" WHERE "];
   [sql appendString:ws];
@@ -331,8 +346,12 @@ static NSArray *emptyArray    = nil;
   for (i = 0, count = [_records count]; i < count; i++) {
     NSString *recName;
     
-    recName = [[_records objectAtIndex:i] objectForKey:@"path"];
-    [self logWithFormat:@"check '%@' vs '%@' ...", name, recName];
+    recName = [[_records objectAtIndex:i] objectForKey:OCSPathRecordName];
+#if 0
+    [self logWithFormat:@"check '%@' vs '%@' (%@)...", 
+         name, recName,[_records objectAtIndex:i]];
+#endif
+    
     if ([name isEqualToString:recName])
       return [_records objectAtIndex:i];
   }
@@ -370,7 +389,7 @@ static NSArray *emptyArray    = nil;
   if (count == 1) {
     NSString *sname;
     
-    sname = [[records objectAtIndex:0] objectForKey:@"path"];
+    sname = [[records objectAtIndex:0] objectForKey:OCSPathRecordName];
     return [fname isEqualToString:sname];
   }
   
@@ -414,7 +433,7 @@ static NSArray *emptyArray    = nil;
   for (i = 0; i < count; i++) {
     NSString *sname, *spath;
     
-    sname = [[records objectAtIndex:0] objectForKey:@"path"];
+    sname = [[records objectAtIndex:0] objectForKey:OCSPathRecordName];
     if (![sname hasPrefix:fname]) /* does not match at all ... */
       continue;
     
@@ -453,7 +472,8 @@ static NSArray *emptyArray    = nil;
   
   sql = [NSMutableString stringWithCapacity:256];
   [sql appendString:@"SELECT "];
-  [sql appendString:@"\"folderid\", \"path\", \"location\", \"foldertype\""];
+  [sql appendString:
+        @"\"c_folder_id\", \"c_path\", \"c_location\", \"c_folder_type\""];
   [sql appendString:@" FROM "];
   [sql appendString:[self folderInfoTableName]];
   [sql appendString:@" WHERE "];
@@ -489,6 +509,15 @@ static NSArray *emptyArray    = nil;
   return nil;
 }
 
+/* folder types */
+
+- (OCSFolderType *)folderTypeWithName:(NSString *)_name {
+  if ([_name length] == 0)
+    _name = OCSGenericFolderTypeName;
+  
+  return [self->nameToType objectForKey:_name];
+}
+
 /* cache management */
 
 - (void)reset {
index b7149a54a93ff8fe548ae5854538155aedf1df7a..097f280c9c31aa6abc650fafc302ba6b3d7b9daf 100644 (file)
 {
   NSString     *blobTablePattern;  // eg 'SOGo_$folderId$_blob
   NSString     *quickTablePattern; // eg 'SOGo_$folderId$_quick
-  NSDictionary *fields;
+  NSDictionary *fields;            // maps a name to OCSFieldInfo
   EOQualifier  *folderQualifier;   // to further limit the table set
 }
 
++ (id)defaultCalendarFolderType;
+
 /* operations */
 
 - (NSString *)blobTableNameForFolder:(OCSFolder *)_folder;
index 5e206c06ffe794a8f14a3aaf890deb18b708e750..358f920daee4c76d434fbad4836695e8ccef0c13 100644 (file)
 
 @implementation OCSFolderType
 
+static OCSFolderType *calendarType = nil;
+
+- (id)initAsCalendarFolderType {
+  // TODO: should be moved to a plist file
+  if ((self = [super init])) {
+    self->blobTablePattern  = @"SOGo_$folderId$_blob";
+    self->quickTablePattern = @"SOGo_$folderId$_quick";
+    self->folderQualifier   = nil; // a table per folder
+    
+    // TODO: which fields?
+  }
+  return self;
+}
+
++ (id)defaultCalendarFolderType {
+  if (calendarType == nil)
+    calendarType = [[self alloc] init];
+  return calendarType;
+}
+
 - (void)dealloc {
   [self->blobTablePattern  release];
   [self->quickTablePattern release];
index 9b358f0a645d314a8c469181a0306567a341cc9f..faaf88898a7a543fd2c6a0ed43b0d81f659d9ea6 100644 (file)
@@ -7,23 +7,26 @@
 
 CREATE SEQUENCE SOGo_folder_info_seq;
 
+DROP TABLE SOGo_folder_info;
+
 CREATE TABLE SOGo_folder_info (
-  folderId   INTEGER 
+  c_folder_id  INTEGER 
     DEFAULT nextval('SOGo_folder_info_seq')
     NOT NULL 
     PRIMARY KEY,                     -- the primary key
-  path       VARCHAR(255)  NOT NULL, -- the full path to the folder 'xyz/Cal'
-  path1      VARCHAR(255)  NOT NULL, -- individual parts (for fast queries)
-  path2      VARCHAR(255)  NULL,     -- individual parts (for fast queries)
-  path3      VARCHAR(255)  NULL,     -- individual parts (for fast queries)
-  path4      VARCHAR(255)  NULL,     -- individual parts (for fast queries)
-  folderName VARCHAR(255)  NOT NULL, -- last path component
-  location   VARCHAR(2048) NOT NULL, -- URL to database of the folder
-  folderType VARCHAR(255)  NOT NULL  -- the folder type ...
+  c_path        VARCHAR(255)  NOT NULL, -- the full path to the folder
+  c_path1       VARCHAR(255)  NOT NULL, -- individual parts (for fast queries)
+  c_path2       VARCHAR(255)  NULL,     -- individual parts (for fast queries)
+  c_path3       VARCHAR(255)  NULL,     -- individual parts (for fast queries)
+  c_path4       VARCHAR(255)  NULL,     -- individual parts (for fast queries)
+  c_foldername  VARCHAR(255)  NOT NULL, -- last path component
+  c_location    VARCHAR(2048) NOT NULL, -- URL to database of the folder
+  c_folder_type VARCHAR(255)  NOT NULL  -- the folder type ...
 );
 
 INSERT INTO SOGo_folder_info 
-  ( path, path1, path2, path3, path4, foldername, location, foldertype ) 
+  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername,
+    c_location, c_folder_type ) 
 VALUES 
   ( '/Users', 
     'Users',
@@ -34,7 +37,8 @@ VALUES
     'http://OGo:OGo@localhost/test', 'Container' );
 
 INSERT INTO SOGo_folder_info 
-  ( path, path1, path2, path3, path4, foldername, location, foldertype ) 
+  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
+    c_location, c_folder_type ) 
 VALUES 
   ( '/Users/helge', 
     'Users',
@@ -45,7 +49,8 @@ VALUES
     'http://OGo:OGo@localhost/test', 'Container' );
 
 INSERT INTO SOGo_folder_info 
-  ( path, path1, path2, path3, path4, foldername, location, foldertype ) 
+  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
+    c_location, c_folder_type ) 
 VALUES 
   ( '/Users/helge/Calendar', 
     'Users',