xref: /trunk/main/xmlhelp/source/cxxhelp/provider/db.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef BERKELEYDBPROXY_DB_HXX_
28 #define BERKELEYDBPROXY_DB_HXX_
29 
30 #ifdef SYSTEM_DB
31 #include <db.h>
32 #else
33 #include <berkeleydb/db.h>
34 #endif
35 
36 #include "com/sun/star/ucb/XSimpleFileAccess.hpp"
37 
38 #include <hash_map>
39 #include <rtl/string.hxx>
40 
41 extern "C" {
42   typedef void *(*db_malloc_fcn_type)(size_t);
43   typedef void *(*db_realloc_fcn_type)(void *, size_t);
44   typedef void (*db_free_fcn_type)(void *);
45 }
46 
47 
48 namespace berkeleydbproxy {
49 
50     class Dbc;
51     class Dbt;
52 
53     namespace db_internal
54     {
55         class Noncopyable
56         {
57             // not implemented
58             Noncopyable(const Noncopyable&);
59             void operator=(const Noncopyable&);
60         protected:
61             Noncopyable() {}
62             ~Noncopyable() {}
63         };
64     }
65 
66     class DbException
67     {
68         rtl::OString what_;
69     public:
70         explicit DbException(rtl::OString const & whatparam)
71         : what_(whatparam)
72         {}
73 
74         const char *what() const
75         { return what_.getStr(); }
76     };
77 
78     struct eq
79     {
80         bool operator()( const rtl::OString& rKey1, const rtl::OString& rKey2 ) const
81             { return rKey1.compareTo( rKey2 ) == 0; }
82     };
83 
84     struct ha
85     {
86         size_t operator()( const rtl::OString& rName ) const
87             { return rName.hashCode(); }
88     };
89 
90 
91 //#define TEST_DBHELP
92 
93     class DBData
94     {
95         friend class        DBHelp;
96 
97         int                 m_nSize;
98         char*               m_pBuffer;
99 
100         void copyToBuffer( const char* pSrcData, int nSize );
101 
102     public:
103         DBData( void )
104             : m_nSize( 0 )
105             , m_pBuffer( NULL )
106         {}
107         ~DBData()
108             { delete [] m_pBuffer; }
109 
110         int getSize() const
111             { return m_nSize; }
112         const char* getData() const
113             { return m_pBuffer; }
114     };
115 
116     typedef std::hash_map< rtl::OString,std::pair<int,int>,ha,eq >  StringToValPosMap;
117     typedef std::hash_map< rtl::OString,rtl::OString,ha,eq >        StringToDataMap;
118 
119     class DBHelp
120     {
121         rtl::OUString       m_aFileURL;
122         StringToDataMap*    m_pStringToDataMap;
123         StringToValPosMap*  m_pStringToValPosMap;
124         com::sun::star::uno::Reference< com::sun::star::ucb::XSimpleFileAccess >
125                             m_xSFA;
126 
127         com::sun::star::uno::Sequence< sal_Int8 >
128                             m_aItData;
129         const char*         m_pItData;
130         int                 m_nItRead;
131         int                 m_iItPos;
132 
133         bool implReadLenAndData( const char* pData, int& riPos, DBData& rValue );
134 
135     public:
136         //DBHelp must get a fileURL which can then directly be used by simple file access.
137         //SimpleFileAccess requires file URLs as arguments. Passing file path may work but fails
138         //for example when using long file paths on Windows, which start with "\\?\"
139         DBHelp( const rtl::OUString& rFileURL,
140             com::sun::star::uno::Reference< com::sun::star::ucb::XSimpleFileAccess > xSFA )
141                 : m_aFileURL( rFileURL )
142                 , m_pStringToDataMap( NULL )
143                 , m_pStringToValPosMap( NULL )
144                 , m_xSFA( xSFA )
145                 , m_pItData( NULL )
146                 , m_nItRead( -1 )
147                 , m_iItPos( -1 )
148         {
149             OSL_ASSERT(!rFileURL.compareTo(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file:")), 5));
150         }
151         ~DBHelp()
152             { releaseHashMap(); }
153 
154         void createHashMap( bool bOptimizeForPerformance = false );
155         void releaseHashMap( void );
156 
157 #ifdef TEST_DBHELP
158         bool testAgainstDb( const rtl::OUString& fileURL, bool bOldDbAccess );
159 #endif
160 
161         bool getValueForKey( const rtl::OString& rKey, DBData& rValue );
162 
163         bool startIteration( void );
164         bool getNextKeyAndValue( DBData& rKey, DBData& rValue );
165         void stopIteration( void );
166     };
167 
168     class Db : db_internal::Noncopyable
169     {
170     private:
171         DB* m_pDBP;
172         DBHelp* m_pDBHelp;
173 
174     public:
175         Db();
176         ~Db();
177 
178         void setDBHelp( DBHelp* pDBHelp )
179             { m_pDBHelp = pDBHelp; }
180         DBHelp* getDBHelp( void )
181             { return m_pDBHelp; }
182 
183         int close(u_int32_t flags);
184 
185         int open(DB_TXN *txnid,
186                  const char *file,
187                  const char *database,
188                  DBTYPE type,
189                  u_int32_t flags,
190                  int mode);
191 
192         int open(DB_TXN *txnid,
193                  ::rtl::OUString const & fileURL,
194                  DBTYPE type,
195                  u_int32_t flags,
196                  int mode);
197 
198 
199         int get(DB_TXN* txnid, Dbt *key, Dbt *data, u_int32_t flags);
200 
201         int cursor(DB_TXN *txnid, Dbc **cursorp, u_int32_t flags);
202     };
203 
204     class Dbc : db_internal::Noncopyable
205     {
206         friend class Db;
207         friend class Dbt;
208 
209     private:
210         DBC* m_pDBC;
211 
212         explicit Dbc(DBC* pDBC);
213         ~Dbc();
214 
215     public:
216         int close();
217 
218         int get(Dbt *key, Dbt *data, u_int32_t flags);
219     };
220 
221     class Dbt: private DBT
222     {
223         friend class Db;
224         friend class Dbc;
225 
226     public:
227         Dbt(void *data_arg, u_int32_t size_arg);
228 
229         Dbt();
230         //Dbt(const Dbt & other);
231         //Dbt & operator=(const Dbt & other);
232 
233         ~Dbt();
234 
235         void *get_data() const;
236         void set_data(void *value);
237 
238         u_int32_t get_size() const;
239         void set_size(u_int32_t value);
240 
241         void set_flags(u_int32_t);
242     };
243 }
244 
245 #endif
246 
247 
248 
249 
250 
251 
252 
253 
254 
255 
256 
257 
258 
259 
260 
261 
262