1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sc.hxx" 26 27 28 29 // INCLUDE --------------------------------------------------------------- 30 31 #include <com/sun/star/sdbc/DataType.hpp> 32 #include <com/sun/star/sdbc/XRow.hpp> 33 34 #include <svl/zforlist.hxx> 35 36 #include "dbdocutl.hxx" 37 #include "document.hxx" 38 #include "cell.hxx" 39 #include "formula/errorcodes.hxx" 40 41 using namespace ::com::sun::star; 42 43 #define D_TIMEFACTOR 86400.0 44 45 // ----------------------------------------------------------------------- 46 47 // static 48 void ScDatabaseDocUtil::PutData( ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nTab, 49 const uno::Reference<sdbc::XRow>& xRow, long nRowPos, 50 long nType, sal_Bool bCurrency, sal_Bool* pSimpleFlag ) 51 { 52 String aString; 53 double nVal = 0.0; 54 sal_Bool bValue = sal_False; 55 sal_Bool bEmptyFlag = sal_False; 56 sal_Bool bError = sal_False; 57 sal_uLong nFormatIndex = 0; 58 59 //! wasNull calls only if null value was found? 60 61 try 62 { 63 switch ( nType ) 64 { 65 case sdbc::DataType::BIT: 66 case sdbc::DataType::BOOLEAN: 67 //! use language from doc (here, date/time and currency)? 68 nFormatIndex = pDoc->GetFormatTable()->GetStandardFormat( 69 NUMBERFORMAT_LOGICAL, ScGlobal::eLnge ); 70 nVal = (xRow->getBoolean(nRowPos) ? 1 : 0); 71 bEmptyFlag = ( nVal == 0.0 ) && xRow->wasNull(); 72 bValue = sal_True; 73 break; 74 75 case sdbc::DataType::TINYINT: 76 case sdbc::DataType::SMALLINT: 77 case sdbc::DataType::INTEGER: 78 case sdbc::DataType::BIGINT: 79 case sdbc::DataType::FLOAT: 80 case sdbc::DataType::REAL: 81 case sdbc::DataType::DOUBLE: 82 case sdbc::DataType::NUMERIC: 83 case sdbc::DataType::DECIMAL: 84 //! do the conversion here? 85 nVal = xRow->getDouble(nRowPos); 86 bEmptyFlag = ( nVal == 0.0 ) && xRow->wasNull(); 87 bValue = sal_True; 88 break; 89 90 case sdbc::DataType::CHAR: 91 case sdbc::DataType::VARCHAR: 92 case sdbc::DataType::LONGVARCHAR: 93 aString = xRow->getString(nRowPos); 94 bEmptyFlag = ( aString.Len() == 0 ) && xRow->wasNull(); 95 break; 96 97 case sdbc::DataType::DATE: 98 { 99 SvNumberFormatter* pFormTable = pDoc->GetFormatTable(); 100 nFormatIndex = pFormTable->GetStandardFormat( 101 NUMBERFORMAT_DATE, ScGlobal::eLnge ); 102 103 util::Date aDate = xRow->getDate(nRowPos); 104 nVal = Date( aDate.Day, aDate.Month, aDate.Year ) - 105 *pFormTable->GetNullDate(); 106 bEmptyFlag = xRow->wasNull(); 107 bValue = sal_True; 108 } 109 break; 110 111 case sdbc::DataType::TIME: 112 { 113 SvNumberFormatter* pFormTable = pDoc->GetFormatTable(); 114 nFormatIndex = pFormTable->GetStandardFormat( 115 NUMBERFORMAT_TIME, ScGlobal::eLnge ); 116 117 util::Time aTime = xRow->getTime(nRowPos); 118 nVal = ( aTime.Hours * 3600 + aTime.Minutes * 60 + 119 aTime.Seconds + aTime.HundredthSeconds / 100.0 ) / D_TIMEFACTOR; 120 bEmptyFlag = xRow->wasNull(); 121 bValue = sal_True; 122 } 123 break; 124 125 case sdbc::DataType::TIMESTAMP: 126 { 127 SvNumberFormatter* pFormTable = pDoc->GetFormatTable(); 128 nFormatIndex = pFormTable->GetStandardFormat( 129 NUMBERFORMAT_DATETIME, ScGlobal::eLnge ); 130 131 util::DateTime aStamp = xRow->getTimestamp(nRowPos); 132 nVal = ( Date( aStamp.Day, aStamp.Month, aStamp.Year ) - 133 *pFormTable->GetNullDate() ) + 134 ( aStamp.Hours * 3600 + aStamp.Minutes * 60 + 135 aStamp.Seconds + aStamp.HundredthSeconds / 100.0 ) / D_TIMEFACTOR; 136 bEmptyFlag = xRow->wasNull(); 137 bValue = sal_True; 138 } 139 break; 140 141 case sdbc::DataType::SQLNULL: 142 bEmptyFlag = sal_True; 143 break; 144 145 case sdbc::DataType::BINARY: 146 case sdbc::DataType::VARBINARY: 147 case sdbc::DataType::LONGVARBINARY: 148 default: 149 bError = sal_True; // unknown type 150 } 151 } 152 catch ( uno::Exception& ) 153 { 154 bError = sal_True; 155 } 156 157 if ( bValue && bCurrency ) 158 nFormatIndex = pDoc->GetFormatTable()->GetStandardFormat( 159 NUMBERFORMAT_CURRENCY, ScGlobal::eLnge ); 160 161 ScBaseCell* pCell; 162 if (bEmptyFlag) 163 { 164 pCell = NULL; 165 pDoc->PutCell( nCol, nRow, nTab, pCell ); 166 } 167 else if (bError) 168 { 169 pDoc->SetError( nCol, nRow, nTab, NOTAVAILABLE ); 170 } 171 else if (bValue) 172 { 173 pCell = new ScValueCell( nVal ); 174 if (nFormatIndex == 0) 175 pDoc->PutCell( nCol, nRow, nTab, pCell ); 176 else 177 pDoc->PutCell( nCol, nRow, nTab, pCell, nFormatIndex ); 178 } 179 else 180 { 181 if (aString.Len()) 182 { 183 pCell = ScBaseCell::CreateTextCell( aString, pDoc ); 184 if ( pSimpleFlag && pCell->GetCellType() == CELLTYPE_EDIT ) 185 *pSimpleFlag = sal_False; 186 } 187 else 188 pCell = NULL; 189 pDoc->PutCell( nCol, nRow, nTab, pCell ); 190 } 191 } 192 193 194