LibreOffice Module sw (master)  1
dbmgr.hxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 #ifndef INCLUDED_SW_INC_DBMGR_HXX
20 #define INCLUDED_SW_INC_DBMGR_HXX
21 
22 #include <rtl/ustring.hxx>
23 #include <tools/solar.h>
24 #include <i18nlangtag/lang.h>
25 #include <com/sun/star/util/Date.hpp>
26 #include "swdllapi.h"
27 #include "swdbdata.hxx"
28 #include <com/sun/star/uno/Reference.h>
29 #include <com/sun/star/uno/Sequence.hxx>
30 #include <com/sun/star/lang/Locale.hpp>
31 #include <com/sun/star/beans/PropertyValue.hpp>
32 
33 #include <memory>
34 #include <vector>
35 
36 namespace com{namespace sun{namespace star{
37  namespace sdbc{
38  class XConnection;
39  class XStatement;
40  class XDataSource;
41  class XResultSet;
42  }
43  namespace beans{
44 
45  class XPropertySet;
46  }
47  namespace sdbcx{
48  class XColumnsSupplier;
49  }
50  namespace util{
51  class XNumberFormatter;
52  }
53  namespace mail{
54  class XSmtpService;
55  }
56  namespace embed { class XStorage; }
57  namespace frame { class XStorable; }
58 }}}
59 namespace svx {
60  class ODataAccessDescriptor;
61 }
62 
64 {
65  css::util::Date aNullDate;
66  css::uno::Reference< css::util::XNumberFormatter> xFormatter;
67  css::lang::Locale aLocale;
68 };
69 
70 namespace weld {
71  class ComboBox;
72  class Window;
73 }
74 
75 class SwView;
76 class SwWrtShell;
77 class ListBox;
78 class SvNumberFormatter;
79 class SwXMailMerge;
81 class SwCalc;
82 class INetURLObject;
83 class SwDocShell;
84 
86 {
92 };
93 
94 // Administration of (new) logical databases.
95 enum class SwDBSelect
96 {
98 };
99 
100 struct SwDSParam : public SwDBData
101 {
102  css::util::Date aNullDate;
103 
104  css::uno::Reference<css::util::XNumberFormatter> xFormatter;
105  css::uno::Reference< css::sdbc::XConnection> xConnection;
106  css::uno::Reference< css::sdbc::XStatement> xStatement;
107  css::uno::Reference< css::sdbc::XResultSet> xResultSet;
108  css::uno::Sequence< css::uno::Any > aSelection;
110  bool bEndOfDB;
112 
113  SwDSParam(const SwDBData& rData) :
114  SwDBData(rData),
115  bScrollable(false),
116  bEndOfDB(false),
117  nSelectionIndex(0)
118  {}
119 
120  SwDSParam(const SwDBData& rData,
121  const css::uno::Reference< css::sdbc::XResultSet>& xResSet,
122  const css::uno::Sequence< css::uno::Any >& rSelection) :
123  SwDBData(rData),
124  xResultSet(xResSet),
125  aSelection(rSelection),
126  bScrollable(true),
127  bEndOfDB(false),
128  nSelectionIndex(0)
129  {}
130 
131  bool HasValidRecord() const
132  { return( !bEndOfDB && xResultSet.is() ); }
133 };
134 
135 typedef std::vector<std::unique_ptr<SwDSParam>> SwDSParams_t;
136 
138 {
142 
150 
155  OUString sSaveToFilter;
157  css::uno::Sequence< css::beans::PropertyValue > aSaveToFilterData;
172  OUString sPrefix;
187  OUString sSubject;
188  OUString sMailBody;
189  OUString sAttachmentName;
190  css::uno::Sequence< OUString > aCopiesTo;
191  css::uno::Sequence< OUString > aBlindCopiesTo;
192  css::uno::Reference< css::mail::XSmtpService > xSmtpServer;
203  OUString sDBcolumn;
204 
211  css::uno::Sequence< css::beans::PropertyValue > aPrintOptions;
215 
217  SwWrtShell& rShell,
218  const svx::ODataAccessDescriptor& rDesc ) :
219  nMergeType(nType),
220  rSh(rShell),
221  rDescriptor(rDesc),
222  bCreateSingleFile( false ),
223  bPrefixIsFilename( false ),
224  bSendAsHTML( true ),
225  bSendAsAttachment( false ),
226  pMailMergeConfigItem( nullptr )
227  {
228  if( nType == DBMGR_MERGE_SHELL || nType == DBMGR_MERGE_PRINTER )
229  bCreateSingleFile = true;
230  }
231 };
232 
233 class SwDoc;
234 
236 {
237  struct SwDBManager_Impl;
240 
241  enum class MergeStatus
242  {
243  Ok = 0, Cancel, Error
244  };
245 
247  bool m_bInitDBFields : 1;
248  bool m_bInMerge : 1;
249  bool m_bMergeSilent : 1;
251  std::unique_ptr<SwDBManager_Impl> m_pImpl;
253  OUString m_sEmbeddedName;
255 
257  static std::vector<std::pair<SwDocShell*, OUString>> m_aUncommittedRegistrations;
258 
260  std::vector<OUString> m_aNotUsedConnections;
261 
263  void SetAsUsed(const OUString& rName);
264 
267 
268  SAL_DLLPRIVATE SwDSParam* FindDSData(const SwDBData& rData, bool bCreate);
269  SAL_DLLPRIVATE SwDSParam* FindDSConnection(const OUString& rSource, bool bCreate);
270 
272  SAL_DLLPRIVATE void ImportFromConnection( SwWrtShell* pSh);
273 
275  SAL_DLLPRIVATE void ImportDBEntry(SwWrtShell* pSh);
276 
278  SAL_DLLPRIVATE bool MergeMailFiles( SwWrtShell* pSh,
279  const SwMergeDescriptor& rMergeDescriptor );
280 
281  SAL_DLLPRIVATE bool ToNextMergeRecord();
282  SAL_DLLPRIVATE bool IsValidMergeRecord() const;
283 
284  SwDBManager(SwDBManager const&) = delete;
285  SwDBManager& operator=(SwDBManager const&) = delete;
286 
287 public:
288  SwDBManager(SwDoc* pDoc);
289  ~SwDBManager() COVERITY_NOEXCEPT_FALSE;
290 
292  const SwXMailMerge * GetMailMergeEvtSrc() const { return m_pMergeEvtSrc; }
293  void SetMailMergeEvtSrc( const SwXMailMerge *pSrc ) { m_pMergeEvtSrc = pSrc; }
294 
295  bool IsMergeSilent() const { return m_bMergeSilent; }
296  void SetMergeSilent( bool bVal ) { m_bMergeSilent = bVal; }
297 
299  bool Merge( const SwMergeDescriptor& rMergeDesc );
300  void MergeCancel();
301 
302  bool IsMergeOk() { return MergeStatus::Ok == m_aMergeStatus; };
303  bool IsMergeError() { return MergeStatus::Error <= m_aMergeStatus; };
304 
305  static std::shared_ptr<SwMailMergeConfigItem> PerformMailMerge(SwView const * pView);
306 
308  bool IsInitDBFields() const { return m_bInitDBFields; }
309  void SetInitDBFields(bool b) { m_bInitDBFields = b; }
310 
312  bool GetTableNames(weld::ComboBox& rBox, const OUString& rDBName);
313 
315  void GetColumnNames(ListBox* pListBox,
316  const OUString& rDBName, const OUString& rTableName);
317  void GetColumnNames(weld::ComboBox& rBox,
318  const OUString& rDBName, const OUString& rTableName);
319  static void GetColumnNames(ListBox* pListBox,
320  css::uno::Reference< css::sdbc::XConnection> const & xConnection,
321  const OUString& rTableName);
322  static void GetColumnNames(weld::ComboBox& rBox,
323  css::uno::Reference< css::sdbc::XConnection> const & xConnection,
324  const OUString& rTableName);
325 
326  static sal_uLong GetColumnFormat( css::uno::Reference< css::sdbc::XDataSource> const & xSource,
327  css::uno::Reference< css::sdbc::XConnection> const & xConnection,
328  css::uno::Reference< css::beans::XPropertySet> const & xColumn,
329  SvNumberFormatter* pNFormatr,
330  LanguageType nLanguage );
331 
332  sal_uLong GetColumnFormat( const OUString& rDBName,
333  const OUString& rTableName,
334  const OUString& rColNm,
335  SvNumberFormatter* pNFormatr,
336  LanguageType nLanguage );
337  sal_Int32 GetColumnType( const OUString& rDBName,
338  const OUString& rTableName,
339  const OUString& rColNm );
340 
341  bool IsInMerge() const { return m_bInMerge; }
342 
343  void ExecuteFormLetter(SwWrtShell& rSh,
344  const css::uno::Sequence< css::beans::PropertyValue>& rProperties);
345 
346  static void InsertText(SwWrtShell& rSh,
347  const css::uno::Sequence< css::beans::PropertyValue>& rProperties);
348 
350  bool IsDataSourceOpen(const OUString& rDataSource,
351  const OUString& rTableOrQuery, bool bMergeShell);
352 
354  bool OpenDataSource(const OUString& rDataSource, const OUString& rTableOrQuery);
355  sal_uInt32 GetSelectedRecordId(const OUString& rDataSource, const OUString& rTableOrQuery, sal_Int32 nCommandType = -1);
356  bool GetColumnCnt(const OUString& rSourceName, const OUString& rTableName,
357  const OUString& rColumnName, sal_uInt32 nAbsRecordId, LanguageType nLanguage,
358  OUString& rResult, double* pNumber);
361  css::uno::Reference< css::sdbc::XConnection> const &
362  RegisterConnection(OUString const& rSource);
363 
364  void CreateDSData(const SwDBData& rData)
365  { FindDSData(rData, true); }
366  const SwDSParams_t& GetDSParamArray() const { return m_DataSourceParams; }
367 
369  void CloseAll(bool bIncludingMerge = true);
370 
371  bool GetMergeColumnCnt(const OUString& rColumnName, LanguageType nLanguage,
372  OUString &rResult, double *pNumber);
373  bool FillCalcWithMergeData(SvNumberFormatter *pDocFormatter,
374  LanguageType nLanguage, SwCalc &aCalc);
375  void ToNextRecord(const OUString& rDataSource, const OUString& rTableOrQuery);
376 
377  sal_uInt32 GetSelectedRecordId();
378  bool ToRecordId(sal_Int32 nSet);
379 
380  static const SwDBData& GetAddressDBName();
381 
382  static OUString GetDBField(
383  css::uno::Reference< css::beans::XPropertySet > const & xColumnProp,
384  const SwDBFormatData& rDBFormatData,
385  double *pNumber = nullptr);
386 
387  static css::uno::Reference< css::sdbc::XConnection>
388  GetConnection(const OUString& rDataSource,
389  css::uno::Reference< css::sdbc::XDataSource>& rxSource,
390  const SwView* pView);
391 
392  static css::uno::Reference< css::sdbcx::XColumnsSupplier>
393  GetColumnSupplier(css::uno::Reference< css::sdbc::XConnection> const & xConnection,
394  const OUString& rTableOrQuery,
395  SwDBSelect eTableOrQuery = SwDBSelect::UNKNOWN);
396 
397  static css::uno::Sequence<OUString> GetExistingDatabaseNames();
398 
406  static OUString LoadAndRegisterDataSource(weld::Window* pParent, SwDocShell* pDocShell = nullptr);
407 
414  static OUString LoadAndRegisterDataSource(const OUString& rURI, const OUString *pDestDir);
415 
417  void LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const SwDocShell& rDocShell);
418 
420  static void RevokeDataSource(const OUString& rName);
421 
431  static css::uno::Reference< css::sdbc::XDataSource>
432  getDataSourceAsParent(const css::uno::Reference< css::sdbc::XConnection>& _xConnection,const OUString& _sDataSourceName);
433 
447  static css::uno::Reference< css::sdbc::XResultSet>
448  createCursor(const OUString& _sDataSourceName,
449  const OUString& _sCommand,
450  sal_Int32 _nCommandType,
451  const css::uno::Reference< css::sdbc::XConnection>& _xConnection,
452  const SwView* pView);
453 
454  void setEmbeddedName(const OUString& rEmbeddedName, SwDocShell& rDocShell);
455  const OUString& getEmbeddedName() const;
456 
457  // rOwnURL should be taken using INetURLObject::GetMainURL(INetURLObject::DecodeMechanism::NONE)
458  static void StoreEmbeddedDataSource(const css::uno::Reference<css::frame::XStorable>& xStorable,
459  const css::uno::Reference<css::embed::XStorage>& xStorage,
460  const OUString& rStreamRelPath,
461  const OUString& rOwnURL, bool bCopyTo = false);
462 
463  SwDoc* getDoc() const;
465  void releaseRevokeListener();
466 
468  void RevokeLastRegistrations();
469 
471  void CommitLastRegistrations();
472 
474  void RevokeNotUsedConnections();
475 };
476 
477 namespace sw
478 {
479 enum class DBConnURIType
480 {
481  UNKNOWN = 0,
482  ODB,
483  CALC,
484  DBASE,
485  FLAT,
486  MSJET,
487  MSACE,
488  WRITER
489 };
490 
492 }
493 
494 #endif
495 
496 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
css::uno::Reference< css::sdbc::XResultSet > xResultSet
Definition: dbmgr.hxx:107
bool bCreateSingleFile
Create a single or multiple results.
Definition: dbmgr.hxx:149
Definition: calc.hxx:184
void SetMailMergeEvtSrc(const SwXMailMerge *pSrc)
Definition: dbmgr.hxx:293
css::util::Date aNullDate
Definition: dbmgr.hxx:65
SwDSParams_t m_DataSourceParams
Definition: dbmgr.hxx:250
SwMailMergeConfigItem * pMailMergeConfigItem
Definition: dbmgr.hxx:214
bool bEndOfDB
Definition: dbmgr.hxx:110
sal_uIntPtr sal_uLong
css::uno::Reference< css::mail::XSmtpService > xSmtpServer
Definition: dbmgr.hxx:192
Definition: doc.hxx:185
bool HasValidRecord() const
Definition: dbmgr.hxx:131
css::util::Date aNullDate
Definition: dbmgr.hxx:102
bool bSendAsAttachment
Definition: dbmgr.hxx:194
Data records in fields.
Definition: dbmgr.hxx:87
static std::vector< std::pair< SwDocShell *, OUString > > m_aUncommittedRegistrations
Store last registrations to revoke or commit.
Definition: dbmgr.hxx:257
Dialog to specify the properties of drop-down form field.
Definition: accframe.hxx:34
bool IsInMerge() const
Definition: dbmgr.hxx:341
css::uno::Reference< css::sdbc::XConnection > xConnection
Definition: dbmgr.hxx:105
css::uno::Sequence< css::beans::PropertyValue > aSaveToFilterData
Definition: dbmgr.hxx:157
SwDBSelect
Definition: dbmgr.hxx:95
Used by the UI to modify the document model.
Definition: wrtsh.hxx:86
bool IsMergeOk()
Definition: dbmgr.hxx:302
SwDSParam(const SwDBData &rData, const css::uno::Reference< css::sdbc::XResultSet > &xResSet, const css::uno::Sequence< css::uno::Any > &rSelection)
Definition: dbmgr.hxx:120
bool IsInitDBFields() const
Initialize data fields that lack name of database.
Definition: dbmgr.hxx:308
bool IsMergeError()
Definition: dbmgr.hxx:303
Print mail merge.
Definition: dbmgr.hxx:88
DBManagerOptions
Definition: dbmgr.hxx:85
Send mail merge as email.
Definition: dbmgr.hxx:89
OUString sSaveToFilter
Definition: dbmgr.hxx:155
css::lang::Locale aLocale
Definition: dbmgr.hxx:67
Create merge doc and keep the doc shell.
Definition: dbmgr.hxx:91
OUString sMailBody
Definition: dbmgr.hxx:188
SwWrtShell & rSh
Definition: dbmgr.hxx:140
SwDoc * m_pDoc
The document that owns this manager.
Definition: dbmgr.hxx:266
bool bPrefixIsFilename
Use the sPrefix as the target filename also overwriting an existing target file.
Definition: dbmgr.hxx:180
OUString sPrefix
Basename incl.
Definition: dbmgr.hxx:172
OUString sSaveToFilterOptions
Definition: dbmgr.hxx:156
OUString sSubject
Definition: dbmgr.hxx:187
bool bScrollable
Definition: dbmgr.hxx:109
class SAL_NO_VTABLE XPropertySet
void SetMergeSilent(bool bVal)
Definition: dbmgr.hxx:296
OUString sAttachmentName
Definition: dbmgr.hxx:189
SwMergeDescriptor(const DBManagerOptions nType, SwWrtShell &rShell, const svx::ODataAccessDescriptor &rDesc)
Definition: dbmgr.hxx:216
std::unique_ptr< SwDBManager_Impl > m_pImpl
Definition: dbmgr.hxx:251
Error
#define SW_DLLPUBLIC
Definition: swdllapi.h:28
std::vector< OUString > m_aNotUsedConnections
Not used connections.
Definition: dbmgr.hxx:260
const DBManagerOptions nMergeType
Definition: dbmgr.hxx:139
std::vector< std::unique_ptr< SwDSParam > > SwDSParams_t
Definition: dbmgr.hxx:135
css::uno::Sequence< OUString > aCopiesTo
Definition: dbmgr.hxx:190
css::uno::Sequence< css::beans::PropertyValue > aPrintOptions
Definition: dbmgr.hxx:211
css::uno::Reference< css::util::XNumberFormatter > xFormatter
Definition: dbmgr.hxx:104
Save mail merge as files.
Definition: dbmgr.hxx:90
const svx::ODataAccessDescriptor & rDescriptor
Definition: dbmgr.hxx:141
DBConnURIType GetDBunoType(const INetURLObject &rURL)
Definition: dbmgr.cxx:2623
void SetInitDBFields(bool b)
Definition: dbmgr.hxx:309
bool IsMergeSilent() const
Definition: dbmgr.hxx:295
const SwXMailMerge * m_pMergeEvtSrc
!= 0 if mail merge events are to be send
Definition: dbmgr.hxx:252
css::uno::Sequence< OUString > aBlindCopiesTo
Definition: dbmgr.hxx:191
css::uno::Reference< css::util::XNumberFormatter > xFormatter
Definition: dbmgr.hxx:66
OUString sDBcolumn
DB column to fetch EMail of Filename from.
Definition: dbmgr.hxx:203
DBConnURIType
Definition: dbmgr.hxx:479
css::uno::Sequence< css::uno::Any > aSelection
Definition: dbmgr.hxx:108
SwDSParam(const SwDBData &rData)
Definition: dbmgr.hxx:113
css::uno::Reference< css::sdbc::XStatement > xStatement
Definition: dbmgr.hxx:106
MergeStatus m_aMergeStatus
current / last merge status
Definition: dbmgr.hxx:246
const SwDSParams_t & GetDSParamArray() const
Definition: dbmgr.hxx:366
void CreateDSData(const SwDBData &rData)
Definition: dbmgr.hxx:364
Definition: view.hxx:146
long nSelectionIndex
Definition: dbmgr.hxx:111