[GRASS-user] db_fetch questions

Jaime Carrera jaicarrerahdez at yahoo.com
Thu Mar 20 09:31:15 EDT 2008


Hi Markus and Moritz,

Thanks for your suggestions; I tried another loop (the one from v.in.db) and gave the result that I needed. Below are my "experiments":
The first db_fetch loop (exits after one interaction): I have to "cheat" to be able to get all the records from the database:

  while(1){
    if(db_fetch (&cursor, DB_NEXT, &more) != DB_OK)
      return(-1);
    nodeprop=db_get_value_as_double(dbvalue,ctype);
    printf("node prop= %.2f\n",nodeprop);
    count++;
    if(count<12699) /* use max(cat) value for this one, just testing*/
       more=0;
    if ( more) break;
  }

Now, using the loop as used in v.in.db I get what I need, without "cheating':

   while ( db_fetch (&cursor, DB_NEXT, &more ) == DB_OK && more ) {
     nodeprop=db_get_value_as_double(dbvalue,ctype);
     printf("node prop= %.2f\n",nodeprop);
   }

There are two differences: on the first loop more==1 immediately, and thus exits the loop; while on the second one the loop is exptecting more==1. Another difference is the != or == DB_OK part.

What I can gather from this, is that the first loop is more appropriate to queries done on a category basis, but not for fetching an entire table. 


Cheers,
Jaime



Moritz Lennert <moritz.lennert at ulb.ac.be> escribió: On 20/03/08 00:19, Jaime Carrera wrote:
> Hi list,
> 
> My apologies if this question fits better in the developers list.
> I'm trying to understand how db_fetch works and why am getting a strange 
> error.
> After a query is executed and db_open_select_cursor is used, db_fetch is 
> used to fetch the data of the resultant query. AFAIK, db_fetch(&cursor, 
> DB_NEXT, &more) fetches the data on a row by row basis; is this correct? 

Yes.

> My problem is that everything works fine on my program except the 
> db_fetch loop, as the loop breaks after the first iteration (although my 
> table has 3000 rows).
> Can someone help me to figure out why the loop breaks?

Is your cursor correct ? Are you checking for DB_OK ? What is the status 
of more ? You defininetely have to check for the former and possibly for 
the latter (as in some of the examples Markus sent, i.e. v.in.db/main.c.)

In general, it would be helpful to send your code to understand what is 
happening.

Moritz


       
---------------------------------

¡Capacidad ilimitada de almacenamiento en tu correo!
No te preocupes más por el espacio de tu cuenta con Correo Yahoo!:
http://correo.espanol.yahoo.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/grass-user/attachments/20080320/09362b18/attachment.html


More information about the grass-user mailing list