GByte *OGRMIAttrIndex::BuildKey( OGRField *psKey ) { GByte* ret = nullptr; switch( poFldDefn->GetType() ) { case OFTInteger: ret = poINDFile->BuildKey( iIndex, psKey->Integer ); break; case OFTInteger64: { if( !CPL_INT64_FITS_ON_INT32(psKey->Integer64) ) { CPLError(CE_Warning, CPLE_NotSupported, "64bit integer value passed to OGRMIAttrIndex::BuildKey()"); } ret = poINDFile->BuildKey( iIndex, static_cast<int>(psKey->Integer64) ); break; } case OFTReal: ret = poINDFile->BuildKey( iIndex, psKey->Real ); break; case OFTString: ret = poINDFile->BuildKey( iIndex, psKey->String ); break; default: CPLAssert( false ); break; } return ret; }
GByte *OGRMIAttrIndex::BuildKey( OGRField *psKey ) { switch( poFldDefn->GetType() ) { case OFTInteger: return poINDFile->BuildKey( iIndex, psKey->Integer ); break; case OFTInteger64: { if( !CPL_INT64_FITS_ON_INT32(psKey->Integer64) ) { CPLError(CE_Warning, CPLE_NotSupported, "64bit integer value passed to OGRMIAttrIndex::BuildKey()"); } return poINDFile->BuildKey( iIndex, (int)psKey->Integer64 ); break; } case OFTReal: return poINDFile->BuildKey( iIndex, psKey->Real ); break; case OFTString: return poINDFile->BuildKey( iIndex, psKey->String ); break; default: CPLAssert( FALSE ); return NULL; } }
OGRFeature * OGRBNALayer::GetFeature( GIntBig nFID ) { if (nFID < 0 || !CPL_INT64_FITS_ON_INT32(nFID)) return NULL; FastParseUntil( static_cast<int>( nFID ) ); if (nFID >= nFeatures) return NULL; int ok; if( VSIFSeekL( fpBNA, offsetAndLineFeaturesTable[nFID].offset, SEEK_SET ) < 0 ) return NULL; curLine = offsetAndLineFeaturesTable[nFID].line; BNARecord* record = BNA_GetNextRecord(fpBNA, &ok, &curLine, TRUE, bnaFeatureType); OGRFeature *poFeature = BuildFeatureFromBNARecord(record, (int)nFID); BNA_FreeRecord(record); return poFeature; }
OGRFeature *OGRAVCBinLayer::GetFeature( GIntBig nFID ) { if( !CPL_INT64_FITS_ON_INT32(nFID) ) return NULL; /* -------------------------------------------------------------------- */ /* If we haven't started yet, open the file now. */ /* -------------------------------------------------------------------- */ if( hFile == NULL ) { AVCE00ReadPtr psInfo = ((OGRAVCBinDataSource *) poDS)->GetInfo(); hFile = AVCBinReadOpen(psInfo->pszCoverPath, psSection->pszFilename, psInfo->eCoverType, psSection->eType, psInfo->psDBCSInfo); } /* -------------------------------------------------------------------- */ /* Read the raw feature - the -3 fid is a special flag */ /* indicating serial access. */ /* -------------------------------------------------------------------- */ void *pFeature; if( nFID == -3 ) { while( (pFeature = AVCBinReadNextObject( hFile )) != NULL && !MatchesSpatialFilter( pFeature ) ) { nNextFID++; } } else { bNeedReset = TRUE; pFeature = AVCBinReadObject( hFile, (int)nFID ); } if( pFeature == NULL ) return NULL; /* -------------------------------------------------------------------- */ /* Translate the feature. */ /* -------------------------------------------------------------------- */ OGRFeature *poFeature; poFeature = TranslateFeature( pFeature ); if( poFeature == NULL ) return NULL; /* -------------------------------------------------------------------- */ /* LAB's we have to assign the FID to directly, since it */ /* doesn't seem to be stored in the file structure. */ /* -------------------------------------------------------------------- */ if( psSection->eType == AVCFileLAB ) { if( nFID == -3 ) poFeature->SetFID( nNextFID++ ); else poFeature->SetFID( nFID ); } /* -------------------------------------------------------------------- */ /* If this is a polygon layer, try to assemble the arcs to form */ /* the whole polygon geometry. */ /* -------------------------------------------------------------------- */ if( psSection->eType == AVCFilePAL || psSection->eType == AVCFileRPL ) FormPolygonGeometry( poFeature, (AVCPal *) pFeature ); /* -------------------------------------------------------------------- */ /* If we have an attribute table, append the attributes now. */ /* -------------------------------------------------------------------- */ AppendTableFields( poFeature ); return poFeature; }
OGRFieldType GeoJSONPropertyToFieldType( json_object* poObject, OGRFieldSubType& eSubType, bool bArrayAsString ) { eSubType = OFSTNone; if( poObject == NULL ) { return OFTString; } json_type type = json_object_get_type( poObject ); if( json_type_boolean == type ) { eSubType = OFSTBoolean; return OFTInteger; } else if( json_type_double == type ) return OFTReal; else if( json_type_int == type ) { GIntBig nVal = json_object_get_int64(poObject); if( !CPL_INT64_FITS_ON_INT32(nVal) ) { if( nVal == MY_INT64_MIN || nVal == MY_INT64_MAX ) { static bool bWarned = false; if( !bWarned ) { bWarned = true; CPLError( CE_Warning, CPLE_AppDefined, "Integer values probably ranging out of 64bit integer " "range have been found. Will be clamped to " "INT64_MIN/INT64_MAX"); } } return OFTInteger64; } else { return OFTInteger; } } else if( json_type_string == type ) return OFTString; else if( json_type_array == type ) { if( bArrayAsString ) return OFTString; const int nSize = json_object_array_length(poObject); if( nSize == 0 ) // We don't know, so let's assume it's a string list. return OFTStringList; OGRFieldType eType = OFTIntegerList; bool bOnlyBoolean = true; for( int i = 0; i < nSize; i++ ) { json_object* poRow = json_object_array_get_idx(poObject, i); if( poRow != NULL ) { type = json_object_get_type( poRow ); bOnlyBoolean &= type == json_type_boolean; if( type == json_type_string ) return OFTStringList; else if( type == json_type_double ) eType = OFTRealList; else if( eType == OFTIntegerList && type == json_type_int ) { GIntBig nVal = json_object_get_int64(poRow); if( !CPL_INT64_FITS_ON_INT32(nVal) ) eType = OFTInteger64List; } else if( type != json_type_int && type != json_type_boolean ) return OFTString; } } if( bOnlyBoolean ) eSubType = OFSTBoolean; return eType; } return OFTString; // null, object }
OGRErr OGRMySQLTableLayer::ICreateFeature( OGRFeature *poFeature ) { MYSQL_RES *hResult=NULL; CPLString osCommand; int i, bNeedComma = FALSE; /* -------------------------------------------------------------------- */ /* Form the INSERT command. */ /* -------------------------------------------------------------------- */ osCommand.Printf( "INSERT INTO `%s` (", poFeatureDefn->GetName() ); if( poFeature->GetGeometryRef() != NULL ) { osCommand = osCommand + "`" + pszGeomColumn + "` "; bNeedComma = TRUE; } if( poFeature->GetFID() != OGRNullFID && pszFIDColumn != NULL ) { if( bNeedComma ) osCommand += ", "; osCommand = osCommand + "`" + pszFIDColumn + "` "; bNeedComma = TRUE; } for( i = 0; i < poFeatureDefn->GetFieldCount(); i++ ) { if( !poFeature->IsFieldSet( i ) ) continue; if( !bNeedComma ) bNeedComma = TRUE; else osCommand += ", "; osCommand = osCommand + "`" + poFeatureDefn->GetFieldDefn(i)->GetNameRef() + "`"; } osCommand += ") VALUES ("; // Set the geometry bNeedComma = poFeature->GetGeometryRef() != NULL; if( poFeature->GetGeometryRef() != NULL) { char *pszWKT = NULL; if( poFeature->GetGeometryRef() != NULL ) { OGRGeometry *poGeom = (OGRGeometry *) poFeature->GetGeometryRef(); poGeom->closeRings(); poGeom->flattenTo2D(); poGeom->exportToWkt( &pszWKT ); } if( pszWKT != NULL ) { osCommand += CPLString().Printf( "GeometryFromText('%s',%d) ", pszWKT, nSRSId ); OGRFree( pszWKT ); } else osCommand += "''"; } // Set the FID if( poFeature->GetFID() != OGRNullFID && pszFIDColumn != NULL ) { GIntBig nFID = poFeature->GetFID(); if( !CPL_INT64_FITS_ON_INT32(nFID) && GetMetadataItem(OLMD_FID64) == NULL ) { CPLString osCommand2; osCommand2.Printf( "ALTER TABLE `%s` MODIFY COLUMN `%s` BIGINT UNIQUE NOT NULL AUTO_INCREMENT", poFeatureDefn->GetName(), pszFIDColumn ); if( mysql_query(poDS->GetConn(), osCommand2 ) ) { poDS->ReportError( osCommand2 ); return OGRERR_FAILURE; } // make sure to attempt to free results of successful queries hResult = mysql_store_result( poDS->GetConn() ); if( hResult != NULL ) mysql_free_result( hResult ); hResult = NULL; SetMetadataItem(OLMD_FID64, "YES"); } if( bNeedComma ) osCommand += ", "; osCommand += CPLString().Printf( CPL_FRMT_GIB, nFID ); bNeedComma = TRUE; } for( i = 0; i < poFeatureDefn->GetFieldCount(); i++ ) { if( !poFeature->IsFieldSet( i ) ) continue; if( bNeedComma ) osCommand += ", "; else bNeedComma = TRUE; const char *pszStrValue = poFeature->GetFieldAsString(i); if( poFeatureDefn->GetFieldDefn(i)->GetType() != OFTInteger && poFeatureDefn->GetFieldDefn(i)->GetType() != OFTInteger64 && poFeatureDefn->GetFieldDefn(i)->GetType() != OFTReal && poFeatureDefn->GetFieldDefn(i)->GetType() != OFTBinary ) { int iChar; //We need to quote and escape string fields. osCommand += "'"; for( iChar = 0; pszStrValue[iChar] != '\0'; iChar++ ) { if( poFeatureDefn->GetFieldDefn(i)->GetType() != OFTIntegerList && poFeatureDefn->GetFieldDefn(i)->GetType() != OFTInteger64List && poFeatureDefn->GetFieldDefn(i)->GetType() != OFTRealList && poFeatureDefn->GetFieldDefn(i)->GetWidth() > 0 && iChar == poFeatureDefn->GetFieldDefn(i)->GetWidth() ) { CPLDebug( "MYSQL", "Truncated %s field value, it was too long.", poFeatureDefn->GetFieldDefn(i)->GetNameRef() ); break; } if( pszStrValue[iChar] == '\\' || pszStrValue[iChar] == '\'' ) { osCommand += '\\'; osCommand += pszStrValue[iChar]; } else osCommand += pszStrValue[iChar]; } osCommand += "'"; } else if( poFeatureDefn->GetFieldDefn(i)->GetType() == OFTBinary ) { int binaryCount = 0; GByte* binaryData = poFeature->GetFieldAsBinary(i, &binaryCount); char* pszHexValue = CPLBinaryToHex( binaryCount, binaryData ); osCommand += "x'"; osCommand += pszHexValue; osCommand += "'"; CPLFree( pszHexValue ); } else { osCommand += pszStrValue; } } osCommand += ")"; //CPLDebug("MYSQL", "%s", osCommand.c_str()); int nQueryResult = mysql_query(poDS->GetConn(), osCommand.c_str() ); const my_ulonglong nFID = mysql_insert_id( poDS->GetConn() ); if( nQueryResult ){ int eErrorCode = mysql_errno(poDS->GetConn()); if (eErrorCode == 1153) {//ER_NET_PACKET_TOO_LARGE) poDS->ReportError("CreateFeature failed because the MySQL server " \ "cannot read the entire query statement. Increase " \ "the size of statements your server will allow by " \ "altering the 'max_allowed_packet' parameter in "\ "your MySQL server configuration."); } else { CPLDebug("MYSQL","Error number %d", eErrorCode); poDS->ReportError( osCommand.c_str() ); } // make sure to attempt to free results hResult = mysql_store_result( poDS->GetConn() ); if( hResult != NULL ) mysql_free_result( hResult ); hResult = NULL; return OGRERR_FAILURE; } if( nFID > 0 ) { poFeature->SetFID( nFID ); } // make sure to attempt to free results of successful queries hResult = mysql_store_result( poDS->GetConn() ); if( hResult != NULL ) mysql_free_result( hResult ); hResult = NULL; return OGRERR_NONE; }