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

[EMAIL PROTECTED]

"Badges??  We don't need no stinkin badges!"

_______________________________________________
use-revolution mailing list
use-revolution@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to