From fc38a2a891db2ba344504270185f0959b84ccf95 Mon Sep 17 00:00:00 2001
From: Andrew Ferguson <andrew.ferguson@symbian.com>
Date: Tue, 27 Feb 2007 13:58:09 +0000
Subject: [PATCH] fix bug in DBProperties use in the PDOM

---
 .../cdt/internal/pdom/tests/PDOMBugsTest.java | 62 +++++++++++++++++++
 .../cdt/internal/pdom/tests/PDOMTests.java    |  1 +
 .../eclipse/cdt/internal/core/pdom/PDOM.java  | 14 +++--
 3 files changed, 73 insertions(+), 4 deletions(-)
 create mode 100644 core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java

diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java
new file mode 100644
index 00000000000..29d0a2dacdb
--- /dev/null
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Symbian Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Andrew Ferguson (Symbian) - Initial implementation
+ *******************************************************************************/
+package org.eclipse.cdt.internal.pdom.tests;
+
+import junit.framework.Test;
+
+import org.eclipse.cdt.core.dom.IPDOMManager;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.testplugin.CProjectHelper;
+import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
+import org.eclipse.cdt.internal.core.CCoreInternals;
+import org.eclipse.cdt.internal.core.index.IWritableIndexFragment;
+import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.NullProgressMonitor;
+
+/**
+ * Tests bugs found in the PDOM
+ */
+public class PDOMBugsTest extends BaseTestCase {
+	ICProject cproject;
+	
+	public static Test suite() {
+		return suite(PDOMBugsTest.class);
+	}
+	
+	protected void setUp() throws Exception {
+		cproject= CProjectHelper.createCCProject("PDOMBugsTest"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER);		
+		super.setUp();
+	}
+
+	protected void tearDown() throws Exception {
+		if (cproject != null) {
+			cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor());
+		}
+		super.tearDown();
+	}
+
+	public void testPDOMProperties() throws Exception {
+		IWritableIndexFragment pdom = (IWritableIndexFragment) CCoreInternals.getPDOMManager().getPDOM(cproject);
+		pdom.acquireWriteLock(0);
+		try {
+			WritablePDOM wpdom = (WritablePDOM) pdom;
+			wpdom.setProperty("a", "b");
+			assertEquals("b", wpdom.getProperty("a"));
+			wpdom.setProperty("c", "d");
+			assertEquals("d", wpdom.getProperty("c"));
+			wpdom.setProperty("c", "e");
+			assertEquals("e", wpdom.getProperty("c"));
+		} finally {
+			pdom.releaseWriteLock(0);
+		}
+	}
+}
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTests.java
index 21422e049d9..8f231643850 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTests.java
@@ -26,6 +26,7 @@ public class PDOMTests extends TestSuite {
 		
 		suite.addTest(DBTest.suite());
 		suite.addTest(DBPropertiesTests.suite());
+		suite.addTest(PDOMBugsTest.suite());
 		suite.addTest(PDOMSearchTest.suite());
 		suite.addTestSuite(PDOMLocationTests.class);
 		suite.addTestSuite(EnumerationTests.class);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
index 2fbed745670..3ccb99822a6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
@@ -48,9 +48,9 @@ import org.eclipse.cdt.internal.core.index.IIndexFragmentName;
 import org.eclipse.cdt.internal.core.pdom.db.BTree;
 import org.eclipse.cdt.internal.core.pdom.db.DBProperties;
 import org.eclipse.cdt.internal.core.pdom.db.Database;
+import org.eclipse.cdt.internal.core.pdom.dom.ApplyVisitor;
 import org.eclipse.cdt.internal.core.pdom.dom.BindingCollector;
 import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
-import org.eclipse.cdt.internal.core.pdom.dom.ApplyVisitor;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude;
@@ -190,15 +190,21 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
 		return file;		
 	}
 
+	protected void clearFileIndex() throws CoreException {
+		db.putInt(FILE_INDEX, 0);
+		fileIndex = null;	
+	}
+	
 	protected void clear() throws CoreException {
 		Database db = getDB();
 		// Clear out the database
 		db.clear(1);
 
 		// Zero out the File Index and Linkages
-		db.putInt(FILE_INDEX, 0);
-		fileIndex = null;
-
+		clearFileIndex();
+		
+		db.putInt(PROPERTIES, 0);
+		
 		db.putInt(LINKAGES, 0);
 		fLinkageIDCache.clear();
 	}