> Hi Benoît, > > I don't raise these as bugs because they are only annoyances and don't > (specifically) stop things from working. > > I have this code (which works fine when things are fine) but has a few > quirks when a database error occurs. I made a simple test that just > calls this and tries to add the same record to the database twice. > > > Public Function AddDB() As Boolean > > Dim rwcursor As Result > > DBMod.Conn.Begin ' DBMod.Conn is just the current open database > connection rwcursor = DBMod.Conn.Create($tname) > Marshall(rwcursor, $colmap) ' This just moves the current values into > the cursor Try rwcursor.Update > If Error Then > Debug db.Error, Error.code, Error.Text, IsNull(Error.Backtrace) > Print Subst("&1\n[phDB9_gb3: Base persistor database error (&2)] > &3\n&4\n&1\n\n", String$(60, "="), Error.Code, Error.Text, Error.Where) > DBMod.Conn.Rollback > Return False > Endif > > DBMod.Conn.Commit > Return True > > Catch > Print Subst("&1\n[phDB9_gb3: Base persistor general error trap (&2)] > &3\n&4", String$(60, "="), Error.Code, Error.Text, > Error.Backtrace.Join("\n")) > > End > > As I said, when the insert works all is fine, but on the duplicate key > insert, I get the following output from the two trace lines in the "If > Error" block > > > Persistor.AddDB.404: 0 -1 Cannot create record: Duplicate entry '' > for key 'PRIMARY' True > ============================================================ > [phDB9_gb3: Base persistor database error (-1)] Cannot create record: > Duplicate entry '' for key 'PRIMARY' Persistor.AddDB.402 > ============================================================ > > > In the first line we see that db.Error=0 instead of the driver error > code, I would have expected 1022 (mysql error: "Error: 1022 SQLSTATE: > 23000 (ER_DUP_KEY) Message: Can't write; duplicate key in table '%s').
I don't know why. The gb.db.mysql driver set the connection error code just after the query has been run by using a specific API of the mysql library. > > Secondly, and this is more of an issue, the Error.Backtrace is null (as > evidenced by "True" at the end of the line). So I can't get a full > backtrace to the caller that is trying the duplicate insert. You have no Error.Backtrace because you are not inside an error handler, but inside normal code. Use System.Backtrace instead. > > Thirdly, the gambas error code is -1? I thought that code was for > errors raised within the project i.e. Error.Raise(Message) I have used > that code (-1) to discern local vs system errors previously, is this no > longer safe? Gambas has always used "-1" error code for error raised by components and for Error.Raise() method. > > Finally, the error message itself seems to be not populated properly, > "Duplicate entry '' for key.." In my test case the key is multicolumn, > so this may be the reason. However, "Cannot create record: Duplicate > key for '<actual key name>' on table '<table name>'" would (IMO) be a > better message. This message comes from mysql. So I guess I can't fix it. Regards, -- Benoît Minisini ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity and more. Splunk takes this data and makes sense of it. Business sense. IT sense. Common sense. http://p.sf.net/sfu/splunk-d2d-oct _______________________________________________ Gambas-user mailing list Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user