Can't pass array function result as parameter
Jerry Daniels
jerry at daniels-mara.com
Sun Apr 2 01:12:59 EST 2006
James,
Just saw this. We'll take a look at why we're not catching this.
Best,
Jerry Daniels
-------------- next part --------------
Artists, Consultants & Developers
http://www.daniels-mara.com/art
http://www.daniels-mara.com/products
http://www.daniels-mara.com
Voice: 512.879.6286
Skype: jerry.daniels
On Apr 1, 2006, at 10:40 AM, James Spencer wrote:
>
> On Apr 1, 2006, at 3:25 AM, David Burgun wrote:
>
>> There's really no need to copy it entry by entry, you can just
>> copy the whole array as in:
>>
>> put LibGetArray() into myArray1
>>
>> put LibAnotherFunction(myArray1) into myArray2 --Here you could
>> put it back into Array1
>>
>> I do this all the time.
>>
>> What you can't do is this:
>>
>> put LibAnotherFunction (LibGetArray()) into myArrayX
>
> Just to bring this full circle, I finally figured out what was
> going on. I'm going to take the time to sum up what I figured out
> because it may save someone else some frustration.
>
> Background:
> Being more specific than I have been, I am testing for someone else
> a library of routines for accessing a MySQL database, something
> similar to Blue Mango's libDatabase (it's not mine which is why
> I've been a little careful about including any code from the
> library here). The test involves a simple database containing
> records of books, things like Title, Author, ISBN, etc. I was
> trying to get a record (representing a single book) from a
> database, modify it and then insert the modified record back into
> the database as a new record. The call to insert the record into
> the database was failing silently.
>
> My original problem:
> In my code, I was doing exactly what Dave suggests above. I called
> the equivalent of LibGetArray(), specifically calling a library
> function which returned the current record in the form of an array
> where each element of the array is a field of the record. I was
> putting this array into a local variable as Dave suggests above and
> the debugger showed that the local variable correctly contained a
> valid array. I then modified one element, the title of the book,
> in the array (in the local variable) and then passed the local
> variable to the equivalent of LibAnotherFunction(), specifically a
> handler which inserts a record in the database with the values
> contained in the array passed to it. My specific code which was
> failing:
>
> on mouseUp
>
> -- duplicates the current record in the database, appending
> -- "(DUPLICATE)" to the book title.
>
> local tRecordSet, tCurrentRecord, tTitle
> local tErrorNo,tErrorString
>
> try
> -- cRecordSet is a custom property containing a reference to
> -- to the current database "cursor", i.e. a set of records
> -- from the database
> put the cRecordSet of this stack into tRecordSet
>
> -- the following puts the current record data into a
> -- Rev array using the database column names as the indices
> put dbGetRecordData(tRecordSet) into tCurrentRecord
>
> -- alter the title so we can see this is a duplicate book
> put tCurrentRecord["Title"] into tTitle
> put "(DUPLICATE)" after tTitle
> put tTitle into tCurrentRecord["Title"]
>
> -- dbInsert expects the name of a MySQL table and a Rev
> -- array containing the new record data, indexed by
> -- database column names. This fails
> dbInsert "books", tCurrentRecord
>
> -- code to update the display omitted
>
> catch pException
> -- the above fails silently: we never catch an error here
> put item 1 of line 1 of pException into tErrorNo
> put item 2 of line 1 of pException into tErrorString
> answer "ERROR: Unable to copy the book. Error = " &
> tErrorNo & \
> " (" & tErrorString & ")!"
> end try
>
> end mouseUp
>
> What made this VERY frustrating was that I would walk through the
> above code and step into dbInsert in the debugger and what it
> showed was that tCurrentRecord was correctly being set by
> dbGetRecordData, the Title of the book was correctly getting
> changed in tCurrentRecord and tCurrentRecord was valid in the line
> calling dbInsert but in dbInsert, the second parameter was showing
> in the debugger as empty.
>
> The solution:
> In the end, the problem was NOT with the array passing but rather
> three unrelated bugs.
>
> The first arose because I was using Constellation's debugger and
> variable display. There is apparently a minor bug in how it shows
> arrays passed as parameters: in dbInsert it was showing the second
> parameter as empty even though I knew I was passing a valid array.
> In fact, while Constellation's display showed the parameter as
> empty, Rev's variable watcher, which I finally opened this morning,
> shows that the parameter is valid containing exactly what I passed.
>
> The other two bugs are related and I'm not sure if they are in the
> library I'm testing or in the Rev database library. First, some of
> the elements in the array returned from dbGetCurrentRecord were
> empty and I was passing those empty elements back to dbInsert.
> This causes the insertion to fail with a MySQL syntax error,
> although I haven't completely figured out why. Whatever, just to
> complete the perfect storm, dbInsert has a bug in that it looks for
> "revdberr" in the result of the SQL command which did the insert
> and as the error returned by MySQL did not contain this, no error
> was being thrown.
>
> Bottom line is that at this point, as I already discovered by
> happenstance, my code works by copying the array element by element
> checking that the element is not empty (I suppose I could also
> simply delete the empty elements from tCurrentRecord), and I will
> report the minor bugs that I found to both Constellation and the
> library author.
>
> Thank you all for your help in working this out.
>
> Spence
>
> James P. Spencer
> Rochester, MN
>
> jspencer78 at mac.com
>
> "Badges?? We don't need no stinkin badges!"
>
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-revolution
>
More information about the use-livecode
mailing list