fix oracle test

This commit is contained in:
Julien Cabieces 2024-04-25 16:17:18 +02:00 committed by Nyall Dawson
parent 71e0b7ffcd
commit 3a08caa321

View File

@ -593,7 +593,36 @@ int QOCISpatialResultPrivate::bindValue( OCIStmt *sql, OCIBind **hbnd, OCIError
sizeof( double ), sizeof( double ),
SQLT_FLT, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT ); SQLT_FLT, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT );
break; break;
case QMetaType::Type::User: case QMetaType::Type::QString:
{
const QString s = val.toString();
if ( isBinaryValue( pos ) )
{
r = OCIBindByPos( sql, hbnd, err,
pos + 1,
const_cast<ushort *>( s.utf16() ),
s.length() * sizeof( QChar ),
SQLT_LNG, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT );
break;
}
else if ( !isOutValue( pos ) )
{
// don't detach the string
r = OCIBindByPos( sql, hbnd, err,
pos + 1,
// safe since oracle doesn't touch OUT values
const_cast<ushort *>( s.utf16() ),
( s.length() + 1 ) * sizeof( QChar ),
SQLT_STR, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT );
if ( r == OCI_SUCCESS )
setCharset( *hbnd, OCI_HTYPE_BIND );
break;
}
}
FALLTHROUGH
default:
{
if ( val.canConvert<QOCISpatialGeometry>() && !isOutValue( pos ) ) if ( val.canConvert<QOCISpatialGeometry>() && !isOutValue( pos ) )
{ {
try try
@ -689,67 +718,39 @@ int QOCISpatialResultPrivate::bindValue( OCIStmt *sql, OCIBind **hbnd, OCIError
-1, -1,
SQLT_RDD, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT ); SQLT_RDD, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT );
} }
else else if ( val.userType() >= QMetaType::Type::User )
{ {
qWarning( "Unknown bind variable" ); qWarning( "Unknown bind variable" );
r = OCI_ERROR; r = OCI_ERROR;
} }
break; else
case QMetaType::Type::QString:
{
const QString s = val.toString();
if ( isBinaryValue( pos ) )
{ {
r = OCIBindByPos( sql, hbnd, err, const QString s = val.toString();
pos + 1, // create a deep-copy
const_cast<ushort *>( s.utf16() ), QByteArray ba( reinterpret_cast<const char *>( s.utf16() ), ( s.length() + 1 ) * sizeof( QChar ) );
s.length() * sizeof( QChar ), if ( isOutValue( pos ) )
SQLT_LNG, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT ); {
break; ba.reserve( ( s.capacity() + 1 ) * sizeof( QChar ) );
} *tmpSize = ba.size();
else if ( !isOutValue( pos ) ) r = OCIBindByPos( sql, hbnd, err,
{ pos + 1,
// don't detach the string ba.data(),
r = OCIBindByPos( sql, hbnd, err, ba.capacity(),
pos + 1, SQLT_STR, indPtr, tmpSize, nullptr, 0, nullptr, OCI_DEFAULT );
// safe since oracle doesn't touch OUT values tmpStorage.append( ba );
const_cast<ushort *>( s.utf16() ), }
( s.length() + 1 ) * sizeof( QChar ), else
SQLT_STR, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT ); {
r = OCIBindByPos( sql, hbnd, err,
pos + 1,
ba.data(),
ba.size(),
SQLT_STR, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT );
}
if ( r == OCI_SUCCESS ) if ( r == OCI_SUCCESS )
setCharset( *hbnd, OCI_HTYPE_BIND ); setCharset( *hbnd, OCI_HTYPE_BIND );
break; break;
} }
}
FALLTHROUGH
default:
{
const QString s = val.toString();
// create a deep-copy
QByteArray ba( reinterpret_cast<const char *>( s.utf16() ), ( s.length() + 1 ) * sizeof( QChar ) );
if ( isOutValue( pos ) )
{
ba.reserve( ( s.capacity() + 1 ) * sizeof( QChar ) );
*tmpSize = ba.size();
r = OCIBindByPos( sql, hbnd, err,
pos + 1,
ba.data(),
ba.capacity(),
SQLT_STR, indPtr, tmpSize, nullptr, 0, nullptr, OCI_DEFAULT );
tmpStorage.append( ba );
}
else
{
r = OCIBindByPos( sql, hbnd, err,
pos + 1,
ba.data(),
ba.size(),
SQLT_STR, indPtr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT );
}
if ( r == OCI_SUCCESS )
setCharset( *hbnd, OCI_HTYPE_BIND );
break;
} // default case } // default case
} // switch } // switch
if ( r != OCI_SUCCESS ) if ( r != OCI_SUCCESS )
@ -1919,11 +1920,6 @@ bool QOCISpatialCols::execBatch( QOCISpatialResultPrivate *d, QVector<QVariant>
col.maxLen = sizeof( double ); col.maxLen = sizeof( double );
break; break;
case QMetaType::Type::User:
col.bindAs = SQLT_RDD;
col.maxLen = sizeof( OCIRowid * );
break;
case QMetaType::Type::QString: case QMetaType::Type::QString:
{ {
col.bindAs = SQLT_STR; col.bindAs = SQLT_STR;
@ -1944,15 +1940,23 @@ bool QOCISpatialCols::execBatch( QOCISpatialResultPrivate *d, QVector<QVariant>
case QMetaType::Type::QByteArray: case QMetaType::Type::QByteArray:
default: default:
{ {
col.bindAs = SQLT_LBI; if ( fieldTypes[i] >= QMetaType::Type::User )
for ( uint j = 0; j < col.recordCount; ++j )
{ {
if ( d->isOutValue( i ) ) col.bindAs = SQLT_RDD;
col.lengths[j] = boundValues.at( i ).toList().at( j ).toByteArray().capacity(); col.maxLen = sizeof( OCIRowid * );
else }
col.lengths[j] = boundValues.at( i ).toList().at( j ).toByteArray().size(); else
if ( col.lengths[j] > col.maxLen ) {
col.maxLen = col.lengths[j]; col.bindAs = SQLT_LBI;
for ( uint j = 0; j < col.recordCount; ++j )
{
if ( d->isOutValue( i ) )
col.lengths[j] = boundValues.at( i ).toList().at( j ).toByteArray().capacity();
else
col.lengths[j] = boundValues.at( i ).toList().at( j ).toByteArray().size();
if ( col.lengths[j] > col.maxLen )
col.maxLen = col.lengths[j];
}
} }
break; break;
} }
@ -2024,23 +2028,22 @@ bool QOCISpatialCols::execBatch( QOCISpatialResultPrivate *d, QVector<QVariant>
memcpy( dataPtr, s.utf16(), columns[i].lengths[row] ); memcpy( dataPtr, s.utf16(), columns[i].lengths[row] );
break; break;
} }
case QMetaType::Type::User:
case QMetaType::Type::QByteArray:
default:
{
if ( val.canConvert<QOCISpatialRowIdPointer>() ) if ( val.canConvert<QOCISpatialRowIdPointer>() )
{ {
const QOCISpatialRowIdPointer rptr = qvariant_cast<QOCISpatialRowIdPointer>( val ); const QOCISpatialRowIdPointer rptr = qvariant_cast<QOCISpatialRowIdPointer>( val );
*reinterpret_cast<OCIRowid **>( dataPtr ) = rptr->id; *reinterpret_cast<OCIRowid **>( dataPtr ) = rptr->id;
columns[i].lengths[row] = 0; columns[i].lengths[row] = 0;
break;
} }
else
FALLTHROUGH {
const QByteArray ba = val.toByteArray();
case QMetaType::Type::QByteArray: columns[i].lengths[row] = ba.size();
default: memcpy( dataPtr, ba.constData(), ba.size() );
{ }
const QByteArray ba = val.toByteArray();
columns[i].lengths[row] = ba.size();
memcpy( dataPtr, ba.constData(), ba.size() );
break; break;
} }
} }