@@ -1577,26 +1577,234 @@ static GSChar** convertObjectToStringArray(PyObject* value, size_t* size) {
1577
1577
$1 = NULL ;
1578
1578
}
1579
1579
1580
- %typemap(argout, fragment = " convertFieldToObject" ) (GSRow *rowdata) {
1580
+ /* *
1581
+ * Support convert data from GSRow* row to Python list
1582
+ */
1583
+ %fragment(" getRowFields" , " header" ,
1584
+ fragment = " convertStrToObj" , fragment = " convertTimestampToObject" ) {
1585
+ static bool getRowFields (GSRow *row, int columnCount, GSType* typeList, bool timestampOutput, int * columnError, GSType* fieldTypeError, PyObject* outList) {
1586
+ GSResult ret;
1587
+ GSValue mValue ;
1588
+ bool retVal = true ;
1589
+ for (int i = 0 ; i < columnCount; i++) {
1590
+ // Check NULL value
1591
+ GSBool nullValue;
1592
+ %#if GS_COMPATIBILITY_SUPPORT_3_5
1593
+ ret = gsGetRowFieldNull (row, (int32_t ) i, &nullValue);
1594
+ if (ret != GS_RESULT_OK) {
1595
+ *columnError = i;
1596
+ retVal = false ;
1597
+ *fieldTypeError = GS_TYPE_NULL;
1598
+ return retVal;
1599
+ }
1600
+ if (nullValue) {
1601
+ Py_INCREF (Py_None);
1602
+ PyList_SetItem (outList, i, Py_None);
1603
+ continue ;
1604
+ }
1605
+ %#endif
1606
+ switch (typeList[i]) {
1607
+ case GS_TYPE_LONG: {
1608
+ int64_t longValue;
1609
+ ret = gsGetRowFieldAsLong (row, (int32_t ) i, &longValue);
1610
+ PyList_SetItem (outList, i, PyLong_FromLong (longValue));
1611
+ break ;
1612
+ }
1613
+ case GS_TYPE_STRING: {
1614
+ GSChar* stringValue;
1615
+ ret = gsGetRowFieldAsString (row, (int32_t ) i, (const GSChar **)&stringValue);
1616
+ PyList_SetItem (outList, i, convertStrToObj (stringValue));
1617
+ break ;
1618
+ }
1619
+ case GS_TYPE_BLOB: {
1620
+ GSBlob blobValue;
1621
+ ret = gsGetRowFieldAsBlob (row, (int32_t ) i, &blobValue);
1622
+ PyList_SetItem (outList, i, PyByteArray_FromStringAndSize ((const char *)blobValue.data , blobValue.size ));
1623
+ break ;
1624
+ }
1625
+ case GS_TYPE_BOOL: {
1626
+ GSBool boolValue;
1627
+ ret = gsGetRowFieldAsBool (row, (int32_t ) i, &boolValue);
1628
+ PyList_SetItem (outList, i, PyBool_FromLong (boolValue));
1629
+ break ;
1630
+ }
1631
+ case GS_TYPE_INTEGER: {
1632
+ int32_t intValue;
1633
+ ret = gsGetRowFieldAsInteger (row, (int32_t ) i, &intValue);
1634
+ PyList_SetItem (outList, i, PyInt_FromLong (intValue));
1635
+ break ;
1636
+ }
1637
+ case GS_TYPE_FLOAT: {
1638
+ float floatValue;
1639
+ ret = gsGetRowFieldAsFloat (row, (int32_t ) i, &floatValue);
1640
+ PyList_SetItem (outList, i, PyFloat_FromDouble (floatValue));
1641
+ break ;
1642
+ }
1643
+ case GS_TYPE_DOUBLE: {
1644
+ double doubleValue;
1645
+ ret = gsGetRowFieldAsDouble (row, (int32_t ) i, &doubleValue);
1646
+ PyList_SetItem (outList, i, PyFloat_FromDouble (doubleValue));
1647
+ break ;
1648
+ }
1649
+ case GS_TYPE_TIMESTAMP: {
1650
+ GSTimestamp timestampValue;
1651
+ ret = gsGetRowFieldAsTimestamp (row, (int32_t ) i, ×tampValue);
1652
+ PyList_SetItem (outList, i, convertTimestampToObject (×tampValue, timestampOutput));
1653
+ break ;
1654
+ }
1655
+ case GS_TYPE_BYTE: {
1656
+ int8_t byteValue;
1657
+ ret = gsGetRowFieldAsByte (row, (int32_t ) i, &byteValue);
1658
+ PyList_SetItem (outList, i, PyInt_FromLong (byteValue));
1659
+ break ;
1660
+ }
1661
+ case GS_TYPE_SHORT: {
1662
+ int16_t shortValue;
1663
+ ret = gsGetRowFieldAsShort (row, (int32_t ) i, &shortValue);
1664
+ PyList_SetItem (outList, i, PyInt_FromLong (shortValue));
1665
+ break ;
1666
+ }
1667
+ case GS_TYPE_GEOMETRY: {
1668
+ GSChar* geoValue;
1669
+ ret = gsGetRowFieldAsGeometry (row, (int32_t ) i, (const GSChar **)&geoValue);
1670
+ PyList_SetItem (outList, i, convertStrToObj (geoValue));
1671
+ break ;
1672
+ }
1673
+ case GS_TYPE_INTEGER_ARRAY: {
1674
+ int32_t * intArr;
1675
+ size_t size;
1676
+ ret = gsGetRowFieldAsIntegerArray (row, (int32_t ) i, (const int32_t **)&intArr, &size);
1677
+ PyObject* list = PyList_New (size);
1678
+ for (int j = 0 ; j < size; j++) {
1679
+ PyList_SetItem (list, j, PyInt_FromLong (intArr[j]));
1680
+ }
1681
+ PyList_SetItem (outList, i, list);
1682
+ break ;
1683
+ }
1684
+ case GS_TYPE_STRING_ARRAY: {
1685
+ GSChar** stringArrVal;
1686
+ size_t size;
1687
+ ret = gsGetRowFieldAsStringArray (row, (int32_t ) i, ( const GSChar *const **)&stringArrVal, &size);
1688
+ PyObject* list = PyList_New (size);
1689
+ for (int j = 0 ; j < size; j++) {
1690
+ PyList_SetItem (list, j, convertStrToObj (stringArrVal[j]));
1691
+ }
1692
+ PyList_SetItem (outList, i, list);
1693
+ break ;
1694
+ }
1695
+ case GS_TYPE_BOOL_ARRAY: {
1696
+ GSBool* boolArr;
1697
+ size_t size;
1698
+ ret = gsGetRowFieldAsBoolArray (row, (int32_t ) i, (const GSBool **)&boolArr, &size);
1699
+ PyObject* list = PyList_New (size);
1700
+ for (int j = 0 ; j < size; j++) {
1701
+ PyList_SetItem (list, j, PyBool_FromLong (boolArr[j]));
1702
+ }
1703
+ PyList_SetItem (outList, i, list);
1704
+ break ;
1705
+ }
1706
+ case GS_TYPE_BYTE_ARRAY: {
1707
+ int8_t * byteArr;
1708
+ size_t size;
1709
+ ret = gsGetRowFieldAsByteArray (row, (int32_t ) i, (const int8_t **)&byteArr, &size);
1710
+ PyObject* list = PyList_New (size);
1711
+ for (int j = 0 ; j < size; j++) {
1712
+ PyList_SetItem (list, j, PyInt_FromLong (byteArr[j]));
1713
+ }
1714
+ PyList_SetItem (outList, i, list);
1715
+ break ;
1716
+ }
1717
+ case GS_TYPE_SHORT_ARRAY: {
1718
+ int16_t * shortArr;
1719
+ size_t size;
1720
+ ret = gsGetRowFieldAsShortArray (row, (int32_t ) i, (const int16_t **)&shortArr, &size);
1721
+ PyObject* list = PyList_New (size);
1722
+ for (int j = 0 ; j < size; j++) {
1723
+ PyList_SetItem (list, j, PyInt_FromLong (shortArr[j]));
1724
+ }
1725
+ PyList_SetItem (outList, i, list);
1726
+ break ;
1727
+ }
1728
+ case GS_TYPE_LONG_ARRAY: {
1729
+ int64_t * longArr;
1730
+ size_t size;
1731
+ ret = gsGetRowFieldAsLongArray (row, (int32_t ) i, (const int64_t **)&longArr, &size);
1732
+ PyObject* list = PyList_New (size);
1733
+ for (int j = 0 ; j < size; j++) {
1734
+ PyList_SetItem (list, j, PyLong_FromLong (longArr[j]));
1735
+ }
1736
+ PyList_SetItem (outList, i, list);
1737
+ break ;
1738
+ }
1739
+ case GS_TYPE_FLOAT_ARRAY: {
1740
+ float * floatArr;
1741
+ size_t size;
1742
+ ret = gsGetRowFieldAsFloatArray (row, (int32_t ) i, (const float **)&floatArr, &size);
1743
+ PyObject* list = PyList_New (size);
1744
+ for (int j = 0 ; j < size; j++) {
1745
+ PyList_SetItem (list, j, PyFloat_FromDouble (static_cast <double >(floatArr[j])));
1746
+ }
1747
+ PyList_SetItem (outList, i, list);
1748
+ break ;
1749
+ }
1750
+ case GS_TYPE_DOUBLE_ARRAY: {
1751
+ double * doubleArr;
1752
+ size_t size;
1753
+ ret = gsGetRowFieldAsDoubleArray (row, (int32_t ) i, (const double **)&doubleArr, &size);
1754
+ PyObject* list = PyList_New (size);
1755
+ for (int j = 0 ; j < size; j++) {
1756
+ PyList_SetItem (list, j, PyFloat_FromDouble (doubleArr[j]));
1757
+ }
1758
+ PyList_SetItem (outList, i, list);
1759
+ break ;
1760
+ }
1761
+ case GS_TYPE_TIMESTAMP_ARRAY: {
1762
+ GSTimestamp* timestampArr;
1763
+ size_t size;
1764
+ ret = gsGetRowFieldAsTimestampArray (row, (int32_t ) i, (const GSTimestamp **)×tampArr, &size);
1765
+ PyObject* list = PyList_New (size);
1766
+ for (int j = 0 ; j < size; j++) {
1767
+ PyList_SetItem (list, j, convertTimestampToObject (×tampArr[j], timestampOutput));
1768
+ }
1769
+ PyList_SetItem (outList, i, list);
1770
+ break ;
1771
+ }
1772
+ default : {
1773
+ // NOT OK
1774
+ ret = -1 ;
1775
+ break ;
1776
+ }
1777
+ }
1778
+ if (ret != GS_RESULT_OK) {
1779
+ *columnError = i;
1780
+ *fieldTypeError = typeList[i];
1781
+ retVal = false ;
1782
+ return retVal;
1783
+ }
1784
+ }
1785
+ return retVal;
1786
+ }
1787
+ }
1788
+
1789
+ %typemap(argout, fragment = " getRowFields" ) (GSRow *rowdata) {
1581
1790
GSRow* row = arg1->getGSRowPtr ();
1582
1791
PyObject *outList = PyList_New (arg1->getColumnCount ());
1583
1792
if (outList == NULL ) {
1584
1793
PyErr_SetString (PyExc_ValueError, " Memory allocation for row is error" );
1585
1794
SWIG_fail;
1586
1795
}
1587
-
1588
1796
GSValue mValue ;
1589
1797
GSType mType ;
1590
1798
GSResult ret;
1591
- for ( int i = 0 ; i < arg1-> getColumnCount (); i++) {
1592
- ret = gsGetRowFieldGeneral (row, i, & mValue , & mType ) ;
1593
- if (ret != GS_RESULT_OK) {
1594
- char errorMsg[ 60 ] ;
1595
- sprintf (errorMsg, " Can't get data for field %d " , i);
1596
- PyErr_SetString (PyExc_ValueError, errorMsg) ;
1597
- SWIG_fail ;
1598
- }
1599
- PyList_SetItem (outList, i, convertFieldToObject (& mValue , mType , arg1-> timestamp_output_with_float )) ;
1799
+ bool retVal;
1800
+ int errorColumn ;
1801
+ GSType errorType;
1802
+ retVal = getRowFields (row, arg1-> getColumnCount (), arg1-> getGSTypeList (),arg1-> timestamp_output_with_float , &errorColumn, &errorType, outList) ;
1803
+ if (retVal == false ) {
1804
+ char errorMsg[ 60 ] ;
1805
+ sprintf (errorMsg, " Can't get data for field %d with type%d " , errorColumn, errorType) ;
1806
+ PyErr_SetString (PyExc_ValueError, errorMsg);
1807
+ SWIG_fail ;
1600
1808
}
1601
1809
$result = outList;
1602
1810
}
@@ -1840,20 +2048,24 @@ static GSChar** convertObjectToStringArray(PyObject* value, size_t* size) {
1840
2048
/* *
1841
2049
* Typemaps output for Store.multi_get() function
1842
2050
*/
1843
- %typemap(in, numinputs = 0 ) (GSContainerRowEntry **entryList, size_t * containerCount, int **colNumList)
1844
- (GSContainerRowEntry *tmpEntryList, size_t tmpContainerCount, int *tmpcolNumList) {
2051
+ %typemap(in, numinputs = 0 ) (GSContainerRowEntry **entryList, size_t * containerCount, int **colNumList, GSType*** typeList )
2052
+ (GSContainerRowEntry *tmpEntryList, size_t tmpContainerCount, int *tmpcolNumList, GSType** tmpTypeList ) {
1845
2053
$1 = &tmpEntryList;
1846
2054
$2 = &tmpContainerCount;
1847
2055
$3 = &tmpcolNumList;
2056
+ $4 = &tmpTypeList;
1848
2057
}
1849
2058
1850
- %typemap(argout, numinputs = 0 , fragment = " convertStrToObj" , fragment = " convertFieldToObject " ) (GSContainerRowEntry **entryList, size_t * containerCount, int **colNumList) () {
2059
+ %typemap(argout, numinputs = 0 , fragment = " convertStrToObj" , fragment = " getRowFields " ) (GSContainerRowEntry **entryList, size_t * containerCount, int **colNumList, GSType*** typeList ) () {
1851
2060
PyObject* dict = PyDict_New ();
1852
2061
griddb::Container *tmpContainer;
1853
2062
GSRow* row;
1854
2063
GSValue mValue ;
1855
2064
GSType mType ;
1856
2065
GSResult ret;
2066
+ bool retVal;
2067
+ int errorColumn;
2068
+ GSType errorType;
1857
2069
for (int i = 0 ; i < *$2 ; i++) {
1858
2070
PyObject* key = convertStrToObj ((*$1 )[i].containerName );
1859
2071
PyObject* list = PyList_New ((*$1 )[i].rowCount );
@@ -1864,15 +2076,12 @@ static GSChar** convertObjectToStringArray(PyObject* value, size_t* size) {
1864
2076
PyErr_SetString (PyExc_ValueError, " Memory allocation for row is error" );
1865
2077
SWIG_fail;
1866
2078
}
1867
- for (int k = 0 ; k < (*$3 )[i]; k++) {
1868
- ret = gsGetRowFieldGeneral (row, k, &mValue , &mType );
1869
- if (ret != GS_RESULT_OK) {
1870
- char errorMsg[60 ];
1871
- sprintf (errorMsg, " Can't get data for field %d" , i);
1872
- PyErr_SetString (PyExc_ValueError, errorMsg);
1873
- SWIG_fail;
1874
- }
1875
- PyList_SetItem (outList, k, convertFieldToObject (&mValue , mType , arg1->timestamp_output_with_float ));
2079
+ retVal = getRowFields (row, (*$3 )[i], (*$4 )[i], arg1->timestamp_output_with_float , &errorColumn, &errorType, outList);
2080
+ if (retVal == false ) {
2081
+ char errorMsg[60 ];
2082
+ sprintf (errorMsg, " Can't get data for field %d with type %d" , errorColumn, errorType);
2083
+ PyErr_SetString (PyExc_ValueError, errorMsg);
2084
+ SWIG_fail;
1876
2085
}
1877
2086
PyList_SetItem (list, j, outList);
1878
2087
}
@@ -1882,7 +2091,17 @@ static GSChar** convertObjectToStringArray(PyObject* value, size_t* size) {
1882
2091
Py_DECREF (key);
1883
2092
Py_DECREF (list);
1884
2093
}
1885
- delete (*$3 );
2094
+ if (*$4 ) {
2095
+ for (int j = 0 ; j < *$2 ;j++) {
2096
+ if ((*$4 )[j]) {
2097
+ free ((void *) (*$4 )[j]);
2098
+ }
2099
+ }
2100
+ delete (*$4 );
2101
+ }
2102
+ if (*$3 ) {
2103
+ delete (*$3 );
2104
+ }
1886
2105
$result = dict;
1887
2106
}
1888
2107
@@ -2207,7 +2426,7 @@ static GSChar** convertObjectToStringArray(PyObject* value, size_t* size) {
2207
2426
$4 = &aggResultTmp;
2208
2427
}
2209
2428
2210
- %typemap(argout, fragment = " convertFieldToObject " ) (GSRowSetType* type, bool * hasNextRow,
2429
+ %typemap(argout, fragment = " getRowFields " ) (GSRowSetType* type, bool * hasNextRow,
2211
2430
griddb::QueryAnalysisEntry** queryAnalysis, griddb::AggregationResult** aggResult) {
2212
2431
2213
2432
PyObject *resultobj;
@@ -2217,6 +2436,8 @@ static GSChar** convertObjectToStringArray(PyObject* value, size_t* size) {
2217
2436
GSValue mValue ;
2218
2437
GSType mType ;
2219
2438
GSResult ret;
2439
+ bool retVal;
2440
+ int errorColumn;
2220
2441
switch (*$1 ) {
2221
2442
case (GS_ROW_SET_CONTAINER_ROWS):
2222
2443
if (*$2 == false ) {
@@ -2229,15 +2450,13 @@ static GSChar** convertObjectToStringArray(PyObject* value, size_t* size) {
2229
2450
PyErr_SetString (PyExc_ValueError, " Memory allocation for row is error" );
2230
2451
SWIG_fail;
2231
2452
}
2232
- for (int i = 0 ; i < arg1->getColumnCount (); i++) {
2233
- ret = gsGetRowFieldGeneral (row, i, &mValue , &mType );
2234
- if (ret != GS_RESULT_OK) {
2235
- char errorMsg[60 ];
2236
- sprintf (errorMsg, " Can't get data for field %d" , i);
2237
- PyErr_SetString (PyExc_ValueError, errorMsg);
2238
- SWIG_fail;
2239
- }
2240
- PyList_SetItem (outList, i, convertFieldToObject (&mValue , mType , arg1->timestamp_output_with_float ));
2453
+ GSType errorType;
2454
+ retVal = getRowFields (row, arg1->getColumnCount (), arg1->getGSTypeList (),arg1->timestamp_output_with_float , &errorColumn, &errorType, outList);
2455
+ if (retVal == false ) {
2456
+ char errorMsg[60 ];
2457
+ sprintf (errorMsg, " Can't get data for field %d with type%d" , errorColumn, errorType);
2458
+ PyErr_SetString (PyExc_ValueError, errorMsg);
2459
+ SWIG_fail;
2241
2460
}
2242
2461
$result = outList;
2243
2462
}
0 commit comments