Added function yaz_oid_add which adds custom OID entry to database.
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 12 Apr 2007 20:47:27 +0000 (20:47 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 12 Apr 2007 20:47:27 +0000 (20:47 +0000)
Re-implemented 'register_oid' for yaz-client.

client/client.c
include/yaz/oid_db.h
include/yaz/oid_util.h
src/odr_util.c
src/oid_db.c
src/oid_util.c
src/retrieval.c
src/seshigh.c

index 59a70c2..b091b31 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: client.c,v 1.332 2007-04-12 13:52:57 adam Exp $
+ * $Id: client.c,v 1.333 2007-04-12 20:47:27 adam Exp $
  */
 /** \file client.c
  *  \brief yaz-client program
@@ -3607,7 +3607,6 @@ int cmd_set_marcdump(const char* arg)
     return 1;
 }
 
-#if 0
 /* 
    this command takes 3 arge {name class oid} 
 */
@@ -3634,12 +3633,10 @@ int cmd_register_oid(const char* args) {
         {0,(enum oid_class) 0}
     };
     char oname_str[101], oclass_str[101], oid_str[101];  
-    char* name;
     int i;
-    oid_class oidclass = CLASS_GENERAL;
-    int val = 0, oid[OID_SIZE];
-    struct oident * new_oident=NULL;
-    
+    int oidclass = CLASS_GENERAL;
+    int oid[OID_SIZE];
+
     if (sscanf (args, "%100[^ ] %100[^ ] %100s",
                 oname_str,oclass_str, oid_str) < 1) {
         printf("Error in register command \n");
@@ -3659,35 +3656,15 @@ int cmd_register_oid(const char* args) {
         return 0;
     }
     
-    i = 0;
-    name = oid_str;
-    val = 0;
-    
-    while (isdigit (*(unsigned char *) name))
-    {
-        val = val*10 + (*name - '0');
-        name++;
-        if (*name == '.')
-        {
-            if (i < OID_SIZE-1)
-                oid[i++] = val;
-            val = 0;
-            name++;
-        }
-    }
-    oid[i] = val;
-    oid[i+1] = -1;
-    
-    new_oident = oid_addent (oid, PROTO_GENERAL, oidclass, oname_str,
-                             VAL_DYNAMIC);  
-    if(strcmp(new_oident->desc,oname_str))
+    oid_dotstring_to_oid(oid_str, oid);
+
+    if (yaz_oid_add(yaz_oid_std(), oidclass, oname_str, oid))
     {
-        fprintf(stderr,"oid is already named as %s, registration failed\n",
-                new_oident->desc);
+        printf("oid %s already exists, registration failed\n",
+               oname_str);
     }
     return 1;  
 }
-#endif
 
 int cmd_push_command(const char* arg) 
 {
@@ -4421,9 +4398,7 @@ static struct {
     {"set_auto_wait", cmd_set_auto_wait," on|off",complete_auto_reconnect,1,NULL},
     {"set_otherinfo", cmd_set_otherinfo,"<otherinfoinddex> <oid> <string>",NULL,0,NULL},
     {"sleep", cmd_sleep,"<seconds>",NULL,0,NULL},
-#if 0
     {"register_oid", cmd_register_oid,"<name> <class> <oid>",NULL,0,NULL},
-#endif
     {"push_command", cmd_push_command,"<command>",command_generator,0,NULL},
     {"register_tab", cmd_register_tab,"<commandname> <tab>",command_generator,0,NULL},
     {"cclparse", cmd_cclparse,"<ccl find command>",NULL,0,NULL},
index 094a1f4..0903b23 100644 (file)
@@ -24,7 +24,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/* $Id: oid_db.h,v 1.1 2007-04-12 13:52:57 adam Exp $ */
+/* $Id: oid_db.h,v 1.2 2007-04-12 20:47:27 adam Exp $ */
 
 /**
  * \file oid_db.h
@@ -40,7 +40,7 @@
 YAZ_BEGIN_CDECL
 
 /** \brief OID database */
-typedef struct yaz_oid_entry *yaz_oid_db_t;
+typedef struct yaz_oid_db *yaz_oid_db_t;
 
 /** \brief returns standard OID database 
     \retval OID database handle
@@ -124,6 +124,18 @@ YAZ_EXPORT void yaz_oid_trav(yaz_oid_db_t oid_db,
 YAZ_EXPORT
 int yaz_oid_is_iso2709(const int *oid);
 
+/** \brief adds new OID entry to database
+    \param oid_db database
+    \param oclass OID class
+    \param name name of OID
+    \param new_oid OID value (raw OID)
+    \retval 0 OID added
+    \retval -1 OID name+oclass already exists
+*/
+YAZ_EXPORT
+int yaz_oid_add(yaz_oid_db_t oid_db, int oclass, const char *name,
+                const int *new_oid);
+
 #define OID_STR_BIB1 "Bib-1"
 #define OID_STR_DIAG1 "Diag-1"
 #define OID_STR_USMARC "USmarc"
index d0b85b6..3dafc0d 100644 (file)
@@ -24,7 +24,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/* $Id: oid_util.h,v 1.1 2007-04-12 13:52:57 adam Exp $ */
+/* $Id: oid_util.h,v 1.2 2007-04-12 20:47:27 adam Exp $ */
 
 /**
  * \file oid_util.h
@@ -79,7 +79,9 @@ YAZ_EXPORT void oid_oidcpy(int *t, const int *s);
 YAZ_EXPORT void oid_oidcat(int *t, const int *s);
 YAZ_EXPORT int oid_oidcmp(const int *o1, const int *o2);
 YAZ_EXPORT int oid_oidlen(const int *o);
-YAZ_EXPORT char *oid_to_dotstring(const int *oid, char *oidbuf);
+YAZ_EXPORT char *oid_oid_to_dotstring(const int *oid, char *oidbuf);
+YAZ_EXPORT int oid_dotstring_to_oid(const char *name, int *oid);
+
 YAZ_END_CDECL
 
 #endif
index c50ac55..c28c586 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: odr_util.c,v 1.11 2007-04-12 13:52:57 adam Exp $
+ * $Id: odr_util.c,v 1.12 2007-04-12 20:47:28 adam Exp $
  */
 /**
  * \file odr_util.c
@@ -63,20 +63,13 @@ Odr_oid *odr_oiddup(ODR odr, const Odr_oid *o)
 
 Odr_oid *odr_getoidbystr_nmem(NMEM nmem, const char *str)
 {
-    int num = 1, i = 0;
-    const char *p = str;
-    Odr_oid *ret;
+    int oid[OID_SIZE];
+    int *ret;
 
-    if (!isdigit(*(const unsigned char *) str))
+    if (oid_dotstring_to_oid(str, oid))
         return 0;
-    while ((p = strchr(p, '.')))
-        num++, p++;
-    ret = (int *)nmem_malloc(nmem, sizeof(*ret)*(num + 1));
-    p = str;
-    do
-        ret[i++] = atoi(p);
-    while ((p = strchr(p, '.')) && *++p);
-    ret[i] = -1;
+    ret = (int *)nmem_malloc(nmem, sizeof(*ret)*(oid_oidlen(oid) + 1));
+    oid_oidcpy(ret, oid);
     return ret;
 }
 
index 1c5448b..f809530 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: oid_db.c,v 1.1 2007-04-12 13:52:57 adam Exp $
+ * $Id: oid_db.c,v 1.2 2007-04-12 20:47:28 adam Exp $
  */
 
 /**
 
 struct yaz_oid_entry {
     int oclass;
-    int oid[10];
+    int oid[OID_SIZE];
     char *name;
 };
 
 #define Z3950_PREFIX 1, 2, 840, 10003
 
-static struct yaz_oid_entry standard_oids[] =
+static struct yaz_oid_entry standard_list[] =
 {
     /* General definitions */
     {CLASS_TRANSYN, {2, 1, 1,-1}, "BER" },
     {CLASS_TRANSYN, {1, 0, 2709, 1, 1,-1},  "ISO2709"},
     {CLASS_GENERAL, {1, 0, 10161, 2, 1,-1},  OID_STR_ILL_1 },
-    {CLASS_ABSYN, {2, 1,-1}, "Z-APDU"}, 
+    {CLASS_ABSYN,  {2, 1,-1}, "Z-APDU"}, 
     {CLASS_APPCTX, {1, 1,-1}, "Z-BASIC"},
     {CLASS_ATTSET, {Z3950_PREFIX, 3, 1,-1}, "Bib-1"},
     {CLASS_ATTSET, {Z3950_PREFIX, 3, 2,-1}, "Exp-1"},
@@ -58,254 +58,153 @@ static struct yaz_oid_entry standard_oids[] =
     {CLASS_ATTSET, {Z3950_PREFIX, 3, 18,-1}, "Bib-2"},
     {CLASS_ATTSET, {Z3950_PREFIX, 3, 19,-1}, "ZeeRex"},
     /* New applications should use Zthes-1 instead of this Satan-spawn */
-    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,1,-1},
-     "Thesaurus-attset"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,2,-1},
-     "IDXPATH"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,3,-1},
-     "EXTLITE"},
-    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 1,-1},
-     OID_STR_BIB1},
-    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 2,-1},
-     OID_STR_DIAG1},
-    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 3,-1},
-     "Diag-ES"},
-    {CLASS_DIAGSET,  {Z3950_PREFIX, 4, 3,-1},
-     "Diag-General"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 1,-1},
-     "Unimarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 2,-1},
-     "Intermarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 3,-1},
-     "CCF"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1},
-     OID_STR_USMARC},
+    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,1,-1}, "Thesaurus-attset"},
+    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,2,-1}, "IDXPATH"},
+    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,3,-1}, "EXTLITE"},
+    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 1,-1}, OID_STR_BIB1},
+    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 2,-1}, OID_STR_DIAG1},
+    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 3,-1}, "Diag-ES"},
+    {CLASS_DIAGSET,  {Z3950_PREFIX, 4, 3,-1}, "Diag-General"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 1,-1}, "Unimarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 2,-1}, "Intermarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 3,-1}, "CCF"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1}, OID_STR_USMARC},
     /* MARC21 is just an alias for the original USmarc */
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1},
-     "MARC21"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 11,-1},
-     "UKmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 12,-1},
-     "Normarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 13,-1},
-     "Librismarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 14,-1},
-     "Danmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 15,-1},
-     "Finmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 16,-1},
-     "MAB"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 17,-1},
-     "Canmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 18,-1},
-     "SBN"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 19,-1},
-     "Picamarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 20,-1},
-     "Ausmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 21,-1},
-     "Ibermarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 22,-1},
-     "Carmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 23,-1},
-     "Malmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 24,-1},
-     "JPmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 25,-1},
-     "SWEmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 26,-1},
-     "SIGLEmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 27,-1},
-     "ISDSmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 28,-1},
-     "RUSmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 29,-1},
-     "Hunmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 30,-1},
-     "NACSIS-CATP"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 31,-1},
-     "FINMARC2000"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 32,-1},
-     "MARC21-fin"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 100,-1},
-     OID_STR_EXPLAIN},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 101,-1},
-     OID_STR_SUTRS},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 102,-1},
-     OID_STR_OPAC},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 103,-1},
-     OID_STR_SUMMARY},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 104,-1},
-     "GRS-0"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 105,-1},
-     OID_STR_GRS1 },
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 106,-1},
-     OID_STR_EXTENDED},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 107,-1},
-     "Fragment"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,1,-1},
-     "pdf"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,2,-1},
-     OID_STR_POSTSCRIPT},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,3,-1},
-     OID_STR_HTML},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,4,-1},
-     "tiff"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,5,-1},
-     "gif"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,6,-1},
-     "jpeg"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,7,-1},
-     "png"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,8,-1},
-     "mpeg"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,9,-1},
-     "sgml"},
-
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,1,-1},
-     "tiff-b"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,2,-1},
-     "wav"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1}, "MARC21"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 11,-1}, "UKmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 12,-1}, "Normarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 13,-1}, "Librismarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 14,-1}, "Danmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 15,-1}, "Finmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 16,-1}, "MAB"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 17,-1}, "Canmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 18,-1}, "SBN"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 19,-1}, "Picamarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 20,-1}, "Ausmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 21,-1}, "Ibermarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 22,-1}, "Carmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 23,-1}, "Malmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 24,-1}, "JPmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 25,-1}, "SWEmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 26,-1}, "SIGLEmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 27,-1}, "ISDSmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 28,-1}, "RUSmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 29,-1}, "Hunmarc"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 30,-1}, "NACSIS-CATP"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 31,-1}, "FINMARC2000"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 32,-1}, "MARC21-fin"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 100,-1}, OID_STR_EXPLAIN},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 101,-1}, OID_STR_SUTRS},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 102,-1}, OID_STR_OPAC},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 103,-1}, OID_STR_SUMMARY},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 104,-1}, "GRS-0"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 105,-1}, OID_STR_GRS1 },
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 106,-1}, OID_STR_EXTENDED},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 107,-1}, "Fragment"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,1,-1}, "pdf"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,2,-1}, OID_STR_POSTSCRIPT},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,3,-1}, OID_STR_HTML},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,4,-1}, "tiff"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,5,-1}, "gif"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,6,-1}, "jpeg"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,7,-1}, "png"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,8,-1}, "mpeg"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,9,-1}, "sgml"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,1,-1}, "tiff-b"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,2,-1}, "wav"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 111,-1}, "SQL-RS"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 1000, 81, 2,-1}, OID_STR_SOIF},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1}, OID_STR_XML },
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1}, "application-XML"},
+    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 11,-1}, OID_STR_APPLICATION_XML },
+    {CLASS_RESFORM, {Z3950_PREFIX, 7, 1,-1}, "Resource-1"},
+    {CLASS_RESFORM, {Z3950_PREFIX, 7, 2,-1}, "Resource-2"},
+    {CLASS_RESFORM, {Z3950_PREFIX, 7, 1000, 81, 1,-1}, "UNIverse-Resource-Report"},
+    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 1,-1}, "Prompt-1"},
+    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 2,-1}, "Des-1"},
+    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 3,-1}, "Krb-1"},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1,-1}, "Pers. set"},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 2,-1}, "Pers. query"},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 3,-1}, "Per'd query"},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 4,-1},  OID_STR_ITEMORDER },
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,-1}, "DB. Update (first version)"},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,1,-1}, "DB. Update (second version)"},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5, 1, 1,-1}, OID_STR_EXT_UPDATE},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 6,-1}, "exp. spec."},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 7,-1}, "exp. inv."},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1000, 81, 1,-1}, OID_STR_ADMIN},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1,-1}, "searchResult-1"},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 2,-1}, "CharSetandLanguageNegotiation"},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 3,-1},  OID_STR_USERINFO_1},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 4,-1}, "MultipleSearchTerms-1"},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 5,-1}, "MultipleSearchTerms-2"},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 6,-1}, "DateTime"},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 1,-1}, OID_STR_PROXY},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 2,-1}, OID_STR_COOKIE},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 3,-1},  OID_STR_CLIENT_IP },
+    {CLASS_ELEMSPEC, {1, 2, 840, 1003, 11, 1,-1}, "Espec-1"},
+    {CLASS_VARSET, {Z3950_PREFIX, 12, 1,-1}, "Variant-1"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1,-1}, "WAIS-schema"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 2,-1}, "GILS-schema"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 3,-1}, "Collections-schema"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 4,-1}, "Geo-schema"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 5,-1}, "CIMI-schema"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 6,-1}, "Update ES"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 7,-1}, "Holdings"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 8,-1}, "Zthes"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 1,-1}, "thesaurus-schema"},
+    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 2,-1}, "Explain-schema"},
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1,-1}, "TagsetM"},
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 2,-1}, "TagsetG"},
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 3,-1}, "STAS-tagset"},
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 4,-1}, "GILS-tagset"},
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 5,-1}, "Collections-tagset"},
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 6,-1}, "CIMI-tagset"},
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 1,-1}, "thesaurus-tagset"}, 
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 2,-1}, "Explain-tagset"},
+    {CLASS_TAGSET, {Z3950_PREFIX, 14, 8,-1}, "Zthes-tagset"},
+    {CLASS_NEGOT, {Z3950_PREFIX, 15, 3,-1}, OID_STR_CHARNEG_3 },
+    {CLASS_NEGOT, {Z3950_PREFIX, 15, 4,-1}, OID_STR_CHARNEG_4 },
+    {CLASS_NEGOT, {Z3950_PREFIX, 15, 1000, 81, 1, -1}, OID_STR_ID_CHARSET },
+    {CLASS_USERINFO, {1, 2, 840, 1003, 16,  2, -1}, "CQL"},
+    {CLASS_GENERAL, {1,0,10646,1,0,2,-1}, "UCS-2"},
+    {CLASS_GENERAL, {1,0,10646,1,0,4,-1}, "UCS-4"},
+    {CLASS_GENERAL, {1,0,10646,1,0,5,-1}, "UTF-16"},
+    {CLASS_GENERAL, {1,0,10646,1,0,8,-1}, "UTF-8"},
+    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 17, 1, -1}, "OCLC-userInfo"},
+    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1000,105,4,-1}, OID_STR_XMLES },
+    {CLASS_NOP, {-1}, 0}
+};
 
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 111,-1},
-     "SQL-RS"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 1000, 81, 2,-1},
-     OID_STR_SOIF},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1},
-     OID_STR_XML },
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1},
-     "application-XML"},
-    {CLASS_RECSYN,   {Z3950_PREFIX, 5, 109, 11,-1},
-     OID_STR_APPLICATION_XML },
-    {CLASS_RESFORM, {Z3950_PREFIX, 7, 1,-1},
-     "Resource-1"},
-    {CLASS_RESFORM, {Z3950_PREFIX, 7, 2,-1},
-     "Resource-2"},
-    {CLASS_RESFORM,  {Z3950_PREFIX, 7, 1000, 81, 1,-1},
-     "UNIverse-Resource-Report"},
+struct yaz_oid_db {
+    struct yaz_oid_entry *entries;
+    struct yaz_oid_db *next;
+    int xmalloced;
+};
 
-    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 1,-1},
-     "Prompt-1"},
-    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 2,-1},
-     "Des-1"},
-    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 3,-1},
-     "Krb-1"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1,-1},
-     "Pers. set"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 2,-1},
-     "Pers. query"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 3,-1},
-     "Per'd query"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 4,-1},
-     OID_STR_ITEMORDER },
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,-1},
-     "DB. Update (first version)"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,1,-1},
-     "DB. Update (second version)"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5, 1, 1,-1},
-     OID_STR_EXT_UPDATE},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 6,-1},
-     "exp. spec."},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 7,-1},
-     "exp. inv."},
-    {CLASS_EXTSERV,  {Z3950_PREFIX, 9, 1000, 81, 1,-1},
-     OID_STR_ADMIN},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1,-1},
-     "searchResult-1"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 2,-1},
-     "CharSetandLanguageNegotiation"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 3,-1},
-     OID_STR_USERINFO_1},
-    {CLASS_USERINFO,   {Z3950_PREFIX, 10, 4,-1},
-     "MultipleSearchTerms-1"},
-    {CLASS_USERINFO,   {Z3950_PREFIX, 10, 5,-1},
-     "MultipleSearchTerms-2"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 6,-1},
-     "DateTime"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 1,-1},
-     OID_STR_PROXY},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 2,-1},
-     OID_STR_COOKIE},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 3,-1},
-     OID_STR_CLIENT_IP },
-    {CLASS_ELEMSPEC, {1, 2, 840, 1003, 11, 1,-1},
-     "Espec-1"},
-    {CLASS_VARSET, {Z3950_PREFIX, 12, 1,-1},
-     "Variant-1"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1,-1},
-     "WAIS-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 2,-1},
-     "GILS-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 3,-1},
-     "Collections-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 4,-1},
-     "Geo-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 5,-1},
-     "CIMI-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 6,-1},
-     "Update ES"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 7,-1},
-     "Holdings"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 8,-1},
-     "Zthes"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 1,-1},
-     "thesaurus-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 2,-1},
-     "Explain-schema"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1,-1},
-     "TagsetM"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 2,-1},
-     "TagsetG"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 3,-1},
-     "STAS-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 4,-1},
-     "GILS-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 5,-1},
-     "Collections-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 6,-1},
-     "CIMI-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 1,-1},
-     "thesaurus-tagset"}, 
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 2,-1},
-     "Explain-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 8,-1},
-     "Zthes-tagset"},
-    {CLASS_NEGOT, {Z3950_PREFIX, 15, 3,-1},
-     OID_STR_CHARNEG_3 },
-    {CLASS_NEGOT, {Z3950_PREFIX, 15, 4,-1},
-     OID_STR_CHARNEG_4 },
-    {CLASS_NEGOT, {Z3950_PREFIX, 15, 1000, 81,1,-1},
-     OID_STR_ID_CHARSET },
-    {CLASS_USERINFO, {1, 2, 840, 1003, 16,  2, -1},
-     "CQL"},
-    {CLASS_GENERAL, {1,0,10646,1,0,2,-1},
-     "UCS-2"},
-    {CLASS_GENERAL, {1,0,10646,1,0,4,-1},
-     "UCS-4"},
-    {CLASS_GENERAL, {1,0,10646,1,0,5,-1},
-     "UTF-16"},
-    {CLASS_GENERAL, {1,0,10646,1,0,8,-1},
-     "UTF-8"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 17, 1, -1},
-     "OCLC-userInfo"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1000,105,4,-1},
-     OID_STR_XMLES },
-    {CLASS_NOP, {-1}, 0}
+struct yaz_oid_db standard_db_l = {
+    standard_list, 0, 0
 };
 
+yaz_oid_db_t standard_db = &standard_db_l;
+
 yaz_oid_db_t yaz_oid_std(void)
 {
-    return standard_oids;
+    return standard_db;
 }
 
-const int *yaz_string_to_oid(yaz_oid_db_t oid_list,
+const int *yaz_string_to_oid(yaz_oid_db_t oid_db,
                             int oclass, const char *name)
 {
-    for (; oid_list->name; oid_list++)
+    for (; oid_db; oid_db = oid_db->next)
     {
-       if (!yaz_matchstr(oid_list->name, name)
-           && (oclass == CLASS_GENERAL || oclass == oid_list->oclass))
-           return oid_list->oid;
+       struct yaz_oid_entry *e = oid_db->entries;
+       for (; e->name; e++)
+       {
+           if (!yaz_matchstr(e->name, name)
+               && (oclass == CLASS_GENERAL || oclass == e->oclass))
+               return e->oid;
+       }
     }
     return 0;
 }
@@ -325,18 +224,22 @@ int *yaz_string_to_oid_odr(yaz_oid_db_t oid_list,
     return yaz_string_to_oid_nmem(oid_list, oclass, name, odr_getmem(o));
 }
 
-const char *yaz_oid_to_string(yaz_oid_db_t oid_list,
+const char *yaz_oid_to_string(yaz_oid_db_t oid_db,
                              const int *oid, int *oclass)
 {
     if (!oid)
        return 0;
-    for (; oid_list->name; oid_list++)
+    for (; oid_db; oid_db = oid_db->next)
     {
-       if (!oid_oidcmp(oid_list->oid, oid))
+       struct yaz_oid_entry *e = oid_db->entries;
+       for (; e->name; e++)
        {
-           if (oclass)
-               *oclass = oid_list->oclass;
-           return oid_list->name;
+           if (!oid_oidcmp(e->oid, oid))
+           {
+               if (oclass)
+                   *oclass = e->oclass;
+               return e->name;
+           }
        }
     }
     return 0;
@@ -344,12 +247,12 @@ const char *yaz_oid_to_string(yaz_oid_db_t oid_list,
 
 const char *yaz_oid_to_string_buf(const int *oid, int *oclass, char *buf)
 {
-    const char *p = yaz_oid_to_string(standard_oids, oid, oclass);
+    const char *p = yaz_oid_to_string(standard_db, oid, oclass);
     if (p)
        return p;
     if (oclass)
        *oclass = CLASS_GENERAL;
-    return oid_to_dotstring(oid, buf);
+    return oid_oid_to_dotstring(oid, buf);
 }
 
 int yaz_oid_is_iso2709(const int *oid)
@@ -361,13 +264,72 @@ int yaz_oid_is_iso2709(const int *oid)
     return 0;
 }
 
-void yaz_oid_trav(yaz_oid_db_t oid_list,
+int yaz_oid_add(yaz_oid_db_t oid_db, int oclass, const char *name,
+               const int *new_oid)
+{
+    const int *oid = yaz_string_to_oid(oid_db, oclass, name);
+    if (!oid)
+    {
+       struct yaz_oid_entry *ent;
+
+       while (oid_db->next)
+           oid_db = oid_db->next;
+       oid_db->next = xmalloc(sizeof(*oid_db->next));
+       oid_db = oid_db->next;
+
+       oid_db->next = 0;
+       oid_db->xmalloced = 1;
+       oid_db->entries = ent = xmalloc(2 * sizeof(*ent));
+       ent[0].oclass = oclass;
+       oid_oidcpy(ent[0].oid, new_oid);
+       ent[0].name = xstrdup(name);
+       ent[1].oclass = CLASS_NOP;
+       ent[1].oid[0] = -1;
+       ent[1].name = 0;
+       return 0;
+    }
+    return -1;
+}
+
+yaz_oid_db_t yaz_oid_db_new(void)
+{
+    yaz_oid_db_t p = xmalloc(sizeof(*p));
+    p->entries = 0;
+    p->next = 0;
+    p->xmalloced = 1;
+    return p;
+}
+
+void yaz_oid_db_destroy(yaz_oid_db_t oid_db)
+{
+    while (oid_db)
+    {
+       yaz_oid_db_t p = oid_db;
+
+       oid_db = oid_db->next;
+       if (p->xmalloced)
+       {
+           struct yaz_oid_entry *e = p->entries;
+           for (; e->name; e++)
+               xfree (e->name);
+           xfree(p->entries);
+           xfree(p);
+       }
+    }
+}
+
+void yaz_oid_trav(yaz_oid_db_t oid_db,
                  void (*func)(const int *oid,
                               int oclass, const char *name,
                               void *client_data),
                  void *client_data)
 {
-    for (; oid_list->name; oid_list++)
-       func(oid_list->oid, oid_list->oclass, oid_list->name, client_data);
+    for (; oid_db; oid_db = oid_db->next)
+    {
+       struct yaz_oid_entry *e = oid_db->entries;
+       
+       for (; e->name; e++)
+           func(e->oid, e->oclass, e->name, client_data);
+    }
 }
 
index fc62f51..7523158 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: oid_util.c,v 1.1 2007-04-12 13:52:57 adam Exp $
+ * $Id: oid_util.c,v 1.2 2007-04-12 20:47:28 adam Exp $
  */
 
 /**
@@ -58,7 +58,7 @@ int oid_oidlen(const int *o)
 }
 
 
-char *oid_to_dotstring(const int *oid, char *oidbuf)
+char *oid_oid_to_dotstring(const int *oid, char *oidbuf)
 {
     char tmpbuf[20];
     int i;
@@ -74,6 +74,27 @@ char *oid_to_dotstring(const int *oid, char *oidbuf)
     return oidbuf;
 }
 
+int oid_dotstring_to_oid(const char *name, int *oid)
+{
+    int i = 0;
+    int val = 0;
+    while (isdigit (*(unsigned char *) name))
+    {
+        val = val*10 + (*name - '0');
+        name++;
+        if (*name == '.')
+        {
+            if (i < OID_SIZE-1)
+                oid[i++] = val;
+            val = 0;
+            name++;
+        }
+    }
+    oid[i] = val;
+    oid[i+1] = -1;
+    return 0;
+}
+
 /*
  * Local variables:
  * c-basic-offset: 4
index 7f0b17d..4ee7ad1 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 2005-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: retrieval.c,v 1.18 2007-04-12 13:52:57 adam Exp $
+ * $Id: retrieval.c,v 1.19 2007-04-12 20:47:28 adam Exp $
  */
 /**
  * \file retrieval.c
@@ -344,7 +344,7 @@ int yaz_retrieval_request(yaz_retrieval_t p,
     if (!syntax_matches && syntax)
     {
         char buf[OID_STR_MAX];
-        wrbuf_printf(p->wr_error, "%s", oid_to_dotstring(syntax, buf));
+        wrbuf_printf(p->wr_error, "%s", oid_oid_to_dotstring(syntax, buf));
         return 2;
     }
     if (schema)
index 5b2ecf6..8ac8a69 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: seshigh.c,v 1.113 2007-04-12 13:52:57 adam Exp $
+ * $Id: seshigh.c,v 1.114 2007-04-12 20:47:28 adam Exp $
  */
 /**
  * \file seshigh.c
@@ -625,7 +625,7 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr)
             if (input_syntax_raw)
             {
                 char oidbuf[OID_STR_MAX];
-                oid_to_dotstring(input_syntax_raw, oidbuf);
+                oid_oid_to_dotstring(input_syntax_raw, oidbuf);
                 rr->errstring = odr_strdup(rr->stream, oidbuf);
             }
             return -1;
@@ -2344,7 +2344,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
                 assoc->init->implementation_name,
                 odr_prepend(assoc->encode, "GFS", resp->implementationName));
 
-    version = odr_strdup(assoc->encode, "$Revision: 1.113 $");
+    version = odr_strdup(assoc->encode, "$Revision: 1.114 $");
     if (strlen(version) > 10)   /* check for unexpanded CVS strings */
         version[strlen(version)-2] = '\0';
     resp->implementationVersion = odr_prepend(assoc->encode,