Did I miss something or didn’t anyone answer the looping question yet? Without knowing much about what the names involved are doing, I think it ought to be pqfname@(res&;)"0 i. ncols which will have the shape (shape of i. ncols)×(shape of whatever pqfname res;0 returns)
Am 08.12.20 um 14:34 schrieb emacstheviking: > Apologies for the length of this email but my brain has thrown one again... > > I am currently working on a wrapper for Postgres using libpq-fe. It's > working but in need of some higher level functions to make result sets > easier to work with and feel more J-like. > > Once the query is executed, all results have been stored in RAM by the > library (not my first choice!) and then a value is obtained like so > > pqgetvalue result_set;row;col > > I've seen the source code for the library and the above translate directly > into an array read; > > char * PQgetvalue(const PGresult *res, int tup_num, int field_num) > { > if (!check_tuple_field_number(res, tup_num, field_num)) > return NULL; > return res->tuples[tup_num][field_num].value; > } > > > *# mema and management.* > > My plan was to write a 'pgquery' verb that takes the connection handle and > a SQL query (details to be settled) and then creates and executes the query > and returns back a table of boxed strings. My first question then is how is > the memory managed? I know from the documentation that memf is the natural > (obverse?) way to release memory but I wanted to know what happens if I > allocate a string with mema then return it and assign it into a boxed > structure. I have an ffi helper I wrote, I call it psz: > > psz=: 3 : 'memr (>y),0,_1' > > If I assign the return value to a variable: > > name =. psz a-mem-address-of-a-C-String > > is the pointer aliased or can I now memf the original address and still > have a viable copy of the string later. I ask this because, for the > lifetime of the result set object, the internally allocated memory is > always around until a pqclear is executed. In this particular case I am > hopefully correct in thinking that my returned box list of strings is > stable up until that time. > > (In --this case-- I don't need to release anything as the library does it > but I wanted a general asnwer about what memr actually does) > > I am more interested in the general case of using 'memr' though; does it > allocate a copy or, as I suspect, is it merely re-typing the memory address > as a string, in the same manner that 'ic' can be used to process integers > and floats. Some insights would be appreciated. > > > *# looping* > > This brings me to how best to extract the data from the internal result > set? My basic flow so far is this: > > conn=. pqconnectdb<'dbname=foo' > res=.pqexec conn;'select * from some_table' > nrows=. pqtuples res > ncols=. pqfields res > > So I might have 7 rows and 12 columns per row. Obtaining the name of the > columns is done using the pqfname call. I've been playing around and the > basic loop I have is awful! > > pgtest =: 3 : 0 > nrows=. pqntuples y > ncols=. pqnfields y > NB. get the column names as the first row > for_j. i. ncols do. > c =. pqfname y;j > smoutput psz c > end. > '' > ) > > I know I can do this 'looplessly' but have so far failed. It's going to be > a combination of bonding and maybe a hook or something but as I say, total > quagmire at the moment! The thing I require to be looped is this: > > pqfname res;col. NB. where col is i. ncols > > My thought process was along the lines of, produce an array of res;i pairs > but that feels ugly, then I thought about and played with trying to just > pass the i. ncols list into a bonded call to ; but somehow got stuck... > > So..I am after some nice solutions to how best to iterate ncols to obtain > the initial row of column names and then extract each row of data from the > result set...I know this can be done very succinctly, I continue to work on > it... > > Loving the challenge of thinking so differently! > > Thanks all, > Sean > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > -- ---------------------- mail written using NEO neo-layout.org ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm