office-gobmx/connectivity/source/drivers/mozab/mozillasrc/MQuery.hxx
2012-03-23 20:47:56 +00:00

277 lines
11 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef _CONNECTIVITY_MAB_QUERY_HXX_
#define _CONNECTIVITY_MAB_QUERY_HXX_
#include "MColumnAlias.hxx"
#include "MErrorResource.hxx"
#include <connectivity/FValue.hxx>
#include "MNSDeclares.hxx"
#include <osl/thread.hxx>
#include <com/sun/star/mozilla/MozillaProductType.hpp>
namespace connectivity
{
namespace mozab
{
class MQueryHelper;
struct MQueryDirectory;
namespace MQueryOp {
typedef enum {
Exists = 0,
DoesNotExist = 1,
Contains = 2,
DoesNotContain = 3,
Is = 4,
IsNot = 5,
BeginsWith = 6,
EndsWith = 7,
SoundsLike = 8,
RegExp = 9
} cond_type;
}
class MQueryExpressionBase {
public:
typedef enum {
Unknown,
StringExpr,
Expr
} node_type;
protected:
node_type m_eNodeType;
MQueryExpressionBase() : m_eNodeType( Unknown ) {}
MQueryExpressionBase( node_type _eNodeType ) : m_eNodeType( _eNodeType ) {}
public:
sal_Bool isUnknown( ) const { return m_eNodeType == Unknown; }
sal_Bool isStringExpr( ) const { return m_eNodeType == StringExpr; }
sal_Bool isExpr( ) const { return m_eNodeType == Expr; }
};
class MQueryExpressionString : public MQueryExpressionBase {
protected:
::rtl::OUString m_aName; // LHS
MQueryOp::cond_type m_aBooleanCondition;
::rtl::OUString m_aValue; // RHS
public:
MQueryExpressionString( ::rtl::OUString& lhs,
MQueryOp::cond_type cond,
::rtl::OUString rhs )
: MQueryExpressionBase( MQueryExpressionBase::StringExpr )
, m_aName( lhs )
, m_aBooleanCondition( cond )
, m_aValue( rhs )
{
}
MQueryExpressionString( ::rtl::OUString& lhs,
MQueryOp::cond_type cond )
: MQueryExpressionBase( MQueryExpressionBase::StringExpr )
, m_aName( lhs )
, m_aBooleanCondition( cond )
, m_aValue( ::rtl::OUString() )
{
}
const ::rtl::OUString& getName() const { return m_aName; }
MQueryOp::cond_type getCond() const { return m_aBooleanCondition; }
const ::rtl::OUString& getValue() const { return m_aValue; }
};
class MQuery;
class MQueryExpression : public MQueryExpressionBase
{
friend class MQuery;
public:
typedef ::std::vector< MQueryExpressionBase* > ExprVector;
typedef enum {
AND,
OR
} bool_cond;
void setExpressions( ExprVector& _exprVector )
{ m_aExprVector = _exprVector; }
// All expressions on a peer level use same condition operator
void setExpressionCondition( bool_cond _cond )
{ m_aExprCondType = _cond; }
ExprVector& getExpressions( )
{ return m_aExprVector; }
// All expressions on a peer level use same condition operator
bool_cond getExpressionCondition( ) const
{ return m_aExprCondType; }
MQueryExpression() : MQueryExpressionBase( MQueryExpressionBase::Expr ),
m_aExprCondType( OR )
{ m_aExprVector.clear(); }
protected:
ExprVector m_aExprVector;
bool_cond m_aExprCondType;
};
class MQuery
{
/*
* A query resultset with a maximum limit of
* m_nMaxNrOfReturns return items, is created from
* the following SQL statement:
*
* -------------------------------------------------
* SELECT m_aAttributes FROM m_aAddressbook
* WHERE m_aMatchItems SQL_OPR m_aMatchValue
* -------------------------------------------------
*
* We are\are not, depending on boolean m_bQuerySubDirs,
* interested in querying the sub-directories of the
* addressbook directory, if any.
*
* SQL_OPR:
* m_aSqlOppr contains the SQL operations for every
* attribute in m_aAttributes.
* This member must be initialised together with
* m_aAttributes.
*
* The SQL operations defined for 'SQL_OPR' are:
* matchExists = 0,
* matchDoesNotExist = 1,
* matchContains = 2,
* matchDoesNotContain = 3,
* matchIs = 4,
* matchIsNot = 5,
* matchBeginsWith = 6,
* matchEndsWith = 7,
* matchSoundsLike = 8,
* matchRegExp = 9.
* There must be mapping to one of these values.
*
* The following members MUST be initialised before
* a query is executed:
* m_Attributes, m_aMapAttrOppr, m_aAddressbook,
* m_aMatchItems and m_aMatchValue.
*
* m_bQuerySubDirs and m_nMaxNrReturns are set to a
* default value in the constructor which can be
* overridden. If (element of) m_aSqlOppr is not set,
* the default SQL operation is 'matchIs'.
*
*/
private:
MQueryDirectory *m_aQueryDirectory;
MQueryHelper *m_aQueryHelper;
::rtl::OUString m_aAddressbook;
sal_Int32 m_nMaxNrOfReturns;
sal_Bool m_bQuerySubDirs;
MQueryExpression m_aExpr;
const OColumnAlias& m_rColumnAlias;
::com::sun::star::mozilla::MozillaProductType
m_Product;
::rtl::OUString m_Profile;
ErrorDescriptor m_aError;
void construct();
protected:
::osl::Mutex m_aMutex;
#if OSL_DEBUG_LEVEL > 0
oslThreadIdentifier m_oThreadID;
#endif
public:
/*
* - Contains accessors to the members of this class.
* - executeQuery() initiates a non-blocking query.
*/
sal_Int32 executeQuery(OConnection* _pCon);
sal_Int32 executeQueryProxied(OConnection* _pCon); //Used only by MNSMozabProxy
sal_Int32 createNewCard(); //return Row count number
sal_Int32 deleteRow(const sal_Int32 rowIndex);
sal_Int32 commitRow(const sal_Int32 rowIndex);
sal_Bool resyncRow(sal_Int32 nDBRow);
sal_Bool isWritable(OConnection* _pCon);
sal_uInt32 InsertLoginInfo(OConnection* _pCon);
void setAddressbook( ::rtl::OUString&);
const OColumnAlias& getColumnAlias() const { return m_rColumnAlias; }
void setExpression( MQueryExpression &_expr );
void setMaxNrOfReturns( const sal_Int32);
sal_Int32 getRowCount( void );
sal_uInt32 getRealRowCount( void );
sal_Bool queryComplete( void );
sal_Bool waitForQueryComplete( void );
sal_Bool checkRowAvailable( sal_Int32 nDBRow );
sal_Bool getRowValue( connectivity::ORowSetValue& rValue,
sal_Int32 nDBRow,
const rtl::OUString& aDBColumnName,
sal_Int32 nType ) const;
sal_Bool setRowValue( connectivity::ORowSetValue& rValue,
sal_Int32 nDBRow,
const rtl::OUString& aDBColumnName,
sal_Int32 nType ) const;
sal_Int32 getRowStates(sal_Int32 nDBRow);
sal_Bool setRowStates(sal_Int32 nDBRow,sal_Int32 aState);
bool hadError() const { return m_aError.is(); }
inline const ErrorDescriptor& getError() const { return m_aError; }
public:
// MQuery();
MQuery( const OColumnAlias& _ca );
virtual ~MQuery();
static MNameMapper* CreateNameMapper();
static void FreeNameMapper( MNameMapper* _ptr );
};
}
}
#endif // _CONNECTIVITY_MAB_QUERY_HXX_
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */