@@ -347,8 +347,8 @@ struct QOCISpatialResultPrivate
347
347
OCIError *err;
348
348
OCISvcCtx *&svc;
349
349
OCIStmt *sql;
350
- QOCISDOGeometryObj * sdoobj;
351
- QOCISDOGeometryInd * sdoind;
350
+ QList< QOCISDOGeometryObj*> sdoobj;
351
+ QList< QOCISDOGeometryInd*> sdoind;
352
352
bool transaction;
353
353
int serverVersion;
354
354
int prefetchRows, prefetchMem;
@@ -1151,7 +1151,7 @@ class QOCISpatialCols
1151
1151
QString oraTypeName;
1152
1152
};
1153
1153
1154
- bool convertToWkb ( QVariant &v );
1154
+ bool convertToWkb ( QVariant &v, int index );
1155
1155
bool getValue ( OCINumber *num, unsigned int &value );
1156
1156
bool getValue ( OCINumber *num, int &value );
1157
1157
bool getValue ( OCINumber *num, double &value );
@@ -1336,12 +1336,15 @@ QOCISpatialCols::QOCISpatialCols( int size, QOCISpatialResultPrivate* dp )
1336
1336
1337
1337
if ( r == OCI_SUCCESS )
1338
1338
{
1339
+ dp->sdoobj .push_back ( 0 );
1340
+ dp->sdoind .push_back ( 0 );
1341
+
1339
1342
qDebug ( " define object" );
1340
1343
r = OCIDefineObject ( dfn,
1341
1344
d->err ,
1342
1345
ofi.oraOCIType ,
1343
- ( void ** ) & dp->sdoobj , 0 ,
1344
- ( void ** ) & dp->sdoind , 0 );
1346
+ ( void ** ) & dp->sdoobj . last () , 0 ,
1347
+ ( void ** ) & dp->sdoind . last () , 0 );
1345
1348
}
1346
1349
else
1347
1350
{
@@ -2315,31 +2318,37 @@ bool QOCISpatialCols::getElemInfoElem( int iElem, const QVector<int> &vElems, in
2315
2318
return true ;
2316
2319
}
2317
2320
2318
- bool QOCISpatialCols::convertToWkb ( QVariant &v )
2321
+ bool QOCISpatialCols::convertToWkb ( QVariant &v, int index )
2319
2322
{
2320
2323
ENTER
2321
2324
2322
- qDebug () << " sdoobj =" << d->sdoobj ;
2323
- qDebug () << " sdoinf =" << d->sdoind ;
2324
- if ( d->sdoind )
2325
- qDebug () << " sdoind->_atomic =" << d->sdoind ->_atomic ;
2325
+ Q_ASSERT ( index < d->sdoobj .size () );
2326
+ Q_ASSERT ( index < d->sdoind .size () );
2327
+
2328
+ QOCISDOGeometryObj *sdoobj = d->sdoobj [index ];
2329
+ QOCISDOGeometryInd *sdoind = d->sdoind [index ];
2330
+
2331
+ qDebug () << " sdoobj =" << sdoobj;
2332
+ qDebug () << " sdoinf =" << sdoind;
2333
+ if ( sdoind )
2334
+ qDebug () << " sdoind->_atomic =" << sdoind->_atomic ;
2326
2335
2327
2336
v = QVariant ( QVariant::ByteArray );
2328
2337
2329
- if ( !d-> sdoobj || !d-> sdoind )
2338
+ if ( !sdoobj || !sdoind )
2330
2339
{
2331
2340
qDebug () << " sdoobj or sdoind not set" ;
2332
2341
return false ;
2333
2342
}
2334
2343
2335
- if ( d-> sdoind ->_atomic == OCI_IND_NULL )
2344
+ if ( sdoind->_atomic == OCI_IND_NULL )
2336
2345
{
2337
2346
qDebug () << " geometry is NULL" ;
2338
2347
return true ;
2339
2348
}
2340
2349
2341
2350
unsigned int iGType;
2342
- if ( !getValue ( &d-> sdoobj ->gtype , iGType ) )
2351
+ if ( !getValue ( &sdoobj->gtype , iGType ) )
2343
2352
return false ;
2344
2353
2345
2354
int nDims = SDO_GTYPE_D ( iGType );
@@ -2353,9 +2362,9 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2353
2362
}
2354
2363
2355
2364
int iSrid = 0 ;
2356
- if ( d-> sdoind ->srid == OCI_IND_NOTNULL )
2365
+ if ( sdoind->srid == OCI_IND_NOTNULL )
2357
2366
{
2358
- if ( !getValue ( &d-> sdoobj ->srid , iSrid ) )
2367
+ if ( !getValue ( &sdoobj->srid , iSrid ) )
2359
2368
return false ;
2360
2369
}
2361
2370
@@ -2366,14 +2375,14 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2366
2375
union wkbPtr ptr;
2367
2376
2368
2377
int nElems;
2369
- if ( !getArraySize ( d-> sdoobj ->elem_info , nElems ) )
2378
+ if ( !getArraySize ( sdoobj->elem_info , nElems ) )
2370
2379
{
2371
2380
qWarning () << " could not determine element info array size" ;
2372
2381
return false ;
2373
2382
}
2374
2383
2375
2384
int nOrds;
2376
- if ( !getArraySize ( d-> sdoobj ->ordinates , nOrds ) )
2385
+ if ( !getArraySize ( sdoobj->ordinates , nOrds ) )
2377
2386
{
2378
2387
qWarning () << " could not determine ordinate array size" ;
2379
2388
return false ;
@@ -2392,37 +2401,37 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2392
2401
{
2393
2402
Q_ASSERT ( nOrds == 0 );
2394
2403
2395
- if ( d-> sdoind ->_atomic != OCI_IND_NOTNULL ||
2396
- d-> sdoind ->point .x != OCI_IND_NOTNULL ||
2397
- d-> sdoind ->point .y != OCI_IND_NOTNULL )
2404
+ if ( sdoind->_atomic != OCI_IND_NOTNULL ||
2405
+ sdoind->point .x != OCI_IND_NOTNULL ||
2406
+ sdoind->point .y != OCI_IND_NOTNULL )
2398
2407
{
2399
2408
qDebug () << " null point" ;
2400
2409
v = QVariant ();
2401
2410
return true ;
2402
2411
}
2403
2412
2404
2413
double x, y, z = 0.0 ;
2405
- if ( !getValue ( &d-> sdoobj ->point .x , x ) )
2414
+ if ( !getValue ( &sdoobj->point .x , x ) )
2406
2415
{
2407
2416
qWarning () << " could not convert x ordinate to real" ;
2408
2417
return false ;
2409
2418
}
2410
2419
2411
- if ( !getValue ( &d-> sdoobj ->point .y , y ) )
2420
+ if ( !getValue ( &sdoobj->point .y , y ) )
2412
2421
{
2413
2422
qWarning () << " could not convert y ordinate to real" ;
2414
2423
return false ;
2415
2424
}
2416
2425
2417
2426
if ( nDims > 2 )
2418
2427
{
2419
- if ( d-> sdoind ->point .z != OCI_IND_NOTNULL )
2428
+ if ( sdoind->point .z != OCI_IND_NOTNULL )
2420
2429
{
2421
2430
qWarning () << " null value in z ordinate" ;
2422
2431
return false ;
2423
2432
}
2424
2433
2425
- if ( !getValue ( &d-> sdoobj ->point .z , z ) )
2434
+ if ( !getValue ( &sdoobj->point .z , z ) )
2426
2435
{
2427
2436
qDebug () << " could not convert z ordinate to real" ;
2428
2437
return false ;
@@ -2442,7 +2451,7 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2442
2451
return true ;
2443
2452
}
2444
2453
2445
- if ( d-> sdoind ->_atomic != OCI_IND_NOTNULL )
2454
+ if ( sdoind->_atomic != OCI_IND_NOTNULL )
2446
2455
{
2447
2456
qWarning () << " geometry with sdo_elem_info and non-null sdo_point found." ;
2448
2457
return false ;
@@ -2455,7 +2464,7 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2455
2464
QVector<boolean> exists ( nElems );
2456
2465
QVector<OCINumber*> numbers ( nElems );
2457
2466
uword nelems = nElems;
2458
- OCI_VERIFY_E ( d->err , OCICollGetElemArray ( d->env , d->err , d-> sdoobj ->elem_info , 0 , exists.data (), ( void ** ) numbers.data (), 0 , &nelems ) );
2467
+ OCI_VERIFY_E ( d->err , OCICollGetElemArray ( d->env , d->err , sdoobj->elem_info , 0 , exists.data (), ( void ** ) numbers.data (), 0 , &nelems ) );
2459
2468
if ( !exists[0 ] )
2460
2469
{
2461
2470
qWarning () << " element info array does not exists" ;
@@ -2484,7 +2493,7 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2484
2493
QVector<boolean> exists ( nOrds );
2485
2494
QVector<OCINumber*> numbers ( nOrds );
2486
2495
uword nords = nOrds;
2487
- OCI_VERIFY_E ( d->err , OCICollGetElemArray ( d->env , d->err , d-> sdoobj ->ordinates , 0 , exists.data (), ( void ** ) numbers.data (), 0 , &nords ) );
2496
+ OCI_VERIFY_E ( d->err , OCICollGetElemArray ( d->env , d->err , sdoobj->ordinates , 0 , exists.data (), ( void ** ) numbers.data (), 0 , &nords ) );
2488
2497
if ( !exists[0 ] )
2489
2498
{
2490
2499
qWarning () << " ordinate array does not exists" ;
@@ -2797,7 +2806,7 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2797
2806
void QOCISpatialCols::getValues ( QVector<QVariant> &v, int index )
2798
2807
{
2799
2808
ENTER
2800
- for ( int i = 0 ; i < fieldInf.size (); ++i )
2809
+ for ( int i = 0 , gcindex = 0 ; i < fieldInf.size (); ++i )
2801
2810
{
2802
2811
qDebug () << " getValues( index =" << index << " i =" << i << " )" ;
2803
2812
const OraFieldInf &fld = fieldInf.at ( i );
@@ -2871,7 +2880,7 @@ void QOCISpatialCols::getValues( QVector<QVariant> &v, int index )
2871
2880
if ( fld.oraType == SQLT_NTY && fld.oraTypeName == " SDO_GEOMETRY" )
2872
2881
{
2873
2882
qDebug () << " SQLT_NTY SDO_GEOMETRY" ;
2874
- convertToWkb ( v[ index +i ] );
2883
+ convertToWkb ( v[ index +i ], gcindex++ );
2875
2884
}
2876
2885
else
2877
2886
{
@@ -2896,8 +2905,8 @@ QOCISpatialResultPrivate::QOCISpatialResultPrivate( QOCISpatialResult *result, c
2896
2905
, err( 0 )
2897
2906
, svc( const_cast <OCISvcCtx*&>( driver->svc ) )
2898
2907
, sql( 0 )
2899
- , sdoobj( 0 )
2900
- , sdoind( 0 )
2908
+ , sdoobj()
2909
+ , sdoind()
2901
2910
, transaction( driver->transaction )
2902
2911
, serverVersion( driver->serverVersion )
2903
2912
, prefetchRows( driver->prefetchRows )
@@ -3190,8 +3199,8 @@ bool QOCISpatialResult::exec()
3190
3199
0 , OCI_ATTR_PARAM_COUNT, d->err );
3191
3200
if ( r == OCI_SUCCESS && !d->cols )
3192
3201
{
3193
- d->sdoobj = 0 ;
3194
- d->sdoind = 0 ;
3202
+ d->sdoobj . clear () ;
3203
+ d->sdoind . clear () ;
3195
3204
d->cols = new QOCISpatialCols ( parmCount, d );
3196
3205
}
3197
3206
else
0 commit comments