@@ -190,7 +190,11 @@ class enter
190
190
}
191
191
};
192
192
193
+ #ifdef _MSC_VER
194
+ #define ENTER enter here (__FUNCTION__,__FILE__,__LINE__);
195
+ #else
193
196
#define ENTER enter here (__PRETTY_FUNCTION__,__FILE__,__LINE__);
197
+ #endif
194
198
195
199
int enter::level = 0 ;
196
200
#else
@@ -1152,8 +1156,7 @@ class QOCISpatialCols
1152
1156
bool getValue ( OCINumber *num, int &value );
1153
1157
bool getValue ( OCINumber *num, double &value );
1154
1158
bool getArraySize ( OCIColl *coll, int &nSize );
1155
- bool getArrayItem ( OCIArray *coll, int elem, int &item );
1156
- bool getElemInfoElem ( int elem, int nElems, int nOrds, int &startOffset, int &endOffset, int &etype, int &interpretation );
1159
+ bool getElemInfoElem ( int elem, const QVector<int > &vElem, int nOrds, int &startOffset, int &endOffset, int &etype, int &interpretation );
1157
1160
static int byteorder () { static char littleEndian = htonl ( 1 ) != 1 ; return littleEndian; }
1158
1161
1159
1162
#ifdef QOCISPATIAL_DEBUG
@@ -2289,46 +2292,21 @@ bool QOCISpatialCols::getArraySize( OCIColl *coll, int &nSize )
2289
2292
return false ;
2290
2293
}
2291
2294
2292
- bool QOCISpatialCols::getArrayItem ( OCIArray *coll, int elem, int &item )
2293
- {
2294
- OCINumber *num;
2295
- boolean exists;
2296
-
2297
- try
2298
- {
2299
- OCI_VERIFY_E ( d->err , OCICollGetElem ( d->env , d->err , coll, elem, &exists, ( dvoid ** ) &num, 0 ) );
2300
-
2301
- if ( !exists )
2302
- {
2303
- qWarning ( " item %d does not exists." , elem );
2304
- throw OCI_ERROR;
2305
- }
2306
-
2307
- return getValue ( num, item );
2308
- }
2309
- catch ( int )
2310
- {
2311
- return false ;
2312
- }
2313
- }
2314
-
2315
- bool QOCISpatialCols::getElemInfoElem ( int iElem, int nElems, int nOrds,
2295
+ bool QOCISpatialCols::getElemInfoElem ( int iElem, const QVector<int > &vElems, int nOrds,
2316
2296
int &startOffset, int &endOffset,
2317
2297
int &etype, int &interpretation )
2318
2298
{
2319
- if ( !getArrayItem ( d->sdoobj ->elem_info , iElem + 0 , startOffset ) ||
2320
- !getArrayItem ( d->sdoobj ->elem_info , iElem + 1 , etype ) ||
2321
- !getArrayItem ( d->sdoobj ->elem_info , iElem + 2 , interpretation ) )
2322
- return false ;
2299
+ startOffset = vElems[ iElem + 0 ];
2300
+ etype = vElems[ iElem + 1 ];
2301
+ interpretation = vElems[ iElem + 2 ];
2323
2302
2324
- if ( iElem + 3 == nElems )
2303
+ if ( iElem + 3 >= vElems. size () )
2325
2304
{
2326
2305
endOffset = nOrds + 1 ;
2327
2306
}
2328
- else if ( ! getArrayItem ( d-> sdoobj -> elem_info , iElem + 3 , endOffset ) )
2307
+ else
2329
2308
{
2330
- qWarning () << " end offset not found" ;
2331
- return false ;
2309
+ endOffset = vElems[ iElem + 3 ];
2332
2310
}
2333
2311
2334
2312
--startOffset;
@@ -2470,41 +2448,49 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2470
2448
return false ;
2471
2449
}
2472
2450
2473
- QVector<double > ordinates ( nOrds );
2474
- boolean exists;
2451
+ QVector<int > elems ( nElems );
2475
2452
2476
2453
try
2477
2454
{
2478
- #if 0
2479
- // TODO figure this out - quicker, but occasionally crashes
2480
- QVector<OCINumber*> numbers( nOrds, 0 );
2481
- uword nords = nOrds;
2482
- OCI_VERIFY_E( d->err, OCICollGetElemArray( d->env, d->err, d->sdoobj->ordinates, 0, &exists, ( void** ) numbers.data(), 0, &nords ) );
2483
- if ( !exists )
2455
+ QVector<boolean> exists ( nElems );
2456
+ QVector<OCINumber*> numbers ( nElems );
2457
+ 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 ) );
2459
+ if ( !exists[0 ] )
2484
2460
{
2485
- qWarning() << "ordinate array does not exists";
2461
+ qWarning () << " element info array does not exists" ;
2486
2462
throw OCI_ERROR;
2487
2463
}
2488
- OCI_VERIFY_E( d->err, OCINumberToRealArray( d->err, ( const OCINumber ** ) numbers.data(), nOrds, sizeof( double ), ordinates.data() ) );
2489
- #else
2490
- for ( int i = 0 ; i < nOrds; i++ )
2491
- {
2492
- OCINumber *num;
2493
-
2494
- OCI_VERIFY_E ( d->err , OCICollGetElem ( d->env , d->err , d->sdoobj ->ordinates , i, &exists, ( dvoid ** ) &num, 0 ) );
2495
2464
2496
- if ( !exists )
2465
+ for ( unsigned int i = 0 ; i < nelems; i++ )
2466
+ {
2467
+ if ( !getValue ( numbers[i], elems[i] ) )
2497
2468
{
2498
- qWarning ( " item %d does not exists. " , i ) ;
2469
+ qWarning () << " get value of element info item " << i << " failed " ;
2499
2470
throw OCI_ERROR;
2500
2471
}
2472
+ }
2473
+ }
2474
+ catch ( int )
2475
+ {
2476
+ return false ;
2477
+ }
2501
2478
2502
- if ( !getValue ( num, ordinates[i] ) )
2503
- {
2504
- throw OCI_ERROR;
2505
- }
2479
+
2480
+ QVector<double > ordinates ( nOrds );
2481
+
2482
+ try
2483
+ {
2484
+ QVector<boolean> exists ( nOrds );
2485
+ QVector<OCINumber*> numbers ( nOrds );
2486
+ 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 ) );
2488
+ if ( !exists[0 ] )
2489
+ {
2490
+ qWarning () << " ordinate array does not exists" ;
2491
+ throw OCI_ERROR;
2506
2492
}
2507
- # endif
2493
+ OCI_VERIFY_E ( d-> err , OCINumberToRealArray ( d-> err , ( const OCINumber ** ) numbers. data (), nords, sizeof ( double ), ordinates. data () ) );
2508
2494
}
2509
2495
catch ( int )
2510
2496
{
@@ -2518,7 +2504,7 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2518
2504
for ( int i = 0 ; i < nElems; i += 3 )
2519
2505
{
2520
2506
int startOffset, endOffset, etype, n;
2521
- if ( !getElemInfoElem ( i, nElems , nOrds, startOffset, endOffset, etype, n ) )
2507
+ if ( !getElemInfoElem ( i, elems , nOrds, startOffset, endOffset, etype, n ) )
2522
2508
{
2523
2509
qDebug () << " could not fetch element info" << i;
2524
2510
return false ;
@@ -2552,7 +2538,7 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2552
2538
for ( int i = 0 ; i < nElems; i += 3 )
2553
2539
{
2554
2540
int startOffset, endOffset, etype, n;
2555
- if ( !getElemInfoElem ( i, nElems , nOrds, startOffset, endOffset, etype, n ) )
2541
+ if ( !getElemInfoElem ( i, elems , nOrds, startOffset, endOffset, etype, n ) )
2556
2542
{
2557
2543
qDebug () << " could not fetch element info" << i;
2558
2544
return false ;
@@ -2595,9 +2581,9 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2595
2581
for ( int i = 0 ; i < nElems; i += 3 )
2596
2582
{
2597
2583
int startOffset, endOffset, etype, n;
2598
- if ( !getElemInfoElem ( i, nElems , nOrds, startOffset, endOffset, etype, n ) )
2584
+ if ( !getElemInfoElem ( i, elems , nOrds, startOffset, endOffset, etype, n ) )
2599
2585
{
2600
- qDebug () << " could not fetch element info" << i;
2586
+ qWarning () << " could not fetch element info" << i;
2601
2587
return false ;
2602
2588
}
2603
2589
@@ -2608,7 +2594,7 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2608
2594
}
2609
2595
else
2610
2596
{
2611
- qDebug () << " unsupported line element - etype: " << etype << " n: " << n << " skipped " ;
2597
+ qWarning ( " skipped unsupported line element: etype=%08x n=%d " , etype, n ) ;
2612
2598
}
2613
2599
}
2614
2600
@@ -2634,9 +2620,9 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2634
2620
for ( int i = 0 ; i < nElems; i += 3 )
2635
2621
{
2636
2622
int startOffset, endOffset, etype, n;
2637
- if ( !getElemInfoElem ( i, nElems , nOrds, startOffset, endOffset, etype, n ) )
2623
+ if ( !getElemInfoElem ( i, elems , nOrds, startOffset, endOffset, etype, n ) )
2638
2624
{
2639
- qDebug () << " could not fetch element info" << i;
2625
+ qWarning () << " could not fetch element info" << i;
2640
2626
return false ;
2641
2627
}
2642
2628
@@ -2667,9 +2653,9 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2667
2653
for ( int i = 0 ; i < nElems; i += 3 )
2668
2654
{
2669
2655
int startOffset, endOffset, etype, n;
2670
- if ( !getElemInfoElem ( i, nElems , nOrds, startOffset, endOffset, etype, n ) )
2656
+ if ( !getElemInfoElem ( i, elems , nOrds, startOffset, endOffset, etype, n ) )
2671
2657
{
2672
- qDebug () << " could not fetch element info" << i;
2658
+ qWarning () << " could not fetch element info" << i;
2673
2659
return false ;
2674
2660
}
2675
2661
@@ -2695,7 +2681,7 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2695
2681
}
2696
2682
else
2697
2683
{
2698
- qDebug () << " unsupported polygon element - etype: " << etype << " n: " << n << " skipped " ;
2684
+ qWarning ( " skipped unsupported polygon element: etype=%08x n=%d " , etype, n ) ;
2699
2685
}
2700
2686
}
2701
2687
@@ -2727,9 +2713,9 @@ bool QOCISpatialCols::convertToWkb( QVariant &v )
2727
2713
for ( int i = 0 ; i < nElems; i += 3 )
2728
2714
{
2729
2715
int startOffset, endOffset, etype, n;
2730
- if ( !getElemInfoElem ( i, nElems , nOrds, startOffset, endOffset, etype, n ) )
2716
+ if ( !getElemInfoElem ( i, elems , nOrds, startOffset, endOffset, etype, n ) )
2731
2717
{
2732
- qDebug () << " could not fetch element info" << i;
2718
+ qWarning () << " could not fetch element info" << i;
2733
2719
return false ;
2734
2720
}
2735
2721
0 commit comments