From 46e921da0fc9a400feba9584e75a3bb86ac9b1b6 Mon Sep 17 00:00:00 2001 From: "waterson%netscape.com" Date: Tue, 11 Jan 2000 01:59:12 +0000 Subject: [PATCH] Bug 18631. Add GetDataSources() method to nsIRDFCompositeDataSource. r=scottip,rjc --- mailnews/base/src/nsMessageViewDataSource.cpp | 5 ++ rdf/base/idl/nsIRDFCompositeDataSource.idl | 53 +++++++++++++++-- rdf/base/src/nsCompositeDataSource.cpp | 57 ++++++++++--------- 3 files changed, 82 insertions(+), 33 deletions(-) diff --git a/mailnews/base/src/nsMessageViewDataSource.cpp b/mailnews/base/src/nsMessageViewDataSource.cpp index 8cf6dcb9ec71..ab722013ca20 100644 --- a/mailnews/base/src/nsMessageViewDataSource.cpp +++ b/mailnews/base/src/nsMessageViewDataSource.cpp @@ -448,6 +448,11 @@ NS_IMETHODIMP nsMessageViewDataSource::RemoveDataSource(nsIRDFDataSource* source return NS_OK; } +NS_IMETHODIMP nsMessageViewDataSource::GetDataSources(nsISimpleEnumerator** _result) +{ + return NS_NewSingletonEnumerator(_result, mDataSource); +} + NS_IMETHODIMP nsMessageViewDataSource::OnAssert(nsIRDFResource* subject, nsIRDFResource* predicate, nsIRDFNode* object) diff --git a/rdf/base/idl/nsIRDFCompositeDataSource.idl b/rdf/base/idl/nsIRDFCompositeDataSource.idl index edcaefc55377..9f06fbda1abc 100644 --- a/rdf/base/idl/nsIRDFCompositeDataSource.idl +++ b/rdf/base/idl/nsIRDFCompositeDataSource.idl @@ -22,19 +22,60 @@ #include "nsIRDFDataSource.idl" -// An nsIRDFCompositeDataSource composes individual data sources, providing -// the illusion of a single, coherent RDF graph. +interface nsISimpleEnumerator; + +/** + * An nsIRDFCompositeDataSource composes individual data sources, providing + * the illusion of a single, coherent RDF graph. + */ [scriptable, uuid(96343820-307C-11D2-BC15-00805F912FE7)] interface nsIRDFCompositeDataSource : nsIRDFDataSource { - attribute boolean allowNegativeAssertions; // true by default - attribute boolean coalesceDuplicateArcs; // true by default + /** + * + * Set this value to true if the composite datasource + * may contains at least one datasource that has negative + * assertions. (This is the default.) + * + * Set this value to false if none of the datasources + * being composed contains a negative assertion. This allows the + * composite datasource to perform some query optimizations. + * + * By default, this value is true. + */ + attribute boolean allowNegativeAssertions; - // Add a datasource the the database. + /** + * Set to true if the composite datasource should + * take care to coalesce duplicate arcs when returning values from + * queries. (This is the default.) + * + * Set to false if the composite datasource shouldn't + * bother to check for duplicates. This allows the composite + * datasource to more efficiently answer queries. + * + * By default, this value is true. + */ + attribute boolean coalesceDuplicateArcs; + + /** + * Add a datasource the the composite data source. + * @param aDataSource the datasource to add to composite + */ void AddDataSource(in nsIRDFDataSource aDataSource); - // Remove a datasource from the database + /** + * Remove a datasource from the composite data source. + * @param aDataSource the datasource to remove from the composite + */ void RemoveDataSource(in nsIRDFDataSource aDataSource); + + /** + * Retrieve the datasources in the composite data source. + * @return an nsISimpleEnumerator that will enumerate each + * of the datasources in the composite + */ + nsISimpleEnumerator GetDataSources(); }; %{C++ diff --git a/rdf/base/src/nsCompositeDataSource.cpp b/rdf/base/src/nsCompositeDataSource.cpp index bbb23ed34ebd..d098dfe94246 100644 --- a/rdf/base/src/nsCompositeDataSource.cpp +++ b/rdf/base/src/nsCompositeDataSource.cpp @@ -65,8 +65,10 @@ PRLogModuleInfo* nsRDFLog = nsnull; static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -//////////////////////////////////////////////////////////////////////// +//---------------------------------------------------------------------- +// // CompositeDataSourceImpl +// class CompositeDataSourceImpl : public nsIRDFCompositeDataSource, public nsIRDFObserver @@ -102,9 +104,7 @@ protected: virtual ~CompositeDataSourceImpl(void); }; - - -//////////////////////////////////////////////////////////////////////// +//---------------------------------------------------------------------- // // CompositeEnumeratorImpl // @@ -158,11 +158,6 @@ CompositeEnumeratorImpl::CompositeEnumeratorImpl(CompositeDataSourceImpl* aCompo CompositeEnumeratorImpl::~CompositeEnumeratorImpl(void) { -#ifdef DEBUG_REFS - --gInstanceCount; - fprintf(stdout, "%d - RDF: CompositeEnumeratorImpl\n", gInstanceCount); -#endif - if (mCoalesceDuplicateArcs == PR_TRUE) { for (PRInt32 i = mAlreadyReturned.Count() - 1; i >= 0; --i) @@ -341,7 +336,7 @@ CompositeEnumeratorImpl::GetNext(nsISupports** aResult) return NS_OK; } -//////////////////////////////////////////////////////////////////////// +//---------------------------------------------------------------------- // // CompositeArcsInOutEnumeratorImpl // @@ -391,11 +386,6 @@ CompositeArcsInOutEnumeratorImpl::CompositeArcsInOutEnumeratorImpl( CompositeArcsInOutEnumeratorImpl::~CompositeArcsInOutEnumeratorImpl() { -#ifdef DEBUG_REFS - --gInstanceCount; - fprintf(stdout, "%d - RDF: CompositeArcsInOutEnumeratorImpl\n", gInstanceCount); -#endif - NS_RELEASE(mNode); } @@ -425,7 +415,7 @@ CompositeArcsInOutEnumeratorImpl::HasNegation( } -//////////////////////////////////////////////////////////////////////// +//---------------------------------------------------------------------- // // CompositeAssertionEnumeratorImpl // @@ -482,11 +472,6 @@ CompositeAssertionEnumeratorImpl::CompositeAssertionEnumeratorImpl( CompositeAssertionEnumeratorImpl::~CompositeAssertionEnumeratorImpl() { -#ifdef DEBUG_REFS - --gInstanceCount; - fprintf(stdout, "%d - RDF: CompositeAssertionEnumeratorImpl\n", gInstanceCount); -#endif - NS_IF_RELEASE(mSource); NS_RELEASE(mProperty); NS_IF_RELEASE(mTarget); @@ -552,14 +537,12 @@ CompositeDataSourceImpl::CompositeDataSourceImpl(void) CompositeDataSourceImpl::~CompositeDataSourceImpl(void) { -#ifdef DEBUG_REFS - --gInstanceCount; - fprintf(stdout, "%d - RDF: CompositeDataSourceImpl\n", gInstanceCount); -#endif } -//////////////////////////////////////////////////////////////////////// +//---------------------------------------------------------------------- +// // nsISupports interface +// NS_IMPL_ADDREF(CompositeDataSourceImpl); @@ -620,8 +603,10 @@ CompositeDataSourceImpl::QueryInterface(REFNSIID iid, void** result) -//////////////////////////////////////////////////////////////////////// +//---------------------------------------------------------------------- +// // nsIRDFDataSource interface +// NS_IMETHODIMP CompositeDataSourceImpl::GetURI(char* *uri) @@ -1369,6 +1354,24 @@ CompositeDataSourceImpl::RemoveDataSource(nsIRDFDataSource* aDataSource) return NS_OK; } + +NS_IMETHODIMP +CompositeDataSourceImpl::GetDataSources(nsISimpleEnumerator** _result) +{ + nsresult rv; + + // Create an nsISupportsArray, copy the datasources into it, then + // use that to create an array enumerator. + nsCOMPtr temp; + rv = NS_NewISupportsArray(getter_AddRefs(temp)); + if (NS_FAILED(rv)) return rv; + + for (PRInt32 i = 0; i < mDataSources.Count(); ++i) + temp->AppendElement(NS_STATIC_CAST(nsIRDFDataSource*, mDataSources[i])); + + return NS_NewArrayEnumerator(_result, temp); +} + NS_IMETHODIMP CompositeDataSourceImpl::OnAssert(nsIRDFResource* aSource, nsIRDFResource* aProperty,