]> err.no Git - scalable-opengroupware.org/commitdiff
work on storing content and quick in one table
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 1 Mar 2005 15:30:39 +0000 (15:30 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 1 Mar 2005 15:30:39 +0000 (15:30 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@616 d1b88da0-ebda-0310-925b-ed51d893ca5b

OGoContentStore/ChangeLog
OGoContentStore/OCSChannelManager.h
OGoContentStore/OCSChannelManager.m
OGoContentStore/OCSFolder.h
OGoContentStore/OCSFolder.m
OGoContentStore/OCSFolderManager.h
OGoContentStore/Version

index 53fc28e8702fd412088a0a2f6a0108a50de1b73e..40b29c3bdc4cc6e64d1a0fc6a80ca9c50816b987 100644 (file)
@@ -1,3 +1,8 @@
+2005-03-01  Helge Hess  <helge.hess@opengroupware.org>
+
+       * OCSFolder.m: added support for storing content and quick info in
+         the same table (untested) (v0.9.21)
+
 2005-02-21  Helge Hess  <helge.hess@opengroupware.org>
 
        * v0.9.20
index c888ec3559e6f9668fb45b1b20cfbd04da3a631f..ed95663938d91800e5197d5d0cf804bea85f89af 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __OGoContentStore_OCSChannelManager_H__
 #define __OGoContentStore_OCSChannelManager_H__
index 6c4bfa3f55935ea24e66dd9395610e8126dd0b8b..02c813c78d496448deff79282a48b55ec29337b2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "OCSChannelManager.h"
 #include "NSURL+OCS.h"
index 89000bad3c024be846a08628348bc38eff02c5cc..162c7078288d2a39605eef35763e5bcfd3d1eb68 100644 (file)
   NSURL    *location;
   NSURL    *quickLocation;
   NSString *folderTypeName;
+
+  struct {
+    int requiresFolderSelect:1;
+    int sameTableForQuick:1;
+    int reserved:30;
+  } ofFlags;
 }
 
 - (id)initWithPath:(NSString *)_path primaryKey:(id)_folderId
@@ -63,6 +69,7 @@
 
 - (NSString *)storeTableName;
 - (NSString *)quickTableName;
+- (BOOL)isQuickInfoStoredInContentTable;
 
 /* connection */
 
index b0f92c94507f1b014d422d76337b397ace5dae12..be5470a6f80750ca214d9d64b3ad236a8eb8ae54 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "OCSFolder.h"
 #include "OCSFolderManager.h"
@@ -60,6 +59,13 @@ static OCSStringFormatter *stringFormatter = nil;
   location:(NSURL *)_loc quickLocation:(NSURL *)_qloc
   folderManager:(OCSFolderManager *)_fm
 {
+  if (![_loc isNotNull]) {
+    [self logWithFormat:@"ERROR(%s): missing quicktable parameter!", 
+         __PRETTY_FUNCTION__];
+    [self release];
+    return nil;
+  }
+  
   if ((self = [super init])) {
     self->folderManager  = [_fm    retain];
     self->folderInfo     = [_ftype retain];
@@ -68,8 +74,12 @@ static OCSStringFormatter *stringFormatter = nil;
     self->folderName     = [[_path lastPathComponent] copy];
     self->path           = [_path   copy];
     self->location       = [_loc    retain];
-    self->quickLocation  = [_qloc   retain];
+    self->quickLocation  = _qloc ? [_qloc   retain] : [_loc retain];
     self->folderTypeName = [_ftname copy];
+    
+    self->ofFlags.requiresFolderSelect = 0;
+    self->ofFlags.sameTableForQuick = 
+      [self->location isEqualTo:self->quickLocation] ? 1 : 0;
   }
   return self;
 }
@@ -130,6 +140,10 @@ static OCSStringFormatter *stringFormatter = nil;
   return [[self quickLocation] ocsTableName];
 }
 
+- (BOOL)isQuickInfoStoredInContentTable {
+  return self->ofFlags.sameTableForQuick ? YES : NO;
+}
+
 /* channels */
 
 - (EOAdaptorChannel *)acquireStoreChannel {
@@ -431,12 +445,17 @@ static OCSStringFormatter *stringFormatter = nil;
   /* make content row */
   
   contentRow = [NSMutableDictionary dictionaryWithCapacity:16];
+  
+  if (self->ofFlags.sameTableForQuick)
+    [contentRow addEntriesFromDictionary:quickRow];
+  
   [contentRow setObject:_name forKey:@"c_name"];
   if (isNewRecord) [contentRow setObject:now forKey:@"c_creationdate"];
   [contentRow setObject:now forKey:@"c_lastmodified"];
   if (isNewRecord)
     [contentRow setObject:[NSNumber numberWithInt:0] forKey:@"c_version"];
   else {
+    // TODO: increase version?
     [contentRow setObject:[NSNumber numberWithInt:[storedVersion intValue]]
                forKey:@"c_version"];
   }
@@ -448,59 +467,71 @@ static OCSStringFormatter *stringFormatter = nil;
     [self logWithFormat:@"ERROR(%s): could not open storage channel!"];
     return nil;
   }
-  if ((quickChannel = [self acquireQuickChannel]) == nil) {
-    [self logWithFormat:@"ERROR(%s): could not open quick channel!"];
-    [self releaseChannel:storeChannel];
-    return nil;
+  if (!self->ofFlags.sameTableForQuick) {
+    if ((quickChannel = [self acquireQuickChannel]) == nil) {
+      [self logWithFormat:@"ERROR(%s): could not open quick channel!"];
+      [self releaseChannel:storeChannel];
+      return nil;
+    }
   }
+
+  /* generate SQL */
   
-  // TODO: gen SQL, execute in transactions
+  qsql = nil;
   if (isNewRecord) { /* insert */
-    qsql = [self _generateInsertStatementForRow:quickRow 
-                tableName:[self quickTableName]];
-    bsql = [self _generateInsertStatementForRow:contentRow 
-                tableName:[self storeTableName]];
-    
-    if ((error = [storeChannel evaluateExpressionX:bsql]) != nil) {
-      [self logWithFormat:@"ERROR(%s): cannot insert content '%@': %@", 
-           __PRETTY_FUNCTION__, bsql, error];
-    }
-    else if ((error = [quickChannel evaluateExpressionX:qsql]) != nil) {
-      NSString *delsql;
-      NSException *delErr;
-      
-      [self logWithFormat:@"ERROR(%s): cannot insert quick '%@': %@", 
-           __PRETTY_FUNCTION__, qsql, error];
-      
-      delsql = [@"DELETE FROM " stringByAppendingString:[self storeTableName]];
-      delsql = [delsql stringByAppendingString:@" WHERE c_name="];
-      delsql = [delsql stringByAppendingString:[self _formatRowValue:_name]];
-      if ((delErr = [storeChannel evaluateExpressionX:delsql]) != nil) {
-       [self logWithFormat:
-               @"ERROR(%s): cannot delete content '%@' after quick-fail: %@", 
-               __PRETTY_FUNCTION__, delsql, error];
-      }
+    if (!self->ofFlags.sameTableForQuick) {
+      qsql = [self _generateInsertStatementForRow:quickRow 
+                  tableName:[self quickTableName]];
     }
+    bsql = [self _generateInsertStatementForRow:contentRow
+                tableName:[self storeTableName]];
   }
-  else { /* update */
-    qsql = [self _generateUpdateStatementForRow:quickRow
-                tableName:[self quickTableName]
-                whereColumn:@"c_name" isEqualTo:_name];
+  else {
+    if (!self->ofFlags.sameTableForQuick) {
+      qsql = [self _generateUpdateStatementForRow:quickRow
+                  tableName:[self quickTableName]
+                  whereColumn:@"c_name" isEqualTo:_name];
+    }
     bsql = [self _generateUpdateStatementForRow:contentRow
                 tableName:[self storeTableName]
                 whereColumn:@"c_name" isEqualTo:_name];
-    if ((error = [storeChannel evaluateExpressionX:bsql]) != nil) {
-      [self logWithFormat:@"ERROR(%s): cannot update content '%@': %@", 
-           __PRETTY_FUNCTION__, bsql, error];
-    }
-    else if ((error = [quickChannel evaluateExpressionX:qsql]) != nil) {
-      [self logWithFormat:@"ERROR(%s): cannot update quick '%@': %@",
-           __PRETTY_FUNCTION__, qsql, error];
+  }
+  
+  /* execute */
+  // TODO: execute in transactions
+
+  if ((error = [storeChannel evaluateExpressionX:bsql]) != nil) {
+    [self logWithFormat:@"ERROR(%s): cannot %s content '%@': %@", 
+         __PRETTY_FUNCTION__, isNewRecord ? "insert" : "update", bsql, error];
+  }
+  
+  if (error == nil && qsql != nil) {
+    if ((error = [quickChannel evaluateExpressionX:qsql]) != nil) {
+      NSString    *delsql;
+      NSException *delErr;
+       
+      [self logWithFormat:@"ERROR(%s): cannot %s quick '%@': %@", 
+             __PRETTY_FUNCTION__, isNewRecord ? "insert" : "update", 
+             qsql, error];
+      
+      if (isNewRecord) {
+       /* insert in quick failed, so delete in content table */
+       
+       delsql = [@"DELETE FROM " stringByAppendingString:
+                    [self storeTableName]];
+       delsql = [delsql stringByAppendingString:@" WHERE c_name="];
+       delsql = [delsql stringByAppendingString:[self _formatRowValue:_name]];
+       if ((delErr = [storeChannel evaluateExpressionX:delsql]) != nil) {
+           [self logWithFormat:
+                 @"ERROR(%s): could not delete content '%@' after quick-fail:"
+                 @" %@", __PRETTY_FUNCTION__, delsql, error];
+       }
+      }
     }
   }
   
   [self releaseChannel:storeChannel];
-  [self releaseChannel:quickChannel];
+  if (!self->ofFlags.sameTableForQuick) [self releaseChannel:quickChannel];
   return error;
 }
 
@@ -526,12 +557,14 @@ static OCSStringFormatter *stringFormatter = nil;
     [self logWithFormat:@"ERROR(%s): could not open storage channel!"];
     return nil;
   }
-  if ((quickChannel = [self acquireQuickChannel]) == nil) {
-    [self logWithFormat:@"ERROR(%s): could not open quick channel!"];
-    [self releaseChannel:storeChannel];
-    return nil;
+  if (!self->ofFlags.sameTableForQuick) {
+    if ((quickChannel = [self acquireQuickChannel]) == nil) {
+      [self logWithFormat:@"ERROR(%s): could not open quick channel!"];
+      [self releaseChannel:storeChannel];
+      return nil;
+    }
   }
-
+  
   /* delete rows */
 
   delsql = [@"DELETE FROM " stringByAppendingString:[self storeTableName]];
@@ -542,7 +575,7 @@ static OCSStringFormatter *stringFormatter = nil;
            @"ERROR(%s): cannot delete content '%@': %@", 
          __PRETTY_FUNCTION__, delsql, error];
   }
-  else {
+  else if (!self->ofFlags.sameTableForQuick) {
     /* content row deleted, now delete the quick row */
     delsql = [@"DELETE FROM " stringByAppendingString:[self quickTableName]];
     delsql = [delsql stringByAppendingString:@" WHERE c_name="];
@@ -561,7 +594,8 @@ static OCSStringFormatter *stringFormatter = nil;
   /* release channels and return */
   
   [self releaseChannel:storeChannel];
-  [self releaseChannel:quickChannel];
+  if (!self->ofFlags.sameTableForQuick)
+    [self releaseChannel:quickChannel];
   return error;
 }
 
index 6ce48480e55aaa9ae00147291fdf827c24328208..88a95c84f3bb51b864ce613a70d5011d886427a6 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __OGoContentStore_OCSFolderManager_H__
 #define __OGoContentStore_OCSFolderManager_H__
index 78e0144f3fb62e0d001f5c0201df39ba10486e3a..2c5bdd6047dc2a0bcf62c94eb2edeb0046de4ef2 100644 (file)
@@ -2,7 +2,7 @@
 
 MAJOR_VERSION=0
 MINOR_VERSION=9
-SUBMINOR_VERSION:=20
+SUBMINOR_VERSION:=21
 
 # v0.9.19 requires libNGiCal       v4.5.40
 # v0.9.18 requires libNGiCal       v4.5.38