summaryrefslogtreecommitdiff
path: root/dbaccess
diff options
context:
space:
mode:
authorOcke Janssen <Ocke.Janssen@sun.com>2009-11-11 14:16:42 +0100
committerOcke Janssen <Ocke.Janssen@sun.com>2009-11-11 14:16:42 +0100
commitb5d6022b0ed1c1e661fbf2f2ef76899bc457e387 (patch)
tree86ebd2264ac0c87f5609993f1ef66ebb1a5489d5 /dbaccess
parentb008a8ac98a3e719ca8464c5177d7ebbf9f5a28b (diff)
#i105086# impl clob and blob
Diffstat (limited to 'dbaccess')
-rw-r--r--dbaccess/source/core/api/BookmarkSet.cxx5
-rw-r--r--dbaccess/source/core/api/CacheSet.cxx83
-rw-r--r--dbaccess/source/core/api/KeySet.cxx78
-rw-r--r--dbaccess/source/core/api/KeySet.hxx2
-rw-r--r--dbaccess/source/core/api/RowSet.cxx3
-rw-r--r--dbaccess/source/core/api/RowSetCache.cxx25
-rw-r--r--dbaccess/source/core/api/SingleSelectQueryComposer.cxx21
7 files changed, 90 insertions, 127 deletions
diff --git a/dbaccess/source/core/api/BookmarkSet.cxx b/dbaccess/source/core/api/BookmarkSet.cxx
index 63d287df08bd..127ee83aaf2c 100644
--- a/dbaccess/source/core/api/BookmarkSet.cxx
+++ b/dbaccess/source/core/api/BookmarkSet.cxx
@@ -270,7 +270,10 @@ void OBookmarkSet::updateColumn(sal_Int32 nPos,Reference< XRowUpdate > _xParamet
case DataType::LONGVARBINARY:
_xParameter->updateBytes(nPos,_rValue);
break;
-
+ case DataType::BLOB:
+ case DataType::CLOB:
+ _xParameter->updateObject(nPos,_rValue.getAny());
+ break;
}
}
}
diff --git a/dbaccess/source/core/api/CacheSet.cxx b/dbaccess/source/core/api/CacheSet.cxx
index bbb080a52238..f7be322caa1a 100644
--- a/dbaccess/source/core/api/CacheSet.cxx
+++ b/dbaccess/source/core/api/CacheSet.cxx
@@ -515,88 +515,7 @@ void OCacheSet::setParameter(sal_Int32 nPos
{
RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OCacheSet::setParameter" );
sal_Int32 nType = ( _nType != DataType::OTHER ) ? _nType : _rValue.getTypeKind();
- if(!_rValue.isNull())
- {
-
- switch(nType)
- {
- case DataType::DECIMAL:
- case DataType::NUMERIC:
- _xParameter->setObjectWithInfo(nPos,_rValue.makeAny(),nType,_nScale);
- break;
- case DataType::CHAR:
- case DataType::VARCHAR:
- case DataType::LONGVARCHAR:
- _xParameter->setString(nPos,_rValue);
- break;
- case DataType::BIGINT:
- if ( _rValue.isSigned() )
- _xParameter->setLong(nPos,_rValue);
- else
- _xParameter->setString(nPos,_rValue);
- break;
- case DataType::BIT:
- case DataType::BOOLEAN:
- _xParameter->setBoolean(nPos,_rValue);
- break;
- case DataType::TINYINT:
- if ( _rValue.isSigned() )
- _xParameter->setByte(nPos,_rValue);
- else
- _xParameter->setShort(nPos,_rValue);
- break;
- case DataType::SMALLINT:
- if ( _rValue.isSigned() )
- _xParameter->setShort(nPos,_rValue);
- else
- _xParameter->setInt(nPos,_rValue);
- break;
- case DataType::INTEGER:
- if ( _rValue.isSigned() )
- _xParameter->setInt(nPos,_rValue);
- else
- _xParameter->setLong(nPos,_rValue);
- break;
- case DataType::FLOAT:
- _xParameter->setFloat(nPos,_rValue);
- break;
- case DataType::DOUBLE:
- case DataType::REAL:
- _xParameter->setDouble(nPos,_rValue);
- break;
- case DataType::DATE:
- _xParameter->setDate(nPos,_rValue);
- break;
- case DataType::TIME:
- _xParameter->setTime(nPos,_rValue);
- break;
- case DataType::TIMESTAMP:
- _xParameter->setTimestamp(nPos,_rValue);
- break;
- case DataType::BINARY:
- case DataType::VARBINARY:
- case DataType::LONGVARBINARY:
- _xParameter->setBytes(nPos,_rValue);
- break;
- case DataType::CLOB:
- {
- Reference<XInputStream> xStream(_rValue.getAny(),UNO_QUERY);
- _xParameter->setCharacterStream(nPos,xStream,xStream.is() ? xStream->available() : sal_Int32(0));
- }
- break;
- case DataType::BLOB:
- {
- Reference<XInputStream> xStream(_rValue.getAny(),UNO_QUERY);
- _xParameter->setBinaryStream(nPos,xStream,xStream.is() ? xStream->available() : sal_Int32(0));
- }
- break;
- case DataType::SQLNULL:
- _xParameter->setNull(nPos,nType);
- break;
- }
- }
- else
- _xParameter->setNull(nPos,nType);
+ ::dbtools::setObjectWithInfo(_xParameter,nPos,_rValue,nType,_nScale);
}
// -------------------------------------------------------------------------
void OCacheSet::fillValueRow(ORowSetRow& _rRow,sal_Int32 _nPosition)
diff --git a/dbaccess/source/core/api/KeySet.cxx b/dbaccess/source/core/api/KeySet.cxx
index 9cc2c6172cf4..845c392bc146 100644
--- a/dbaccess/source/core/api/KeySet.cxx
+++ b/dbaccess/source/core/api/KeySet.cxx
@@ -211,8 +211,33 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet)
Reference<XColumnsSupplier> xSup(m_xComposer,UNO_QUERY);
Reference<XNameAccess> xSourceColumns = m_xTable->getColumns();
- ::dbaccess::getColumnPositions(xSup->getColumns(),xKeyColumns,m_sUpdateTableName,(*m_pKeyColumnNames));
- ::dbaccess::getColumnPositions(xSup->getColumns(),xSourceColumns,m_sUpdateTableName,(*m_pColumnNames));
+ ::rtl::OUString sCatalog,sSchema,sTable;
+
+ Reference<XPropertySet> xTableProp(m_xTable,UNO_QUERY);
+ Any aCatalog = xTableProp->getPropertyValue(PROPERTY_CATALOGNAME);
+ aCatalog >>= sCatalog;
+ xTableProp->getPropertyValue(PROPERTY_SCHEMANAME) >>= sSchema;
+ xTableProp->getPropertyValue(PROPERTY_NAME) >>= sTable;
+
+ ::std::vector< ::rtl::OUString> aBestRowColumnNames;
+ Reference<XResultSet> xBestRes(xMeta->getBestRowIdentifier(aCatalog,sSchema,sTable,0,sal_False));
+ Reference<XRow> xBestRow(xBestRes,uno::UNO_QUERY);
+ while ( xBestRes->next() )
+ {
+ aBestRowColumnNames.push_back(xBestRow->getString(2));
+ }
+
+ Sequence< ::rtl::OUString> aBestColumnNames;
+ if ( aBestRowColumnNames.empty() )
+ {
+ if ( xKeyColumns.is() )
+ aBestColumnNames = xKeyColumns->getElementNames();
+ }
+ else
+ aBestColumnNames = Sequence< ::rtl::OUString>(&aBestRowColumnNames[0],aBestRowColumnNames.size());
+
+ ::dbaccess::getColumnPositions(xSup->getColumns(),aBestColumnNames,m_sUpdateTableName,(*m_pKeyColumnNames));
+ ::dbaccess::getColumnPositions(xSup->getColumns(),xSourceColumns->getElementNames(),m_sUpdateTableName,(*m_pColumnNames));
SelectColumnsMetaData::const_iterator aPosIter = (*m_pKeyColumnNames).begin();
SelectColumnsMetaData::const_iterator aPosEnd = (*m_pKeyColumnNames).end();
@@ -235,16 +260,7 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet)
static ::rtl::OUString aAnd = ::rtl::OUString::createFromAscii(" AND ");
Reference<XDatabaseMetaData> xMetaData = m_xConnection->getMetaData();
- ::rtl::OUString aQuote = getIdentifierQuoteString();
-
- ::rtl::OUStringBuffer aFilter;
- ::rtl::OUString sCatalog,sSchema,sTable;
-
- Reference<XPropertySet> xTableProp(m_xTable,UNO_QUERY);
- xTableProp->getPropertyValue(PROPERTY_CATALOGNAME) >>= sCatalog;
- xTableProp->getPropertyValue(PROPERTY_SCHEMANAME) >>= sSchema;
- xTableProp->getPropertyValue(PROPERTY_NAME) >>= sTable;
-
+ const ::rtl::OUString aQuote = getIdentifierQuoteString();
m_aSelectComposedTableName = getComposedTableName(sCatalog,sSchema,sTable);
::rtl::OUString sComposedName;
@@ -252,6 +268,7 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet)
::dbtools::qualifiedNameComponents(xMetaData,m_sUpdateTableName,sCatalog,sSchema,sTable,::dbtools::eInDataManipulation);
sComposedName = ::dbtools::composeTableName( xMetaData, sCatalog, sSchema, sTable, sal_True, ::dbtools::eInDataManipulation );
+ ::rtl::OUStringBuffer aFilter;
static ::rtl::OUString s_sDot(RTL_CONSTASCII_USTRINGPARAM("."));
static ::rtl::OUString s_sParam(RTL_CONSTASCII_USTRINGPARAM(" = ?"));
// create the where clause
@@ -286,21 +303,20 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet)
::rtl::OUString sSelectTableName = ::dbtools::composeTableName( xMetaData, xProp, ::dbtools::eInDataManipulation, false, false, false );
Reference<XNameAccess > xSelectColumns = xSup->getColumns();
- ::dbaccess::getColumnPositions(xSelectColumns,xSelColSup->getColumns(),sSelectTableName,(*m_pForeignColumnNames));
+ ::dbaccess::getColumnPositions(xSelectColumns,xSelColSup->getColumns()->getElementNames(),sSelectTableName,(*m_pForeignColumnNames));
- uno::Sequence< ::rtl::OUString> aSelectColumnNames = xSelectColumns->getElementNames();
- const ::rtl::OUString* pSelectColumnName = aSelectColumnNames.getConstArray();
- const ::rtl::OUString* pSelectColumnEnd = pSelectColumnName + aSelectColumnNames.getLength();
- for( ; pSelectColumnName != pSelectColumnEnd ; ++pSelectColumnName)
+ aPosEnd = (*m_pForeignColumnNames).end();
+ for(aPosIter = (*m_pForeignColumnNames).begin();aPosIter != aPosEnd;++aPosIter)
{
// look for columns not in the source columns to use them as filter as well
- if ( !xSourceColumns->hasByName(*pSelectColumnName) )
+ // if ( !xSourceColumns->hasByName(aPosIter->first) )
{
+ if ( aFilter.getLength() )
+ aFilter.append(aAnd);
+ aFilter.append(::dbtools::quoteName( aQuote,sSelectTableName));
aFilter.append(s_sDot);
- aFilter.append(::dbtools::quoteName( aQuote,*pSelectColumnName));
+ aFilter.append(::dbtools::quoteName( aQuote,aPosIter->first));
aFilter.append(s_sParam);
- if ( (pSelectColumnName+1) != pSelectColumnEnd )
- aFilter.append(aAnd);
}
}
break;
@@ -499,7 +515,8 @@ void SAL_CALL OKeySet::updateRow(const ORowSetRow& _rInsertRow ,const ORowSetRow
SelectColumnsMetaData::const_iterator aEnd = m_pColumnNames->end();
for(;aIter != aEnd;++aIter,++i)
{
- if(xKeyColumns.is() && xKeyColumns->hasByName(aIter->first))
+ //if(xKeyColumns.is() && xKeyColumns->hasByName(aIter->first))
+ if ( m_pKeyColumnNames->find(aIter->first) != m_pKeyColumnNames->end() )
{
sKeyCondition.append(::dbtools::quoteName( aQuote,aIter->first));
if((_rOrginalRow->get())[aIter->second.nPosition].isNull())
@@ -594,7 +611,8 @@ void SAL_CALL OKeySet::updateRow(const ORowSetRow& _rInsertRow ,const ORowSetRow
::std::vector<sal_Int32>::iterator aIdxColIter = aIndexColumnPositions.begin();
::std::vector<sal_Int32>::iterator aIdxColEnd = aIndexColumnPositions.end();
j = 0;
- for(;aIdxColIter != aIdxColEnd;++aIdxColIter,++i,++j)
+ aIter = m_pColumnNames->begin();
+ for(;aIdxColIter != aIdxColEnd;++aIdxColIter,++i,++j,++aIter)
{
setParameter(i,xParameter,(_rOrginalRow->get())[*aIdxColIter],(_rOrginalRow->get())[*aIdxColIter].getTypeKind(),aIter->second.nScale);
}
@@ -826,7 +844,7 @@ void SAL_CALL OKeySet::deleteRow(const ORowSetRow& _rDeleteRow,const connectivit
sal_Int32 i = 1;
for(i = 1;aIter != aEnd;++aIter,++i)
{
- if(xKeyColumns.is() && xKeyColumns->hasByName(aIter->first))
+ if ( m_pKeyColumnNames->find(aIter->first) != m_pKeyColumnNames->end() )
{
aSql.append(::dbtools::quoteName( aQuote,aIter->first));
if((_rDeleteRow->get())[aIter->second.nPosition].isNull())
@@ -879,7 +897,8 @@ void SAL_CALL OKeySet::deleteRow(const ORowSetRow& _rDeleteRow,const connectivit
// now we have to set the index values
::std::vector<sal_Int32>::iterator aIdxColIter = aIndexColumnPositions.begin();
::std::vector<sal_Int32>::iterator aIdxColEnd = aIndexColumnPositions.end();
- for(;aIdxColIter != aIdxColEnd;++aIdxColIter,++i)
+ aIter = m_pColumnNames->begin();
+ for(;aIdxColIter != aIdxColEnd;++aIdxColIter,++i,++aIter)
{
setParameter(i,xParameter,(_rDeleteRow->get())[*aIdxColIter],(_rDeleteRow->get())[*aIdxColIter].getTypeKind(),aIter->second.nScale);
}
@@ -1394,7 +1413,7 @@ sal_Bool SAL_CALL OKeySet::rowDeleted( ) throw(SQLException, RuntimeException)
namespace dbaccess
{
void getColumnPositions(const Reference<XNameAccess>& _rxQueryColumns,
- const Reference<XNameAccess>& _rxColumns,
+ const Sequence< ::rtl::OUString>& _aColumnNames,
const ::rtl::OUString& _rsUpdateTableName,
SelectColumnsMetaData& _rColumnNames)
{
@@ -1403,9 +1422,8 @@ namespace dbaccess
const ::rtl::OUString* pSelBegin = aSelNames.getConstArray();
const ::rtl::OUString* pSelEnd = pSelBegin + aSelNames.getLength();
- Sequence< ::rtl::OUString> aColumnNames(_rxColumns->getElementNames());
- const ::rtl::OUString* pColumnIter = aColumnNames.getConstArray();
- const ::rtl::OUString* pColumnEnd = pColumnIter + aColumnNames.getLength();
+ const ::rtl::OUString* pColumnIter = _aColumnNames.getConstArray();
+ const ::rtl::OUString* pColumnEnd = pColumnIter + _aColumnNames.getLength();
::comphelper::UStringMixLess aTmp(_rColumnNames.key_comp());
::comphelper::UStringMixEqual bCase(static_cast< ::comphelper::UStringMixLess*>(&aTmp)->isCaseSensitive());
@@ -1439,7 +1457,7 @@ namespace dbaccess
break;
}
}
- pColumnIter = aColumnNames.getConstArray();
+ pColumnIter = _aColumnNames.getConstArray();
}
}
}
diff --git a/dbaccess/source/core/api/KeySet.hxx b/dbaccess/source/core/api/KeySet.hxx
index 4193f60506d1..7a213d05b466 100644
--- a/dbaccess/source/core/api/KeySet.hxx
+++ b/dbaccess/source/core/api/KeySet.hxx
@@ -83,7 +83,7 @@ namespace dbaccess
// the elements of _rxQueryColumns must have the properties PROPERTY_REALNAME and PROPERTY_TABLENAME
void getColumnPositions(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxQueryColumns,
- const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxColumns,
+ const ::com::sun::star::uno::Sequence< ::rtl::OUString>& _aColumnNames,
const ::rtl::OUString& _rsUpdateTableName,
SelectColumnsMetaData& _rColumnNames /* out */);
diff --git a/dbaccess/source/core/api/RowSet.cxx b/dbaccess/source/core/api/RowSet.cxx
index 8f84d073f83e..1a53f504a7b6 100644
--- a/dbaccess/source/core/api/RowSet.cxx
+++ b/dbaccess/source/core/api/RowSet.cxx
@@ -2838,7 +2838,8 @@ ORowSetClone::ORowSetClone( const ::comphelper::ComponentContext& _rContext, ORo
m_aDataColumns.push_back(pColumn);
pColumn->setFastPropertyValue_NoBroadcast(PROPERTY_ID_ALIGN,xColumn->getPropertyValue(PROPERTY_ALIGN));
- sal_Int32 nFormatKey = comphelper::getINT32(xColumn->getPropertyValue(PROPERTY_NUMBERFORMAT));
+ sal_Int32 nFormatKey = 0;
+ xColumn->getPropertyValue(PROPERTY_NUMBERFORMAT) >>= nFormatKey;
if(!nFormatKey && xColumn.is() && m_xNumberFormatTypes.is())
nFormatKey = ::dbtools::getDefaultNumberFormat(xColumn,m_xNumberFormatTypes,aLocale);
pColumn->setFastPropertyValue_NoBroadcast(PROPERTY_ID_NUMBERFORMAT,makeAny(nFormatKey));
diff --git a/dbaccess/source/core/api/RowSetCache.cxx b/dbaccess/source/core/api/RowSetCache.cxx
index a96de4b9fbe1..7dba4cd17cb3 100644
--- a/dbaccess/source/core/api/RowSetCache.cxx
+++ b/dbaccess/source/core/api/RowSetCache.cxx
@@ -168,6 +168,16 @@ ORowSetCache::ORowSetCache(const Reference< XResultSet >& _xRs,
Reference< XIndexAccess> xUpdateTableKeys;
::rtl::OUString aUpdateTableName = _rUpdateTableName;
Reference< XConnection> xConnection;
+ // first we need a connection
+ Reference< XStatement> xStmt(_xRs->getStatement(),UNO_QUERY);
+ if(xStmt.is())
+ xConnection = xStmt->getConnection();
+ else
+ {
+ Reference< XPreparedStatement> xPrepStmt(_xRs->getStatement(),UNO_QUERY);
+ xConnection = xPrepStmt->getConnection();
+ }
+ OSL_ENSURE(xConnection.is(),"No connection!");
if(_xAnalyzer.is())
{
try
@@ -215,16 +225,7 @@ ORowSetCache::ORowSetCache(const Reference< XResultSet >& _xRs,
if(xColumnsSupplier.is())
{
- // first we need a connection
- Reference< XStatement> xStmt(_xRs->getStatement(),UNO_QUERY);
- if(xStmt.is())
- xConnection = xStmt->getConnection();
- else
- {
- Reference< XPreparedStatement> xPrepStmt(_xRs->getStatement(),UNO_QUERY);
- xConnection = xPrepStmt->getConnection();
- }
- OSL_ENSURE(xConnection.is(),"No connection!");
+
Reference<XNameAccess> xColumns = xColumnsSupplier->getColumns();
Reference<XColumnsSupplier> xColSup(_xAnalyzer,UNO_QUERY);
@@ -233,7 +234,7 @@ ORowSetCache::ORowSetCache(const Reference< XResultSet >& _xRs,
Reference<XNameAccess> xSelColumns = xColSup->getColumns();
Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
SelectColumnsMetaData aColumnNames(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers() ? true : false);
- ::dbaccess::getColumnPositions(xSelColumns,xColumns,aUpdateTableName,aColumnNames);
+ ::dbaccess::getColumnPositions(xSelColumns,xColumns->getElementNames(),aUpdateTableName,aColumnNames);
bAllKeysFound = !aColumnNames.empty() && sal_Int32(aColumnNames.size()) == xColumns->getElementNames().getLength();
}
}
@@ -303,7 +304,7 @@ ORowSetCache::ORowSetCache(const Reference< XResultSet >& _xRs,
Reference<XColumnsSupplier> xColSup(_xAnalyzer,UNO_QUERY);
Reference<XNameAccess> xSelColumns = xColSup->getColumns();
Reference<XNameAccess> xColumns = m_aUpdateTable->getColumns();
- ::dbaccess::getColumnPositions(xSelColumns,xColumns,aUpdateTableName,aColumnNames);
+ ::dbaccess::getColumnPositions(xSelColumns,xColumns->getElementNames(),aUpdateTableName,aColumnNames);
// check privileges
m_nPrivileges = Privilege::SELECT;
diff --git a/dbaccess/source/core/api/SingleSelectQueryComposer.cxx b/dbaccess/source/core/api/SingleSelectQueryComposer.cxx
index c8a8f9ba01d1..0c2836d5ceec 100644
--- a/dbaccess/source/core/api/SingleSelectQueryComposer.cxx
+++ b/dbaccess/source/core/api/SingleSelectQueryComposer.cxx
@@ -1530,6 +1530,27 @@ void OSingleSelectQueryComposer::setConditionByColumn( const Reference< XPropert
aSQL.append( STR_LIKE );
aSQL.append( DBTypeConversion::toSQLString( nType, aValue, sal_True, m_xTypeConverter ) );
break;
+ case DataType::CLOB:
+ {
+ Reference< XClob > xClob(aValue,UNO_QUERY);
+ if ( xClob.is() )
+ {
+ const ::sal_Int64 nLength = xClob->length();
+ if ( sal_Int64(nLength + aSQL.getLength() + STR_LIKE.getLength() ) < sal_Int64(SAL_MAX_INT32) )
+ {
+ aSQL.append( STR_LIKE );
+ aSQL.appendAscii("'");
+ aSQL.append( xClob->getSubString(1,(sal_Int32)nLength) );
+ aSQL.appendAscii("'");
+ }
+ }
+ else
+ {
+ aSQL.append( STR_LIKE );
+ aSQL.append( DBTypeConversion::toSQLString( nType, aValue, sal_True, m_xTypeConverter ) );
+ }
+ }
+ break;
case DataType::VARBINARY:
case DataType::BINARY:
case DataType::LONGVARBINARY: