The points I am trying to make is the select
statement from the EO_PK_TABLE for the 'NO_Sent_Notification_Request_Log_TEST' should return a
primary key index.
May be you run this sql statement from the
WorkBench directly and see any difference:
SELECT PK FROM EO_PK_TABLE WHERE NAME =
'NO_Sent_Notification_Request_Log_TEST'
Just another curiosity.. ;-)
Cheers
Cheong Hee
----- Original Message -----
Sent: Tuesday, September 06, 2011 3:51
AM
Subject: Re: Feedback about issue with
MySQL and get primary key
Alas not because if EOUtilities.rawRowsForSQL is not
called, it works. Otherwise not.
It's perfectly reproducible without any change at the database
level.
Thanks for trying ;-)
Philippe
On 5 sept. 2011, at 18:58, Cheong Hee Ng wrote:
Could it be that the NO_Sent_Notification_Request_
Log_TEST is a new table that you have created lately and that your
EO_PK_TABLE could not locate it for primary key. Just curious.
On Mon, Sep 5, 2011 at 8:17 PM, Philippe Rabier <email@hidden> wrote:
I don't want to bug the list too much because I can deal easily with
this issue.
However my curiosity would be happy if someone knows the
reason.
That's said, Cheong, I doubt the cause are those you think for 2
reasons:
- informations inserted in raw SQL are not fetched as EO, never (they
are used for statistics in another WO app) and I pass a new fresh EC
to EOUtilities.raw...
- NONotificationRequestLog
object is also new, inserted also in a new EC as showed in the
code.
So I can't invalidate any object because one is not known by
EOF and the other one is just created.
I made another test: I put the raw insert command in the same
method as below using only one EC and I get the same issue: exception when
EOF tries to get a primary key. So I'm pretty sure that the insert command
causes the exception when I call saveChanges
Philippe
Sent from my iPhone
On 5 sept. 2011, at 12:18, "Cheong Hee (Gmail)" < email@hidden>
wrote:
Hi Philippe
I think
somehow 'NO_Sent_Notification_Request_Log_TEST' is already
registered as an existing object in your ec. This caused the ec to
fetch the object again and therefore failed and aborted. I
may be just reiterated your point to be sure :
)
Just to test, you may need to invalidate all objects
in the ec and try to save the log object again.
Cheers
Cheong Hee
----- Original Message -----
Sent: Monday, September 05, 2011
4:55 PM
Subject: Re: Feedback about issue
with MySQL and get primary key
Hi Ray,
Thank you for the tip. That's something interesting to change the
sql _expression_ on the fly. I was looking for that too.
But you don't get me so I gonna try to be explain with more
concise explanations.
The algorithm is the following:
1 - get data from the DA, check data and return a result
(basically 2 results : data accepted or not)
2 - if result = data_accepted, I insert new data using raw
sql
3 - write into a log entity (in any circumstances) using EOF aka
create an object and insert it into an ec.
What I tried to explain is that when the
EOUtilities.rawRowsForSQL is executed in step 2 (and it works, I don't
have any issue here), the step 3 fails because he can't get a primary
key. If the step 2 is not executed, the step 3 is executed
successfully.
I put the simple code below that is executed, just in case but
nothing weird I guess (I removed the try/catch).
Cheers,
Philippe
String aIpAdress =
(String) userInfo.get(NotificationUserInfoEnum.IP_ADDRESS.toString());
String aRequest =
notificationData.getSenderUri();
String aStatus = (String)
userInfo.get(NotificationUserInfoEnum.STATUS.toString());
EOEditingContext ec =
ERXEC.newEditingContext();
ec.lock();
NOApplication
anApplication = null;
if
(notificationData.getApplicationName() != null)
anApplication =
NBCacheManager.getInstance().application(ec,
notificationData.getApplicationName(),
notificationData.getPlatform());
NONotificationRequestLog
notificationLog =
NONotificationRequestLog.createAndInsertNONotificationRequestLog(ec);
if (anApplication!=null)
{
notificationLog.setApplication(anApplication);
}
else if
(notificationData.getApplicationName() != null)
notificationLog.setApplicationName(notificationData.getApplicationName());
//If a
notification is received, we don't know the platform
if (!(this instanceof
NBNotificationReceivedRecorder))
notificationLog.setPlatform(notificationData.getPlatform());
notificationLog.setIpAddress(aIpAdress);
notificationLog.setRequest(aRequest);
notificationLog.setStatus(aStatus);
ec.saveChanges();
On 5 sept. 2011, at 01:08, Ray Kiddy wrote:
Your rawRowsForSql call through an exception because you are
completely bypassing the primary key generation process, so it you
want to insert rows using this call, you need to generate the
primary keys yourself.
There is a better way to do this. See below.
- ray
On Sep 4, 2011, at 7:49 AM, Philippe Rabier wrote:
Hi all,
Not a question but a feedback if you have the same issue but
I don't have explanation and I didn't look for any.
Env:
WO 5.4.3, java 6 on Mac OS X 10.6.7, Eclipse 3.4, Wonder a
bit old (several months), MySQL v5.0.88
Context:
DA where informations are checked, fetched then if everything
is fine, informations are saved. At the end, we write into a log
the request plus the result and some informations (IP address,
…).
When informations are saved, I decided to
use EOUtilities.rawRowsForSQL to execute an insert sql
command in order to optimize the complete R-R.
Then I write into the log the request, result, … as I
said.
If the insert command is executed, when the log is saved
(through its editingContext), I got an exception when the adaptor
tries to get a new primary key:
Sep 04 14:52:56
YNP_NOWebServicesApp[5000] DEBUG NSLog - Searching for
primary key value for NO_Sent_Notification_Request_Log_TEST
Sep 04 14:52:56
YNP_NOWebServicesApp[5000] DEBUG NSLog -
evaluateExpression:
<com.webobjects.jdbcadaptor._MySQLPlugIn$MySQLExpression:
"SELECT PK FROM EO_PK_TABLE WHERE NAME =
'NO_Sent_Notification_Request_Log_TEST' FOR UPDATE" withBindings:
>
Sep 04 14:52:56
YNP_NOWebServicesApp[5000] INFO
er.extensions.ERXAdaptorChannelDelegate.sqlLogging -
"Unknown"@795485135 _expression_ took 232 ms: SELECT PK FROM
EO_PK_TABLE WHERE NAME = 'NO_Sent_Notification_Request_Log_TEST'
FOR UPDATE
Sep 04 14:52:56
YNP_NOWebServicesApp[5000] DEBUG NSLog - fetch
canceled
Sep 04 14:52:56
YNP_NOWebServicesApp[5000] DEBUG NSLog - 0 row(s)
processed
Sep 04 14:52:56
YNP_NOWebServicesApp[5000] INFO
er.transaction.adaptor.Exceptions - Database Exception
occured: java.lang.IllegalArgumentException:
Array is empty
If I replace EOUtilities.rawRowsForSQL
with ERXEOAccessUtilities.insertRow(ec,
NOAppOpenedAfterPushEvent.Keys.ENTITY_NAME, dic), everything works
great.
For those who were wondering why I wanted to
use EOUtilities.rawRowsForSQL(), the reason is that I wanted
to use "INSERT DELAYED INTO ".
Have a good sunday.
Philippe
I used to know how to do this using only WebObjects classes,
but I cannot remember any longer. But this works with Wonder
classes. There may be a better way to get to the
EOAdaptorChannel.Delegate, but I always seem to re-find the chain
one has to follow. You can get the EODatabaseContext at any point
that you have an eo and use that to get the EOAdaptorChannel. Once
you have them, you do not need to find them again. In the code
below, the setDelegate methods end up getting called more often than
they need to be, but since I am using singletons for the delegate
instances, this is harmless. I ran this and verified, after turning
on the EOAdaptorDebugEnabled flag, I get:
Sep 04 15:07:54 TreeFul[51162] DEBUG NSLog -
evaluateExpression:
<com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "INSERT
DELAYED INTO c_tree_closure(down, up, distance) VALUES (?, ?, ?)"
withBindings: 1:39(down), 2:39(up), 3:0(distance)>
eosqlexpression statement: INSERT DELAYED INTO
c_tree_closure(down, up, distance) VALUES (?, ?, ?)
Sep 04 15:07:54 TreeFul[51162] DEBUG NSLog -
evaluateExpression:
<com.webobjects.jdbcadaptor.MySQLPlugIn$MySQLExpression: "INSERT
DELAYED INTO c_tree_closure(down, up, distance) VALUES (?, ?, ?)"
withBindings: 1:39(down), 2:1(up), 3:1(distance)>
So, it does work. Anyway, good luck.
cheers - ray
_______________________________________________ Do
not post admin requests to the list. They will be
ignored. Webobjects-dev mailing list
(email@hidden) Help/Unsubscribe/Update
your Subscription: email@hidden
_______________________________________________ Do not post admin
requests to the list. They will be ignored. Webobjects-dev mailing
list
(email@hidden) Help/Unsubscribe/Update your
email sent to email@hidden
|