-/*
- * Copyright (C) 1995-2007, Index Data ApS
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2013 Index Data
* See the file LICENSE for details.
- *
- * $Id: oid_db.c,v 1.1 2007-04-12 13:52:57 adam Exp $
*/
/**
+ * \file oid_db.c
* \brief OID Database
*/
#if HAVE_CONFIG_H
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
#include <yaz/yaz-util.h>
#include <yaz/odr.h>
#include <yaz/oid_util.h>
#include <yaz/oid_db.h>
-struct yaz_oid_entry {
- int oclass;
- int oid[10];
- char *name;
+struct yaz_oid_db {
+ struct yaz_oid_entry *entries;
+ struct yaz_oid_db *next;
+ int xmalloced;
};
-#define Z3950_PREFIX 1, 2, 840, 10003
-
-static struct yaz_oid_entry standard_oids[] =
-{
- /* 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_APPCTX, {1, 1,-1}, "Z-BASIC"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 1,-1}, "Bib-1"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 2,-1}, "Exp-1"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 3,-1}, "Ext-1"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 4,-1}, "CCL-1"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 5,-1}, "GILS"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 5,-1}, "GILS-attset"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 6,-1}, "STAS-attset"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 7,-1}, "Collections-attset"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 8,-1}, "CIMI-attset"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 9,-1}, "Geo-attset"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 10,-1}, "ZBIG"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 11,-1}, "Util"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 12,-1}, "XD-1"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 13,-1}, "Zthes"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 14,-1}, "Fin-1"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 15,-1}, "Dan-1"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 16,-1}, "Holdings"},
- {CLASS_ATTSET, {Z3950_PREFIX, 3, 17,-1}, "MARC"},
- {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},
- /* 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, 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}
+struct yaz_oid_db standard_db_l = {
+ 0, 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,
- int oclass, const char *name)
+#define get_entries(db) (db->xmalloced==0 ? yaz_oid_standard_entries : db->entries)
+
+const Odr_oid *yaz_string_to_oid(yaz_oid_db_t oid_db,
+ oid_class 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;
+ if (oclass != CLASS_GENERAL)
+ {
+ for (e = get_entries(oid_db); e->name; e++)
+ {
+ if (!yaz_matchstr(e->name, name) && oclass == e->oclass)
+ return e->oid;
+ }
+ }
+ for (e = get_entries(oid_db); e->name; e++)
+ {
+ if (!yaz_matchstr(e->name, name))
+ return e->oid;
+ }
}
return 0;
}
-int *yaz_string_to_oid_nmem(yaz_oid_db_t oid_list,
- int oclass, const char *name, NMEM nmem)
+Odr_oid *yaz_string_to_oid_nmem(yaz_oid_db_t oid_list,
+ oid_class oclass, const char *name, NMEM nmem)
{
- const int *oid = yaz_string_to_oid(oid_list, oclass, name);
+ const Odr_oid *oid = yaz_string_to_oid(oid_list, oclass, name);
if (oid)
return odr_oiddup_nmem(nmem, oid);
return odr_getoidbystr_nmem(nmem, name);
}
-int *yaz_string_to_oid_odr(yaz_oid_db_t oid_list,
- int oclass, const char *name, ODR o)
+Odr_oid *yaz_string_to_oid_odr(yaz_oid_db_t oid_list,
+ oid_class oclass, const char *name, ODR o)
{
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 int *oid, int *oclass)
+const char *yaz_oid_to_string(yaz_oid_db_t oid_db,
+ const Odr_oid *oid, oid_class *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 = get_entries(oid_db);
+ 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;
}
-const char *yaz_oid_to_string_buf(const int *oid, int *oclass, char *buf)
+const char *yaz_oid_to_string_buf(const Odr_oid *oid, oid_class *oclass, char *buf)
{
- const char *p = yaz_oid_to_string(standard_oids, oid, oclass);
+ const char *p = yaz_oid_to_string(yaz_oid_std(), 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)
+
+char *oid_name_to_dotstring(oid_class oclass, const char *name, char *oid_buf)
+{
+ const Odr_oid *oid = yaz_string_to_oid(yaz_oid_std(), oclass, name);
+ if (oid)
+ return oid_oid_to_dotstring(oid, oid_buf);
+ return 0;
+}
+
+
+int yaz_oid_is_iso2709(const Odr_oid *oid)
{
if (oid_oidlen(oid) == 6 && oid[0] == 1 && oid[1] == 2
- && oid[2] == 840 && oid[3] == 10003 && oid[4] == 5
+ && oid[2] == 840 && oid[3] == 10003 && oid[4] == 5
&& oid[5] <= 29 && oid[5] != 16)
return 1;
return 0;
}
-void yaz_oid_trav(yaz_oid_db_t oid_list,
- void (*func)(const int *oid,
- int oclass, const char *name,
+int yaz_oid_add(yaz_oid_db_t oid_db, oid_class oclass, const char *name,
+ const Odr_oid *new_oid)
+{
+ const Odr_oid *oid = yaz_string_to_oid(oid_db, oclass, name);
+ if (!oid)
+ {
+ struct yaz_oid_entry *ent;
+ Odr_oid *alloc_oid;
+
+ while (oid_db->next)
+ oid_db = oid_db->next;
+ oid_db->next = (struct yaz_oid_db *) xmalloc(sizeof(*oid_db->next));
+ oid_db = oid_db->next;
+
+ oid_db->next = 0;
+ oid_db->xmalloced = 1;
+ oid_db->entries = ent = (struct yaz_oid_entry *) xmalloc(2 * sizeof(*ent));
+
+ alloc_oid = (Odr_oid *)
+ xmalloc(sizeof(*alloc_oid) * (oid_oidlen(new_oid)+1));
+ oid_oidcpy(alloc_oid, new_oid);
+ ent[0].oid = alloc_oid;
+ ent[0].name = xstrdup(name);
+ ent[0].oclass = oclass;
+
+ ent[1].oid = 0;
+ ent[1].name = 0;
+ ent[1].oclass = CLASS_NOP;
+ return 0;
+ }
+ return -1;
+}
+
+yaz_oid_db_t yaz_oid_db_new(void)
+{
+ yaz_oid_db_t p = (yaz_oid_db_t) 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 Odr_oid *oid,
+ oid_class 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 = get_entries(oid_db);
+
+ for (; e->name; e++)
+ func(e->oid, e->oclass, e->name, client_data);
+ }
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+