static int getExtent(const char *queryString, int &pos) { r_Set<r_Ref_Any> result_set; r_OQL_Query query (queryString); r_oql_execute (query, result_set); if (result_set.get_element_type_schema()->type_id() == r_Type::MINTERVALTYPE) { r_Iterator<r_Ref_Any> iter = result_set.create_iterator(); r_Ref<r_Minterval> interv = r_Ref<r_Minterval>(*iter); r_Point extent = interv->get_extent(); int dim = extent.dimension(); int result = -1; for (int i=0; i<dim; ++i) { if (extent[i] == 1) continue; if (result != -1) return -1; result = extent[i]; pos = i; } if (result == -1) return 1; else return result; } else return -1; }
CPLErr RasdamanRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff, void * pImage ) { //cerr << "Read block " << nBlockXOff << " " << nBlockYOff << endl; RasdamanDataset *poGDS = (RasdamanDataset *) poDS; r_Database database; r_Transaction transaction; memset(pImage, 0, nRecordSize); try { database.set_servername(poGDS->host, poGDS->port); database.set_useridentification(poGDS->username, poGDS->userpassword); database.open(poGDS->databasename); transaction.begin(); char x_lo[11], x_hi[11], y_lo[11], y_hi[11]; int xPos = poGDS->xPos; int yPos = poGDS->yPos; sprintf(x_lo, "%d", nBlockXOff * nBlockXSize); sprintf(x_hi, "%d", (nBlockXOff+1) * nBlockXSize-1); sprintf(y_lo, "%d", nBlockYOff * nBlockYSize); sprintf(y_hi, "%d", (nBlockYOff+1) * nBlockYSize-1); CPLString queryString = getQuery(poGDS->queryParam, x_lo, x_hi, y_lo, y_hi); r_Set<r_Ref_Any> result_set; r_OQL_Query query (queryString); r_oql_execute (query, result_set); if (result_set.get_element_type_schema()->type_id() == r_Type::MARRAYTYPE) { r_Iterator<r_Ref_Any> iter = result_set.create_iterator(); r_Ref<r_GMarray> gmdd = r_Ref<r_GMarray>(*iter); r_Minterval sp = gmdd->spatial_domain(); r_Point extent = sp.get_extent(); r_Point base = sp.get_origin(); int tileX = extent[xPos]; int tileY = extent[yPos]; r_Point access = base; char *resultPtr; for (int j=0; j<tileY; ++j) { for (int i=0; i<tileX; ++i) { resultPtr = (char*)pImage + (j*nBlockYSize+i)*typeSize; access[xPos] = base[xPos]+i; access[yPos] = base[yPos]+j; const char *data = (*gmdd)[access] + typeOffset; memcpy(resultPtr, data, typeSize); } } } transaction.commit(); database.close(); } catch (r_Error error) { CPLError(CE_Failure, CPLE_AppDefined, "%s", error.what()); return CPLGetLastErrorType(); } return CE_None; }
r_Set<r_Ref_Any> RasdamanDataset::execute(const char* string) { CPLDebug("rasdaman", "Executing query '%s'.", string); r_Set<r_Ref_Any> result_set; r_OQL_Query query(string); r_oql_execute(query, result_set); return result_set; }
void RasdamanDataset::createBands(const char* queryString) { r_Set<r_Ref_Any> result_set; r_OQL_Query query (queryString); r_oql_execute (query, result_set); if (result_set.get_element_type_schema()->type_id() == r_Type::MARRAYTYPE) { r_Iterator<r_Ref_Any> iter = result_set.create_iterator(); r_Ref<r_GMarray> gmdd = r_Ref<r_GMarray>(*iter); const r_Base_Type* baseType = gmdd->get_base_type_schema(); int counter = 1; getTypes(baseType, counter, 0); } }