Changeset: ef11e287362e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ef11e287362e
Modified Files:
        clients/mapilib/msettings.c
        clients/mapilib/msettings.h
        clients/odbc/driver/ODBCDbc.c
Branch: odbc-tls
Log Message:

Use ODBC attr names in ODBC errors


diffs (135 lines):

diff --git a/clients/mapilib/msettings.c b/clients/mapilib/msettings.c
--- a/clients/mapilib/msettings.c
+++ b/clients/mapilib/msettings.c
@@ -232,6 +232,8 @@ struct msettings {
        char *unix_sock_name_buffer;
        char certhash_digits_buffer[64 + 2 + 1]; // fit more than required plus 
trailing '\0'
        bool validated;
+       const char* (*localizer)(const void *data, mparm parm);
+       void *localizer_data;
        char error_message[256];
 };
 
@@ -356,6 +358,22 @@ format_error(msettings *mp, const char *
        return mp->error_message;
 }
 
+const char *msetting_parm_name(const msettings *mp, mparm parm)
+{
+       const char *localized = NULL;
+       if (mp->localizer)
+               localized = (mp->localizer)(mp->localizer_data, parm);
+       return localized ? localized : mparm_name(parm);
+}
+
+void msettings_set_localizer(msettings *mp, const char* (*localizer)(const 
void *data, mparm parm), void *data)
+{
+       mp->localizer = localizer;
+       mp->localizer_data = data;
+}
+
+
+
 const char*
 msetting_string(const msettings *mp, mparm parm)
 {
@@ -492,15 +510,15 @@ msetting_parse(msettings *mp, mparm parm
                case MPCLASS_BOOL:
                        b = msetting_parse_bool(text);
                        if (b < 0)
-                               return format_error(mp, "%s: invalid boolean 
value", mparm_name(parm));
+                               return format_error(mp, "%s: invalid boolean 
value", msetting_parm_name(mp, parm));
                        return msetting_set_bool(mp, parm, b);
                case MPCLASS_LONG:
                        if (text[0] == '\0')
-                               return format_error(mp, "%s: integer parameter 
cannot be empty string", mparm_name(parm));
+                               return format_error(mp, "%s: integer parameter 
cannot be empty string", msetting_parm_name(mp, parm));
                        char *end;
                        long l = strtol(text, &end, 10);
                        if (*end != '\0')
-                               return format_error(mp, "%s: invalid integer", 
mparm_name(parm));
+                               return format_error(mp, "%s: invalid integer", 
msetting_parm_name(mp, parm));
                        return msetting_set_long(mp, parm, l);
                case MPCLASS_STRING:
                        return msetting_set_string(mp, parm, text);
@@ -574,7 +592,7 @@ msetting_set_named(msettings *mp, bool a
                return msetting_set_ignored(mp, key, value);
 
        if (!allow_core && mparm_is_core(parm))
-               return format_error(mp, "%s: parameter not allowed here", 
mparm_name(parm));
+               return format_error(mp, "%s: parameter not allowed here", 
msetting_parm_name(mp, parm));
 
        return msetting_parse(mp, parm, value);
 }
@@ -607,7 +625,7 @@ validate_certhash(msettings *mp)
        if (strncmp(certhash, "sha256:", 7) == 0) {
                certhash += 7;
        } else {
-               return "certhash: expected to start with 'sha256:'";
+               return format_error(mp, "%s: expected to start with 'sha256:'", 
msetting_parm_name(mp, MP_CERTHASH));
        }
 
        size_t i = 0;
@@ -615,13 +633,13 @@ validate_certhash(msettings *mp)
                if (*r == ':')
                        continue;
                if (!isxdigit(*r))
-                       return "certhash: invalid hex digit";
+                       return format_error(mp, "%s: invalid hex digit", 
msetting_parm_name(mp, MP_CERTHASH));
                if (i < sizeof(mp->certhash_digits_buffer) - 1)
                        mp->certhash_digits_buffer[i++] = tolower(*r);
        }
        mp->certhash_digits_buffer[i] = '\0';
        if (i == 0)
-               return "certhash: need at least one digit";
+               return format_error(mp, "%s: need at least one digit", 
msetting_parm_name(mp, MP_CERTHASH));
 
        return NULL;
 }
diff --git a/clients/mapilib/msettings.h b/clients/mapilib/msettings.h
--- a/clients/mapilib/msettings.h
+++ b/clients/mapilib/msettings.h
@@ -131,6 +131,9 @@ mapi_export const msettings *msettings_d
 /* always returns NULL */
 mapi_export msettings *msettings_destroy(msettings *mp);
 
+mapi_export const char *msetting_parm_name(const msettings *mp, mparm parm);
+mapi_export void msettings_set_localizer(msettings *mp, const char* 
(*localizer)(const void *data, mparm parm), void *data);
+
 /* retrieve and set; call abort() on type error */
 
 mapi_export const char* msetting_string(const msettings *mp, mparm parm);
diff --git a/clients/odbc/driver/ODBCDbc.c b/clients/odbc/driver/ODBCDbc.c
--- a/clients/odbc/driver/ODBCDbc.c
+++ b/clients/odbc/driver/ODBCDbc.c
@@ -34,9 +34,21 @@
 
 #include "ODBCGlobal.h"
 #include "ODBCDbc.h"
+#include "ODBCAttrs.h"
 
 #define ODBC_DBC_MAGIC_NR  1365        /* for internal sanity check only */
 
+static const char*
+parm_localizer(const void *data, mparm parm)
+{
+       (void)data;
+       for (int i = 0; i < attr_setting_count; i++) {
+               const struct attr_setting *entry = &attr_settings[i];
+               if (entry->parm == parm)
+                       return entry->name;
+       }
+       return NULL;
+}
 
 /*
  * Creates a new allocated ODBCDbc object and initializes it.
@@ -63,6 +75,8 @@ newODBCDbc(ODBCEnv *env)
                return NULL;
        }
 
+       msettings_set_localizer(settings, parm_localizer, NULL);
+
        *dbc = (ODBCDbc) {
                .Env = env,
                .settings = settings,
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to