/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . */ /************************************************************* * * * PURPOSE: * Example program for rasql query invocation from C++, showing a * typical mapping scenario. * * * BUGS: * - needs this link cmd line * query2: query2.o * $(CXX) $(LDFLAGS) -o $@ $^ \ * -L$(RMANHOME)/lib -lrasodmg -lclientcomm -lcompression -lconversion -lraslib -lnetwork -ljpeg -lpng -ltiff -lmfhdf -ldf -lcrypt o -lclientcomm -lm -lz * ************************************************************/ #include // Linux needs this for template instantiation #ifdef EARLY_TEMPLATE #define __EXECUTABLE__ #ifdef __GNUG__ #include "raslib/template_inst.hh" #endif #endif // this file is generated by the rasdl processor #include "basictypes.hh" // connectivity constants char *host = "localhost"; int port = 7001; char *db = "RASBASE"; char *userName = "rasguest"; char *userPass = "rasguest"; // demo program settings // - collection ("map") name char *collection = "rgb"; // - coordinates of map bbox to be retrieved unsigned int xImageLo = 100; unsigned int xImageHi = 200; unsigned int yImageLo = 100; unsigned int yImageHi = 200; // - target window size unsigned int xSize = 10; unsigned int ySize = 10; // global connection objects r_Database database; r_Transaction transaction; // sample image accessing function, typical for mapping applications // input: collection ("map") name, source image coordinates, target window size // output: ptr to image array // precondition: we're accessing an RGB image, so that we can select the "green" channel of it // note: the most important parts contain markups at the beginning of the line unsigned char *readImage( const char *collection, int xImageLo, int xImageHi, int yImageLo, int yImageHi, int xSize, int ySize ) throw (r_Error) { r_Set< r_Ref< r_GMarray > > imageSet; // result set r_Ref< r_GMarray > image; r_Iterator< r_Ref< r_GMarray > > iter; // function result unsigned char *result = NULL; try { cout << "creating query..." << flush; // parameters: // $1 map bbox coordinate, lower x // $2 map bbox coordinate, upper x // $3 map bbox coordinate, lower y // $4 map bbox coordinate, upper y // $5 result window x size // $6 result window y size // $7 collection (i.e., map) name /* 1 */ r_OQL_Query query("select scale(img.green[$1:$2,$3:$4],[1:$5,1:$6]) from $7 as img"); cout << "substituting parameters ..." << flush; /* 2 */ query << xImageLo << xImageHi << yImageLo << yImageHi << xSize << ySize << collection; cout << "[query: " << query.get_query() << "]..."; cout << "executing query..." << flush; /* 3 */ r_oql_execute( query, imageSet ); // now we assume a result has come back iter = imageSet.create_iterator(); iter.reset(); /* 4 */ result = (unsigned char*) (*iter)->get_array(); } catch(r_Error& e) { cout << "Error: query failed: " << e.what() << flush; throw; } return result; } // simple wrapper, handling db connectivity and demo output int main() { try { database.set_servername( host, port ); database.set_useridentification( userName, userPass ); cout << "Opening database " << db << " on " << host << "..." << flush; database.open( db ); cout << "starting read-only transaction..." << flush; transaction.begin( r_Transaction::read_only ); // the real workhorse: fetch image data unsigned char *imgPtr = readImage( collection, xImageLo, xImageHi, yImageLo, yImageHi, xSize, ySize ); cout << "result image:" << endl << hex; for (int i = 0; i < xSize; i++) { for (int j = 0; j < ySize; j++) { register unsigned char c = *imgPtr; cout << " " << setw(2) << (unsigned short) (c & 0xFF); imgPtr++; } cout << endl; } cout << dec; } catch(r_Error& e) { cout << "Error: cannot access database: " << e.what() << endl << flush; } // ignore any (previous) errors for connection close try { cout << "aborting transaction..." << flush; transaction.abort(); cout << "closing database..." << flush; database.close(); cout << "done." << endl; } catch(r_Error &e) { cout << "Error closing connection: " << e.what() << endl << flush; } return 0; } /* * end of query2.cc */