On Thu, Apr 13, 2006 at 09:34:10AM -0400, Stephen Frost wrote: > * Martijn van Oosterhout (kleptog@svana.org) wrote: > > Except in the case of psqlODBC, it wants to be able to malloc/free() > > each field, which your method doesn't solve. Also, it doesn't solve the > > duplicate memory use, nor the retreiving of rows before the resultset > > is complete. > > I don't entirely follow why you think it wouldn't solve the duplicate > memory use (except perhaps in the psqlODBC case if they decide to just > grab a bunch of tuples into one area and then go through and malloc/free > each one after that, not exactly what I'd suggest...).
Right, I didn't understand that you meant to be doing this synchronously, as the data came in. I thought it was just another way of retreiving the data already received. But given that a stated reason that psqlODBC didn't use the libpq interface was due to the copying of all the data, it would be nice if we had something for that. From looking at your declaration: int PQgetTuples(PGresult *res, // Returns number of tuples populated const int max_ntuples, // Basically buffer size char *result_set, // Destination buffer const int *columnOffsets, // integer array of offsets const int *columnLengths, // integer array of lengths, for checks const int record_len, // Length of each structure int *columnNulls, // 0/1 for is not null / is null int resultFormat); // Or maybe just binary? you seem to be suggesting that all the data be stored in one big memory block at resultset. What do you do if the data is longer than the given length? What does record_len mean (what structures)? Also, you can't specify binary/non-binary here, that's done in the query request. libpq doesn't handle the data differently depending on binaryness. Also, how can you find out the actual length of each value after the call? Frankly I'm not seeing much improvement over normal processing. It just seems like yet another data-model that won't fit most users. The definition of PQgetvalue is merely: return res->tuples[tup_num][field_num].value; So we could acheive the same effect by letting people look into PQresult before the query is finished. The function you suggest would be especially difficult for something like psqlODBC which has no idea beforehand how long a value could be. I'm still of the opinion that letting people supply an alternative to pqAddTuple would be cleaner. The interface would look like: typedef struct pgresAttValue { int len; /* length in bytes of the value */ char *value; /* actual value, plus terminating zero byte */ } PGresAttValue; typedef int (*PQtuplecallback)( PQresult *res, PGresAttValue *fields ); int PQsettuplecallback( PQresult *res, PQtuplecallback cb ); fields is simply a pointer to an array of nfields such structures. Users can do whatever they want with the info, store it in their own structure, parse it, throw it away, send it over a network, etc. With this callback I could probably implement your function above fairly straightforwardly. Have a nice day, -- Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/ > Patent. n. Genius is 5% inspiration and 95% perspiration. A patent is a > tool for doing 5% of the work and then sitting around waiting for someone > else to do the other 95% so you can sue them.
signature.asc
Description: Digital signature