2 * Copyright (C) 1995-2007, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: oid_db.c,v 1.2 2007-04-12 20:47:28 adam Exp $
19 #include <yaz/yaz-util.h>
21 #include <yaz/oid_util.h>
22 #include <yaz/oid_db.h>
24 struct yaz_oid_entry {
30 #define Z3950_PREFIX 1, 2, 840, 10003
32 static struct yaz_oid_entry standard_list[] =
34 /* General definitions */
35 {CLASS_TRANSYN, {2, 1, 1,-1}, "BER" },
36 {CLASS_TRANSYN, {1, 0, 2709, 1, 1,-1}, "ISO2709"},
37 {CLASS_GENERAL, {1, 0, 10161, 2, 1,-1}, OID_STR_ILL_1 },
38 {CLASS_ABSYN, {2, 1,-1}, "Z-APDU"},
39 {CLASS_APPCTX, {1, 1,-1}, "Z-BASIC"},
40 {CLASS_ATTSET, {Z3950_PREFIX, 3, 1,-1}, "Bib-1"},
41 {CLASS_ATTSET, {Z3950_PREFIX, 3, 2,-1}, "Exp-1"},
42 {CLASS_ATTSET, {Z3950_PREFIX, 3, 3,-1}, "Ext-1"},
43 {CLASS_ATTSET, {Z3950_PREFIX, 3, 4,-1}, "CCL-1"},
44 {CLASS_ATTSET, {Z3950_PREFIX, 3, 5,-1}, "GILS"},
45 {CLASS_ATTSET, {Z3950_PREFIX, 3, 5,-1}, "GILS-attset"},
46 {CLASS_ATTSET, {Z3950_PREFIX, 3, 6,-1}, "STAS-attset"},
47 {CLASS_ATTSET, {Z3950_PREFIX, 3, 7,-1}, "Collections-attset"},
48 {CLASS_ATTSET, {Z3950_PREFIX, 3, 8,-1}, "CIMI-attset"},
49 {CLASS_ATTSET, {Z3950_PREFIX, 3, 9,-1}, "Geo-attset"},
50 {CLASS_ATTSET, {Z3950_PREFIX, 3, 10,-1}, "ZBIG"},
51 {CLASS_ATTSET, {Z3950_PREFIX, 3, 11,-1}, "Util"},
52 {CLASS_ATTSET, {Z3950_PREFIX, 3, 12,-1}, "XD-1"},
53 {CLASS_ATTSET, {Z3950_PREFIX, 3, 13,-1}, "Zthes"},
54 {CLASS_ATTSET, {Z3950_PREFIX, 3, 14,-1}, "Fin-1"},
55 {CLASS_ATTSET, {Z3950_PREFIX, 3, 15,-1}, "Dan-1"},
56 {CLASS_ATTSET, {Z3950_PREFIX, 3, 16,-1}, "Holdings"},
57 {CLASS_ATTSET, {Z3950_PREFIX, 3, 17,-1}, "MARC"},
58 {CLASS_ATTSET, {Z3950_PREFIX, 3, 18,-1}, "Bib-2"},
59 {CLASS_ATTSET, {Z3950_PREFIX, 3, 19,-1}, "ZeeRex"},
60 /* New applications should use Zthes-1 instead of this Satan-spawn */
61 {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,1,-1}, "Thesaurus-attset"},
62 {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,2,-1}, "IDXPATH"},
63 {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,3,-1}, "EXTLITE"},
64 {CLASS_DIAGSET, {Z3950_PREFIX, 4, 1,-1}, OID_STR_BIB1},
65 {CLASS_DIAGSET, {Z3950_PREFIX, 4, 2,-1}, OID_STR_DIAG1},
66 {CLASS_DIAGSET, {Z3950_PREFIX, 4, 3,-1}, "Diag-ES"},
67 {CLASS_DIAGSET, {Z3950_PREFIX, 4, 3,-1}, "Diag-General"},
68 {CLASS_RECSYN, {Z3950_PREFIX, 5, 1,-1}, "Unimarc"},
69 {CLASS_RECSYN, {Z3950_PREFIX, 5, 2,-1}, "Intermarc"},
70 {CLASS_RECSYN, {Z3950_PREFIX, 5, 3,-1}, "CCF"},
71 {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1}, OID_STR_USMARC},
72 /* MARC21 is just an alias for the original USmarc */
73 {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1}, "MARC21"},
74 {CLASS_RECSYN, {Z3950_PREFIX, 5, 11,-1}, "UKmarc"},
75 {CLASS_RECSYN, {Z3950_PREFIX, 5, 12,-1}, "Normarc"},
76 {CLASS_RECSYN, {Z3950_PREFIX, 5, 13,-1}, "Librismarc"},
77 {CLASS_RECSYN, {Z3950_PREFIX, 5, 14,-1}, "Danmarc"},
78 {CLASS_RECSYN, {Z3950_PREFIX, 5, 15,-1}, "Finmarc"},
79 {CLASS_RECSYN, {Z3950_PREFIX, 5, 16,-1}, "MAB"},
80 {CLASS_RECSYN, {Z3950_PREFIX, 5, 17,-1}, "Canmarc"},
81 {CLASS_RECSYN, {Z3950_PREFIX, 5, 18,-1}, "SBN"},
82 {CLASS_RECSYN, {Z3950_PREFIX, 5, 19,-1}, "Picamarc"},
83 {CLASS_RECSYN, {Z3950_PREFIX, 5, 20,-1}, "Ausmarc"},
84 {CLASS_RECSYN, {Z3950_PREFIX, 5, 21,-1}, "Ibermarc"},
85 {CLASS_RECSYN, {Z3950_PREFIX, 5, 22,-1}, "Carmarc"},
86 {CLASS_RECSYN, {Z3950_PREFIX, 5, 23,-1}, "Malmarc"},
87 {CLASS_RECSYN, {Z3950_PREFIX, 5, 24,-1}, "JPmarc"},
88 {CLASS_RECSYN, {Z3950_PREFIX, 5, 25,-1}, "SWEmarc"},
89 {CLASS_RECSYN, {Z3950_PREFIX, 5, 26,-1}, "SIGLEmarc"},
90 {CLASS_RECSYN, {Z3950_PREFIX, 5, 27,-1}, "ISDSmarc"},
91 {CLASS_RECSYN, {Z3950_PREFIX, 5, 28,-1}, "RUSmarc"},
92 {CLASS_RECSYN, {Z3950_PREFIX, 5, 29,-1}, "Hunmarc"},
93 {CLASS_RECSYN, {Z3950_PREFIX, 5, 30,-1}, "NACSIS-CATP"},
94 {CLASS_RECSYN, {Z3950_PREFIX, 5, 31,-1}, "FINMARC2000"},
95 {CLASS_RECSYN, {Z3950_PREFIX, 5, 32,-1}, "MARC21-fin"},
96 {CLASS_RECSYN, {Z3950_PREFIX, 5, 100,-1}, OID_STR_EXPLAIN},
97 {CLASS_RECSYN, {Z3950_PREFIX, 5, 101,-1}, OID_STR_SUTRS},
98 {CLASS_RECSYN, {Z3950_PREFIX, 5, 102,-1}, OID_STR_OPAC},
99 {CLASS_RECSYN, {Z3950_PREFIX, 5, 103,-1}, OID_STR_SUMMARY},
100 {CLASS_RECSYN, {Z3950_PREFIX, 5, 104,-1}, "GRS-0"},
101 {CLASS_RECSYN, {Z3950_PREFIX, 5, 105,-1}, OID_STR_GRS1 },
102 {CLASS_RECSYN, {Z3950_PREFIX, 5, 106,-1}, OID_STR_EXTENDED},
103 {CLASS_RECSYN, {Z3950_PREFIX, 5, 107,-1}, "Fragment"},
104 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,1,-1}, "pdf"},
105 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,2,-1}, OID_STR_POSTSCRIPT},
106 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,3,-1}, OID_STR_HTML},
107 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,4,-1}, "tiff"},
108 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,5,-1}, "gif"},
109 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,6,-1}, "jpeg"},
110 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,7,-1}, "png"},
111 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,8,-1}, "mpeg"},
112 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,9,-1}, "sgml"},
113 {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,1,-1}, "tiff-b"},
114 {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,2,-1}, "wav"},
115 {CLASS_RECSYN, {Z3950_PREFIX, 5, 111,-1}, "SQL-RS"},
116 {CLASS_RECSYN, {Z3950_PREFIX, 5, 1000, 81, 2,-1}, OID_STR_SOIF},
117 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1}, OID_STR_XML },
118 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1}, "application-XML"},
119 {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 11,-1}, OID_STR_APPLICATION_XML },
120 {CLASS_RESFORM, {Z3950_PREFIX, 7, 1,-1}, "Resource-1"},
121 {CLASS_RESFORM, {Z3950_PREFIX, 7, 2,-1}, "Resource-2"},
122 {CLASS_RESFORM, {Z3950_PREFIX, 7, 1000, 81, 1,-1}, "UNIverse-Resource-Report"},
123 {CLASS_ACCFORM, {Z3950_PREFIX, 8, 1,-1}, "Prompt-1"},
124 {CLASS_ACCFORM, {Z3950_PREFIX, 8, 2,-1}, "Des-1"},
125 {CLASS_ACCFORM, {Z3950_PREFIX, 8, 3,-1}, "Krb-1"},
126 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1,-1}, "Pers. set"},
127 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 2,-1}, "Pers. query"},
128 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 3,-1}, "Per'd query"},
129 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 4,-1}, OID_STR_ITEMORDER },
130 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,-1}, "DB. Update (first version)"},
131 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,1,-1}, "DB. Update (second version)"},
132 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5, 1, 1,-1}, OID_STR_EXT_UPDATE},
133 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 6,-1}, "exp. spec."},
134 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 7,-1}, "exp. inv."},
135 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1000, 81, 1,-1}, OID_STR_ADMIN},
136 {CLASS_USERINFO, {Z3950_PREFIX, 10, 1,-1}, "searchResult-1"},
137 {CLASS_USERINFO, {Z3950_PREFIX, 10, 2,-1}, "CharSetandLanguageNegotiation"},
138 {CLASS_USERINFO, {Z3950_PREFIX, 10, 3,-1}, OID_STR_USERINFO_1},
139 {CLASS_USERINFO, {Z3950_PREFIX, 10, 4,-1}, "MultipleSearchTerms-1"},
140 {CLASS_USERINFO, {Z3950_PREFIX, 10, 5,-1}, "MultipleSearchTerms-2"},
141 {CLASS_USERINFO, {Z3950_PREFIX, 10, 6,-1}, "DateTime"},
142 {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 1,-1}, OID_STR_PROXY},
143 {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 2,-1}, OID_STR_COOKIE},
144 {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 3,-1}, OID_STR_CLIENT_IP },
145 {CLASS_ELEMSPEC, {1, 2, 840, 1003, 11, 1,-1}, "Espec-1"},
146 {CLASS_VARSET, {Z3950_PREFIX, 12, 1,-1}, "Variant-1"},
147 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1,-1}, "WAIS-schema"},
148 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 2,-1}, "GILS-schema"},
149 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 3,-1}, "Collections-schema"},
150 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 4,-1}, "Geo-schema"},
151 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 5,-1}, "CIMI-schema"},
152 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 6,-1}, "Update ES"},
153 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 7,-1}, "Holdings"},
154 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 8,-1}, "Zthes"},
155 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 1,-1}, "thesaurus-schema"},
156 {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 2,-1}, "Explain-schema"},
157 {CLASS_TAGSET, {Z3950_PREFIX, 14, 1,-1}, "TagsetM"},
158 {CLASS_TAGSET, {Z3950_PREFIX, 14, 2,-1}, "TagsetG"},
159 {CLASS_TAGSET, {Z3950_PREFIX, 14, 3,-1}, "STAS-tagset"},
160 {CLASS_TAGSET, {Z3950_PREFIX, 14, 4,-1}, "GILS-tagset"},
161 {CLASS_TAGSET, {Z3950_PREFIX, 14, 5,-1}, "Collections-tagset"},
162 {CLASS_TAGSET, {Z3950_PREFIX, 14, 6,-1}, "CIMI-tagset"},
163 {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 1,-1}, "thesaurus-tagset"},
164 {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 2,-1}, "Explain-tagset"},
165 {CLASS_TAGSET, {Z3950_PREFIX, 14, 8,-1}, "Zthes-tagset"},
166 {CLASS_NEGOT, {Z3950_PREFIX, 15, 3,-1}, OID_STR_CHARNEG_3 },
167 {CLASS_NEGOT, {Z3950_PREFIX, 15, 4,-1}, OID_STR_CHARNEG_4 },
168 {CLASS_NEGOT, {Z3950_PREFIX, 15, 1000, 81, 1, -1}, OID_STR_ID_CHARSET },
169 {CLASS_USERINFO, {1, 2, 840, 1003, 16, 2, -1}, "CQL"},
170 {CLASS_GENERAL, {1,0,10646,1,0,2,-1}, "UCS-2"},
171 {CLASS_GENERAL, {1,0,10646,1,0,4,-1}, "UCS-4"},
172 {CLASS_GENERAL, {1,0,10646,1,0,5,-1}, "UTF-16"},
173 {CLASS_GENERAL, {1,0,10646,1,0,8,-1}, "UTF-8"},
174 {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 17, 1, -1}, "OCLC-userInfo"},
175 {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1000,105,4,-1}, OID_STR_XMLES },
180 struct yaz_oid_entry *entries;
181 struct yaz_oid_db *next;
185 struct yaz_oid_db standard_db_l = {
189 yaz_oid_db_t standard_db = &standard_db_l;
191 yaz_oid_db_t yaz_oid_std(void)
196 const int *yaz_string_to_oid(yaz_oid_db_t oid_db,
197 int oclass, const char *name)
199 for (; oid_db; oid_db = oid_db->next)
201 struct yaz_oid_entry *e = oid_db->entries;
204 if (!yaz_matchstr(e->name, name)
205 && (oclass == CLASS_GENERAL || oclass == e->oclass))
212 int *yaz_string_to_oid_nmem(yaz_oid_db_t oid_list,
213 int oclass, const char *name, NMEM nmem)
215 const int *oid = yaz_string_to_oid(oid_list, oclass, name);
217 return odr_oiddup_nmem(nmem, oid);
218 return odr_getoidbystr_nmem(nmem, name);
221 int *yaz_string_to_oid_odr(yaz_oid_db_t oid_list,
222 int oclass, const char *name, ODR o)
224 return yaz_string_to_oid_nmem(oid_list, oclass, name, odr_getmem(o));
227 const char *yaz_oid_to_string(yaz_oid_db_t oid_db,
228 const int *oid, int *oclass)
232 for (; oid_db; oid_db = oid_db->next)
234 struct yaz_oid_entry *e = oid_db->entries;
237 if (!oid_oidcmp(e->oid, oid))
248 const char *yaz_oid_to_string_buf(const int *oid, int *oclass, char *buf)
250 const char *p = yaz_oid_to_string(standard_db, oid, oclass);
254 *oclass = CLASS_GENERAL;
255 return oid_oid_to_dotstring(oid, buf);
258 int yaz_oid_is_iso2709(const int *oid)
260 if (oid_oidlen(oid) == 6 && oid[0] == 1 && oid[1] == 2
261 && oid[2] == 840 && oid[3] == 10003 && oid[4] == 5
262 && oid[5] <= 29 && oid[5] != 16)
267 int yaz_oid_add(yaz_oid_db_t oid_db, int oclass, const char *name,
270 const int *oid = yaz_string_to_oid(oid_db, oclass, name);
273 struct yaz_oid_entry *ent;
276 oid_db = oid_db->next;
277 oid_db->next = xmalloc(sizeof(*oid_db->next));
278 oid_db = oid_db->next;
281 oid_db->xmalloced = 1;
282 oid_db->entries = ent = xmalloc(2 * sizeof(*ent));
283 ent[0].oclass = oclass;
284 oid_oidcpy(ent[0].oid, new_oid);
285 ent[0].name = xstrdup(name);
286 ent[1].oclass = CLASS_NOP;
294 yaz_oid_db_t yaz_oid_db_new(void)
296 yaz_oid_db_t p = xmalloc(sizeof(*p));
303 void yaz_oid_db_destroy(yaz_oid_db_t oid_db)
307 yaz_oid_db_t p = oid_db;
309 oid_db = oid_db->next;
312 struct yaz_oid_entry *e = p->entries;
321 void yaz_oid_trav(yaz_oid_db_t oid_db,
322 void (*func)(const int *oid,
323 int oclass, const char *name,
327 for (; oid_db; oid_db = oid_db->next)
329 struct yaz_oid_entry *e = oid_db->entries;
332 func(e->oid, e->oclass, e->name, client_data);