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,41 +718,12 @@ 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,
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:
{ {
const QString s = val.toString(); const QString s = val.toString();
// create a deep-copy // create a deep-copy
@ -750,6 +750,7 @@ int QOCISpatialResultPrivate::bindValue( OCIStmt *sql, OCIBind **hbnd, OCIError
if ( r == OCI_SUCCESS ) if ( r == OCI_SUCCESS )
setCharset( *hbnd, OCI_HTYPE_BIND ); setCharset( *hbnd, OCI_HTYPE_BIND );
break; 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;
@ -1943,6 +1939,13 @@ bool QOCISpatialCols::execBatch( QOCISpatialResultPrivate *d, QVector<QVariant>
case QMetaType::Type::QByteArray: case QMetaType::Type::QByteArray:
default: default:
{
if ( fieldTypes[i] >= QMetaType::Type::User )
{
col.bindAs = SQLT_RDD;
col.maxLen = sizeof( OCIRowid * );
}
else
{ {
col.bindAs = SQLT_LBI; col.bindAs = SQLT_LBI;
for ( uint j = 0; j < col.recordCount; ++j ) for ( uint j = 0; j < col.recordCount; ++j )
@ -1954,6 +1957,7 @@ bool QOCISpatialCols::execBatch( QOCISpatialResultPrivate *d, QVector<QVariant>
if ( col.lengths[j] > col.maxLen ) if ( col.lengths[j] > col.maxLen )
col.maxLen = col.lengths[j]; 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
case QMetaType::Type::QByteArray:
default:
{ {
const QByteArray ba = val.toByteArray(); const QByteArray ba = val.toByteArray();
columns[i].lengths[row] = ba.size(); columns[i].lengths[row] = ba.size();
memcpy( dataPtr, ba.constData(), ba.size() ); memcpy( dataPtr, ba.constData(), ba.size() );
}
break; break;
} }
} }