From 8410fdace48ceb10f0cb9e84294d15a8f5adff9a Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Thu, 25 Jan 2018 16:58:33 -0500 Subject: [PATCH] LP#1745486: avoid retrieving user by id::numeric during auth init During open-ils.auth.authenticate.init, if looking up the user by barcode, the actor.usr row is subsequently fetched by ID. However, the ID was turned into a float, meaning that the query as sent to the database was equivalent to SELECT * FROM actor.usr WHERE id = 123.0000; While PostgreSQL will accept this, it ends up doing a sequential scan of the actor.usr table rather than an index lookup, making the retrieval up to two orders of magnitude slower than it needs to be and adding a couple percent unecessary I/O load on large, heavily used database. This patch fixes that. To test ------- [1] Turn on PostgreSQL statment logging and log in as a user by barcode. Note that there's a retrieval of actor.usr by a float form of the ID. [2] Apply the patch and repeat step 1. This time, the query retrieves the row by the integer form of the ID. Signed-off-by: Galen Charlton Signed-off-by: Bill Erickson --- Open-ILS/src/c-apps/oils_utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Open-ILS/src/c-apps/oils_utils.c b/Open-ILS/src/c-apps/oils_utils.c index 4074d9e430..5492dbf1ad 100644 --- a/Open-ILS/src/c-apps/oils_utils.c +++ b/Open-ILS/src/c-apps/oils_utils.c @@ -393,16 +393,16 @@ jsonObject* oilsUtilsFetchUserByBarcode(osrfMethodContext* ctx, const char* barc if(!card) return NULL; // No such card - // Get the user's id as a double + // Get the user's id as a long char* usr = oilsFMGetString(card, "usr"); jsonObjectFree(card); if(!usr) return NULL; // No user id (shouldn't happen) - double iusr = strtod(usr, NULL); + long iusr = strtol(usr, NULL, 10); free(usr); // Look up the user in actor.usr - params = jsonParseFmt("[%f]", iusr); + params = jsonParseFmt("[%d]", iusr); jsonObject* user = oilsUtilsQuickReqCtx( ctx, "open-ils.cstore", "open-ils.cstore.direct.actor.user.retrieve", params); -- 2.43.2