New OID database - with public definitions in oid_db.h. Removed old OID
[yaz-moved-to-github.git] / src / oid_db.c
1 /*
2  * Copyright (C) 1995-2007, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: oid_db.c,v 1.1 2007-04-12 13:52:57 adam Exp $
6  */
7
8 /**
9  * \brief OID Database
10  */
11 #if HAVE_CONFIG_H
12 #include <config.h>
13 #endif
14
15 #include <stdlib.h>
16 #include <string.h>
17 #include <ctype.h>
18
19 #include <yaz/yaz-util.h>
20 #include <yaz/odr.h>
21 #include <yaz/oid_util.h>
22 #include <yaz/oid_db.h>
23
24 struct yaz_oid_entry {
25     int oclass;
26     int oid[10];
27     char *name;
28 };
29
30 #define Z3950_PREFIX 1, 2, 840, 10003
31
32 static struct yaz_oid_entry standard_oids[] =
33 {
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},
62      "Thesaurus-attset"},
63     {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,2,-1},
64      "IDXPATH"},
65     {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,3,-1},
66      "EXTLITE"},
67     {CLASS_DIAGSET, {Z3950_PREFIX, 4, 1,-1},
68      OID_STR_BIB1},
69     {CLASS_DIAGSET, {Z3950_PREFIX, 4, 2,-1},
70      OID_STR_DIAG1},
71     {CLASS_DIAGSET, {Z3950_PREFIX, 4, 3,-1},
72      "Diag-ES"},
73     {CLASS_DIAGSET,  {Z3950_PREFIX, 4, 3,-1},
74      "Diag-General"},
75     {CLASS_RECSYN, {Z3950_PREFIX, 5, 1,-1},
76      "Unimarc"},
77     {CLASS_RECSYN, {Z3950_PREFIX, 5, 2,-1},
78      "Intermarc"},
79     {CLASS_RECSYN, {Z3950_PREFIX, 5, 3,-1},
80      "CCF"},
81     {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1},
82      OID_STR_USMARC},
83     /* MARC21 is just an alias for the original USmarc */
84     {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1},
85      "MARC21"},
86     {CLASS_RECSYN, {Z3950_PREFIX, 5, 11,-1},
87      "UKmarc"},
88     {CLASS_RECSYN, {Z3950_PREFIX, 5, 12,-1},
89      "Normarc"},
90     {CLASS_RECSYN, {Z3950_PREFIX, 5, 13,-1},
91      "Librismarc"},
92     {CLASS_RECSYN, {Z3950_PREFIX, 5, 14,-1},
93      "Danmarc"},
94     {CLASS_RECSYN, {Z3950_PREFIX, 5, 15,-1},
95      "Finmarc"},
96     {CLASS_RECSYN, {Z3950_PREFIX, 5, 16,-1},
97      "MAB"},
98     {CLASS_RECSYN, {Z3950_PREFIX, 5, 17,-1},
99      "Canmarc"},
100     {CLASS_RECSYN, {Z3950_PREFIX, 5, 18,-1},
101      "SBN"},
102     {CLASS_RECSYN, {Z3950_PREFIX, 5, 19,-1},
103      "Picamarc"},
104     {CLASS_RECSYN, {Z3950_PREFIX, 5, 20,-1},
105      "Ausmarc"},
106     {CLASS_RECSYN, {Z3950_PREFIX, 5, 21,-1},
107      "Ibermarc"},
108     {CLASS_RECSYN, {Z3950_PREFIX, 5, 22,-1},
109      "Carmarc"},
110     {CLASS_RECSYN, {Z3950_PREFIX, 5, 23,-1},
111      "Malmarc"},
112     {CLASS_RECSYN, {Z3950_PREFIX, 5, 24,-1},
113      "JPmarc"},
114     {CLASS_RECSYN, {Z3950_PREFIX, 5, 25,-1},
115      "SWEmarc"},
116     {CLASS_RECSYN, {Z3950_PREFIX, 5, 26,-1},
117      "SIGLEmarc"},
118     {CLASS_RECSYN, {Z3950_PREFIX, 5, 27,-1},
119      "ISDSmarc"},
120     {CLASS_RECSYN, {Z3950_PREFIX, 5, 28,-1},
121      "RUSmarc"},
122     {CLASS_RECSYN, {Z3950_PREFIX, 5, 29,-1},
123      "Hunmarc"},
124     {CLASS_RECSYN, {Z3950_PREFIX, 5, 30,-1},
125      "NACSIS-CATP"},
126     {CLASS_RECSYN, {Z3950_PREFIX, 5, 31,-1},
127      "FINMARC2000"},
128     {CLASS_RECSYN, {Z3950_PREFIX, 5, 32,-1},
129      "MARC21-fin"},
130     {CLASS_RECSYN, {Z3950_PREFIX, 5, 100,-1},
131      OID_STR_EXPLAIN},
132     {CLASS_RECSYN, {Z3950_PREFIX, 5, 101,-1},
133      OID_STR_SUTRS},
134     {CLASS_RECSYN, {Z3950_PREFIX, 5, 102,-1},
135      OID_STR_OPAC},
136     {CLASS_RECSYN, {Z3950_PREFIX, 5, 103,-1},
137      OID_STR_SUMMARY},
138     {CLASS_RECSYN, {Z3950_PREFIX, 5, 104,-1},
139      "GRS-0"},
140     {CLASS_RECSYN, {Z3950_PREFIX, 5, 105,-1},
141      OID_STR_GRS1 },
142     {CLASS_RECSYN, {Z3950_PREFIX, 5, 106,-1},
143      OID_STR_EXTENDED},
144     {CLASS_RECSYN, {Z3950_PREFIX, 5, 107,-1},
145      "Fragment"},
146     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,1,-1},
147      "pdf"},
148     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,2,-1},
149      OID_STR_POSTSCRIPT},
150     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,3,-1},
151      OID_STR_HTML},
152     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,4,-1},
153      "tiff"},
154     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,5,-1},
155      "gif"},
156     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,6,-1},
157      "jpeg"},
158     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,7,-1},
159      "png"},
160     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,8,-1},
161      "mpeg"},
162     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,9,-1},
163      "sgml"},
164
165     {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,1,-1},
166      "tiff-b"},
167     {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,2,-1},
168      "wav"},
169
170     {CLASS_RECSYN, {Z3950_PREFIX, 5, 111,-1},
171      "SQL-RS"},
172     {CLASS_RECSYN, {Z3950_PREFIX, 5, 1000, 81, 2,-1},
173      OID_STR_SOIF},
174     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1},
175      OID_STR_XML },
176     {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1},
177      "application-XML"},
178     {CLASS_RECSYN,   {Z3950_PREFIX, 5, 109, 11,-1},
179      OID_STR_APPLICATION_XML },
180     {CLASS_RESFORM, {Z3950_PREFIX, 7, 1,-1},
181      "Resource-1"},
182     {CLASS_RESFORM, {Z3950_PREFIX, 7, 2,-1},
183      "Resource-2"},
184     {CLASS_RESFORM,  {Z3950_PREFIX, 7, 1000, 81, 1,-1},
185      "UNIverse-Resource-Report"},
186
187     {CLASS_ACCFORM, {Z3950_PREFIX, 8, 1,-1},
188      "Prompt-1"},
189     {CLASS_ACCFORM, {Z3950_PREFIX, 8, 2,-1},
190      "Des-1"},
191     {CLASS_ACCFORM, {Z3950_PREFIX, 8, 3,-1},
192      "Krb-1"},
193     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1,-1},
194      "Pers. set"},
195     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 2,-1},
196      "Pers. query"},
197     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 3,-1},
198      "Per'd query"},
199     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 4,-1},
200      OID_STR_ITEMORDER },
201     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,-1},
202      "DB. Update (first version)"},
203     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,1,-1},
204      "DB. Update (second version)"},
205     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5, 1, 1,-1},
206      OID_STR_EXT_UPDATE},
207     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 6,-1},
208      "exp. spec."},
209     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 7,-1},
210      "exp. inv."},
211     {CLASS_EXTSERV,  {Z3950_PREFIX, 9, 1000, 81, 1,-1},
212      OID_STR_ADMIN},
213     {CLASS_USERINFO, {Z3950_PREFIX, 10, 1,-1},
214      "searchResult-1"},
215     {CLASS_USERINFO, {Z3950_PREFIX, 10, 2,-1},
216      "CharSetandLanguageNegotiation"},
217     {CLASS_USERINFO, {Z3950_PREFIX, 10, 3,-1},
218      OID_STR_USERINFO_1},
219     {CLASS_USERINFO,   {Z3950_PREFIX, 10, 4,-1},
220      "MultipleSearchTerms-1"},
221     {CLASS_USERINFO,   {Z3950_PREFIX, 10, 5,-1},
222      "MultipleSearchTerms-2"},
223     {CLASS_USERINFO, {Z3950_PREFIX, 10, 6,-1},
224      "DateTime"},
225     {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 1,-1},
226      OID_STR_PROXY},
227     {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 2,-1},
228      OID_STR_COOKIE},
229     {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 3,-1},
230      OID_STR_CLIENT_IP },
231     {CLASS_ELEMSPEC, {1, 2, 840, 1003, 11, 1,-1},
232      "Espec-1"},
233     {CLASS_VARSET, {Z3950_PREFIX, 12, 1,-1},
234      "Variant-1"},
235     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1,-1},
236      "WAIS-schema"},
237     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 2,-1},
238      "GILS-schema"},
239     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 3,-1},
240      "Collections-schema"},
241     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 4,-1},
242      "Geo-schema"},
243     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 5,-1},
244      "CIMI-schema"},
245     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 6,-1},
246      "Update ES"},
247     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 7,-1},
248      "Holdings"},
249     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 8,-1},
250      "Zthes"},
251     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 1,-1},
252      "thesaurus-schema"},
253     {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 2,-1},
254      "Explain-schema"},
255     {CLASS_TAGSET, {Z3950_PREFIX, 14, 1,-1},
256      "TagsetM"},
257     {CLASS_TAGSET, {Z3950_PREFIX, 14, 2,-1},
258      "TagsetG"},
259     {CLASS_TAGSET, {Z3950_PREFIX, 14, 3,-1},
260      "STAS-tagset"},
261     {CLASS_TAGSET, {Z3950_PREFIX, 14, 4,-1},
262      "GILS-tagset"},
263     {CLASS_TAGSET, {Z3950_PREFIX, 14, 5,-1},
264      "Collections-tagset"},
265     {CLASS_TAGSET, {Z3950_PREFIX, 14, 6,-1},
266      "CIMI-tagset"},
267     {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 1,-1},
268      "thesaurus-tagset"}, 
269     {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 2,-1},
270      "Explain-tagset"},
271     {CLASS_TAGSET, {Z3950_PREFIX, 14, 8,-1},
272      "Zthes-tagset"},
273     {CLASS_NEGOT, {Z3950_PREFIX, 15, 3,-1},
274      OID_STR_CHARNEG_3 },
275     {CLASS_NEGOT, {Z3950_PREFIX, 15, 4,-1},
276      OID_STR_CHARNEG_4 },
277     {CLASS_NEGOT, {Z3950_PREFIX, 15, 1000, 81,1,-1},
278      OID_STR_ID_CHARSET },
279     {CLASS_USERINFO, {1, 2, 840, 1003, 16,  2, -1},
280      "CQL"},
281     {CLASS_GENERAL, {1,0,10646,1,0,2,-1},
282      "UCS-2"},
283     {CLASS_GENERAL, {1,0,10646,1,0,4,-1},
284      "UCS-4"},
285     {CLASS_GENERAL, {1,0,10646,1,0,5,-1},
286      "UTF-16"},
287     {CLASS_GENERAL, {1,0,10646,1,0,8,-1},
288      "UTF-8"},
289     {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 17, 1, -1},
290      "OCLC-userInfo"},
291     {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1000,105,4,-1},
292      OID_STR_XMLES },
293     {CLASS_NOP, {-1}, 0}
294 };
295
296 yaz_oid_db_t yaz_oid_std(void)
297 {
298     return standard_oids;
299 }
300
301 const int *yaz_string_to_oid(yaz_oid_db_t oid_list,
302                              int oclass, const char *name)
303 {
304     for (; oid_list->name; oid_list++)
305     {
306         if (!yaz_matchstr(oid_list->name, name)
307             && (oclass == CLASS_GENERAL || oclass == oid_list->oclass))
308             return oid_list->oid;
309     }
310     return 0;
311 }
312
313 int *yaz_string_to_oid_nmem(yaz_oid_db_t oid_list,
314                             int oclass, const char *name, NMEM nmem)
315 {
316     const int *oid = yaz_string_to_oid(oid_list, oclass, name);
317     if (oid)
318         return odr_oiddup_nmem(nmem, oid);
319     return odr_getoidbystr_nmem(nmem, name);
320 }
321
322 int *yaz_string_to_oid_odr(yaz_oid_db_t oid_list,
323                            int oclass, const char *name, ODR o)
324 {
325     return yaz_string_to_oid_nmem(oid_list, oclass, name, odr_getmem(o));
326 }
327
328 const char *yaz_oid_to_string(yaz_oid_db_t oid_list,
329                               const int *oid, int *oclass)
330 {
331     if (!oid)
332         return 0;
333     for (; oid_list->name; oid_list++)
334     {
335         if (!oid_oidcmp(oid_list->oid, oid))
336         {
337             if (oclass)
338                 *oclass = oid_list->oclass;
339             return oid_list->name;
340         }
341     }
342     return 0;
343 }
344
345 const char *yaz_oid_to_string_buf(const int *oid, int *oclass, char *buf)
346 {
347     const char *p = yaz_oid_to_string(standard_oids, oid, oclass);
348     if (p)
349         return p;
350     if (oclass)
351         *oclass = CLASS_GENERAL;
352     return oid_to_dotstring(oid, buf);
353 }
354
355 int yaz_oid_is_iso2709(const int *oid)
356 {
357     if (oid_oidlen(oid) == 6 && oid[0] == 1 && oid[1] == 2
358         && oid[2] == 840 && oid[3] == 10003 && oid[4] == 5 
359         && oid[5] <= 29 && oid[5] != 16)
360         return 1;
361     return 0;
362 }
363
364 void yaz_oid_trav(yaz_oid_db_t oid_list,
365                   void (*func)(const int *oid,
366                                int oclass, const char *name,
367                                void *client_data),
368                   void *client_data)
369 {
370     for (; oid_list->name; oid_list++)
371         func(oid_list->oid, oid_list->oclass, oid_list->name, client_data);
372 }
373