Line data Source code
1 :
2 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 : /*
4 : * This file is part of the LibreOffice project.
5 : *
6 : * This Source Code Form is subject to the terms of the Mozilla Public
7 : * License, v. 2.0. If a copy of the MPL was not distributed with this
8 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 : *
10 : * This file incorporates work covered by the following license notice:
11 : *
12 : * Licensed to the Apache Software Foundation (ASF) under one or more
13 : * contributor license agreements. See the NOTICE file distributed
14 : * with this work for additional information regarding copyright
15 : * ownership. The ASF licenses this file to you under the Apache
16 : * License, Version 2.0 (the "License"); you may not use this file
17 : * except in compliance with the License. You may obtain a copy of
18 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
19 : */
20 :
21 :
22 : #include "TokenWriter.hxx"
23 : #include <com/sun/star/sdbc/XColumnLocate.hpp>
24 : #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
25 : #include "dbu_misc.hrc"
26 : #include "sqlmessage.hxx"
27 : #include <vcl/msgbox.hxx>
28 : #include "dbustrings.hrc"
29 : #include <com/sun/star/sdbc/XRowUpdate.hpp>
30 : #include <functional>
31 :
32 : using namespace dbaui;
33 : using namespace ::com::sun::star::uno;
34 : using namespace ::com::sun::star::beans;
35 : using namespace ::com::sun::star::container;
36 : using namespace ::com::sun::star::util;
37 : using namespace ::com::sun::star::sdbc;
38 : using namespace ::com::sun::star::sdb;
39 : using namespace ::com::sun::star::lang;
40 :
41 : // export data
42 0 : ORowSetImportExport::ORowSetImportExport( Window* _pParent,
43 : const Reference< XResultSetUpdate >& _xResultSetUpdate,
44 : const ::svx::ODataAccessDescriptor& _aDataDescriptor,
45 : const Reference< XComponentContext >& _rM,
46 : const String& rExchange
47 : )
48 : : ODatabaseImportExport(_aDataDescriptor,_rM,NULL,rExchange)
49 : ,m_xTargetResultSetUpdate(_xResultSetUpdate)
50 : ,m_xTargetRowUpdate(_xResultSetUpdate,UNO_QUERY)
51 : ,m_pParent(_pParent)
52 0 : ,m_bAlreadyAsked(sal_False)
53 : {
54 : SAL_INFO("dbaccess.ui", "ORowSetImportExport::ORowSetImportExport" );
55 : OSL_ENSURE(_pParent,"Window can't be null!");
56 0 : }
57 : // -----------------------------------------------------------------------------
58 0 : void ORowSetImportExport::initialize()
59 : {
60 : SAL_INFO("dbaccess.ui", "ORowSetImportExport::initialize" );
61 0 : ODatabaseImportExport::initialize();
62 : // do namemapping
63 0 : Reference<XColumnLocate> xColumnLocate(m_xResultSet,UNO_QUERY);
64 : OSL_ENSURE(xColumnLocate.is(),"The rowset normally should support this");
65 :
66 0 : m_xTargetResultSetMetaData = Reference<XResultSetMetaDataSupplier>(m_xTargetResultSetUpdate,UNO_QUERY)->getMetaData();
67 0 : if(!m_xTargetResultSetMetaData.is() || !xColumnLocate.is() || !m_xResultSetMetaData.is() )
68 0 : throw SQLException(String(ModuleRes(STR_UNEXPECTED_ERROR)),*this,OUString("S1000") ,0,Any());
69 :
70 0 : sal_Int32 nCount = m_xTargetResultSetMetaData->getColumnCount();
71 0 : m_aColumnMapping.reserve(nCount);
72 0 : m_aColumnTypes.reserve(nCount);
73 0 : for (sal_Int32 i = 1;i <= nCount; ++i)
74 : {
75 0 : sal_Int32 nPos = -1; // -1 means column is autoincrement or doesn't exist
76 0 : if(!m_xTargetResultSetMetaData->isAutoIncrement(i))
77 : {
78 : try
79 : {
80 0 : OUString sColumnName = m_xTargetResultSetMetaData->getColumnName(i);
81 0 : nPos = xColumnLocate->findColumn(sColumnName);
82 : }
83 0 : catch(const SQLException&)
84 : {
85 0 : if(m_xTargetResultSetMetaData->isNullable(i))
86 0 : nPos = 0; // column doesn't exist but we could set it to null
87 : }
88 : }
89 :
90 0 : m_aColumnMapping.push_back(nPos);
91 0 : if(nPos > 0)
92 0 : m_aColumnTypes.push_back(m_xResultSetMetaData->getColumnType(nPos));
93 : else
94 0 : m_aColumnTypes.push_back(DataType::OTHER);
95 0 : }
96 0 : }
97 : // -----------------------------------------------------------------------------
98 0 : sal_Bool ORowSetImportExport::Write()
99 : {
100 : SAL_INFO("dbaccess.ui", "ORowSetImportExport::Write" );
101 0 : return sal_True;
102 : }
103 : // -----------------------------------------------------------------------------
104 0 : sal_Bool ORowSetImportExport::Read()
105 : {
106 : SAL_INFO("dbaccess.ui", "ORowSetImportExport::Read" );
107 : // check if there is any column to copy
108 0 : if(::std::find_if(m_aColumnMapping.begin(),m_aColumnMapping.end(),
109 0 : ::std::bind2nd(::std::greater<sal_Int32>(),0)) == m_aColumnMapping.end())
110 0 : return sal_False;
111 0 : sal_Bool bContinue = sal_True;
112 0 : if(m_aSelection.getLength())
113 : {
114 0 : const Any* pBegin = m_aSelection.getConstArray();
115 0 : const Any* pEnd = pBegin + m_aSelection.getLength();
116 0 : for(;pBegin != pEnd && bContinue;++pBegin)
117 : {
118 0 : sal_Int32 nPos = -1;
119 0 : *pBegin >>= nPos;
120 : OSL_ENSURE(nPos != -1,"Invalid position!");
121 0 : bContinue = (m_xResultSet.is() && m_xResultSet->absolute(nPos) && insertNewRow());
122 : }
123 : }
124 : else
125 : {
126 0 : Reference<XPropertySet> xProp(m_xResultSet,UNO_QUERY);
127 0 : sal_Int32 nRowCount = 0;
128 0 : sal_Int32 nCurrentRow = 0;
129 0 : sal_Int32 nRowFilterIndex = 0;
130 0 : if ( xProp.is() && xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_ISROWCOUNTFINAL) )
131 : {
132 0 : sal_Bool bFinal = sal_False;
133 0 : xProp->getPropertyValue(PROPERTY_ISROWCOUNTFINAL) >>= bFinal;
134 0 : if ( !bFinal )
135 0 : m_xResultSet->afterLast();
136 0 : xProp->getPropertyValue(PROPERTY_ROWCOUNT) >>= nRowCount;
137 : }
138 0 : if ( !nRowCount )
139 : {
140 0 : m_xResultSet->afterLast();
141 0 : nRowCount = m_xResultSet->getRow();
142 : }
143 : OSL_ENSURE(nRowCount,"RowCount is 0!");
144 0 : m_xResultSet->beforeFirst();
145 0 : while(m_xResultSet.is() && m_xResultSet->next() && bContinue && nRowCount )
146 : {
147 0 : --nRowCount;
148 0 : ++nCurrentRow;
149 0 : if(!m_pRowMarker || m_pRowMarker[nRowFilterIndex] == nCurrentRow)
150 : {
151 0 : ++nRowFilterIndex;
152 0 : bContinue = insertNewRow();
153 : }
154 0 : }
155 : }
156 0 : return sal_True;
157 : }
158 : // -----------------------------------------------------------------------------
159 0 : sal_Bool ORowSetImportExport::insertNewRow()
160 : {
161 : SAL_INFO("dbaccess.ui", "ORowSetImportExport::insertNewRow" );
162 : try
163 : {
164 0 : m_xTargetResultSetUpdate->moveToInsertRow();
165 0 : sal_Int32 i = 1;
166 0 : ::std::vector<sal_Int32>::iterator aEnd = m_aColumnMapping.end();
167 0 : for (::std::vector<sal_Int32>::iterator aIter = m_aColumnMapping.begin(); aIter != aEnd ;++aIter,++i )
168 : {
169 0 : if(*aIter > 0)
170 : {
171 0 : Any aValue;
172 0 : switch(m_aColumnTypes[i-1])
173 : {
174 : case DataType::CHAR:
175 : case DataType::VARCHAR:
176 0 : aValue <<= m_xRow->getString(*aIter);
177 0 : break;
178 : case DataType::DECIMAL:
179 : case DataType::NUMERIC:
180 0 : aValue <<= m_xRow->getDouble(*aIter);
181 0 : break;
182 : case DataType::BIGINT:
183 0 : aValue <<= m_xRow->getLong(*aIter);
184 0 : break;
185 : case DataType::FLOAT:
186 0 : aValue <<= m_xRow->getFloat(*aIter);
187 0 : break;
188 : case DataType::DOUBLE:
189 0 : aValue <<= m_xRow->getDouble(*aIter);
190 0 : break;
191 : case DataType::LONGVARCHAR:
192 0 : aValue <<= m_xRow->getString(*aIter);
193 0 : break;
194 : case DataType::LONGVARBINARY:
195 0 : aValue <<= m_xRow->getBytes(*aIter);
196 0 : break;
197 : case DataType::DATE:
198 0 : aValue <<= m_xRow->getDate(*aIter);
199 0 : break;
200 : case DataType::TIME:
201 0 : aValue <<= m_xRow->getTime(*aIter);
202 0 : break;
203 : case DataType::TIMESTAMP:
204 0 : aValue <<= m_xRow->getTimestamp(*aIter);
205 0 : break;
206 : case DataType::BIT:
207 : case DataType::BOOLEAN:
208 0 : aValue <<= m_xRow->getBoolean(*aIter);
209 0 : break;
210 : case DataType::TINYINT:
211 0 : aValue <<= m_xRow->getByte(*aIter);
212 0 : break;
213 : case DataType::SMALLINT:
214 0 : aValue <<= m_xRow->getShort(*aIter);
215 0 : break;
216 : case DataType::INTEGER:
217 0 : aValue <<= m_xRow->getInt(*aIter);
218 0 : break;
219 : case DataType::REAL:
220 0 : aValue <<= m_xRow->getDouble(*aIter);
221 0 : break;
222 : case DataType::BINARY:
223 : case DataType::VARBINARY:
224 0 : aValue <<= m_xRow->getBytes(*aIter);
225 0 : break;
226 : case DataType::BLOB:
227 0 : aValue <<= m_xRow->getBlob(*aIter);
228 0 : break;
229 : case DataType::CLOB:
230 0 : aValue <<= m_xRow->getClob(*aIter);
231 0 : break;
232 : default:
233 : SAL_WARN("dbaccess.ui", "Unknown type");
234 : }
235 0 : if(m_xRow->wasNull())
236 0 : m_xTargetRowUpdate->updateNull(i);
237 : else
238 0 : m_xTargetRowUpdate->updateObject(i,aValue);
239 : }
240 0 : else if(*aIter == 0)//now we have know that we to set this column to null
241 0 : m_xTargetRowUpdate->updateNull(i);
242 : }
243 0 : m_xTargetResultSetUpdate->insertRow();
244 : }
245 0 : catch(const SQLException&)
246 : {
247 0 : if(!m_bAlreadyAsked)
248 : {
249 0 : String sAskIfContinue = String(ModuleRes(STR_ERROR_OCCURRED_WHILE_COPYING));
250 0 : OSQLWarningBox aDlg( m_pParent, sAskIfContinue, WB_YES_NO | WB_DEF_YES );
251 0 : if(aDlg.Execute() == RET_YES)
252 0 : m_bAlreadyAsked = sal_True;
253 : else
254 0 : return sal_False;
255 : }
256 0 : }
257 0 : return sal_True;
258 12 : }
259 : // -----------------------------------------------------------------------------
260 :
261 :
262 :
263 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|