DB Update implemented in client (very basic).
[yaz-moved-to-github.git] / asn / prt-exd.c
1 /*
2  * Copyright (c) 1995-1999, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: prt-exd.c,v $
7  * Revision 1.10  1999-05-26 13:49:12  adam
8  * DB Update implemented in client (very basic).
9  *
10  * Revision 1.9  1999/04/20 09:56:48  adam
11  * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
12  * Modified all encoders/decoders to reflect this change.
13  *
14  * Revision 1.8  1998/02/11 11:53:32  adam
15  * Changed code so that it compiles as C++.
16  *
17  * Revision 1.7  1998/02/10 15:31:46  adam
18  * Implemented date and time structure. Changed the Update Extended
19  * Service.
20  *
21  * Revision 1.6  1998/01/05 09:04:57  adam
22  * Fixed bugs in encoders/decoders - Not operator (!) missing.
23  *
24  * Revision 1.5  1997/04/30 08:52:02  quinn
25  * Null
26  *
27  * Revision 1.4  1996/10/10  12:35:12  quinn
28  * Added Update extended service.
29  *
30  * Revision 1.3  1995/09/29  17:11:54  quinn
31  * Smallish
32  *
33  * Revision 1.2  1995/09/27  15:02:41  quinn
34  * Modified function heads & prototypes.
35  *
36  * Revision 1.1  1995/08/21  09:16:32  quinn
37  * Added Extended services + Item Order
38  *
39  *
40  */
41
42 #include <proto.h>
43
44 int z_TaskPackage(ODR o, Z_TaskPackage **p, int opt, const char *name)
45 {
46     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
47         return opt && odr_ok(o);
48     return
49         odr_implicit(o, odr_oid, &(*p)->packageType, ODR_CONTEXT, 1, 0) &&
50         odr_implicit(o, z_InternationalString, &(*p)->packageName,
51                      ODR_CONTEXT, 2, 1) &&
52         odr_implicit(o, z_InternationalString, &(*p)->userId,
53                      ODR_CONTEXT, 3, 1) &&
54         odr_implicit(o, z_IntUnit, &(*p)->retentionTime, ODR_CONTEXT, 4, 1) &&
55         odr_implicit(o, z_Permissions, &(*p)->permissions,
56                      ODR_CONTEXT, 5, 1) &&
57         odr_implicit(o, z_InternationalString, &(*p)->description,
58                      ODR_CONTEXT, 6, 1) &&
59         odr_implicit(o, odr_octetstring, &(*p)->targetReference,
60                      ODR_CONTEXT, 7, 0) &&
61         odr_implicit(o, odr_generalizedtime, &(*p)->creationDateTime,
62                      ODR_CONTEXT, 8, 1) &&
63         odr_implicit(o, odr_integer, &(*p)->taskStatus,
64                      ODR_CONTEXT, 9, 0) &&
65         odr_implicit_settag(o, ODR_CONTEXT, 10) &&
66         (odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->packageDiagnostics,
67                          &(*p)->num_packageDiagnostics, 0) || odr_ok(o)) &&
68         odr_implicit(o, z_External, &(*p)->taskSpecificParameters,
69                      ODR_CONTEXT, 11, 0) &&
70         odr_sequence_end(o);
71 }
72
73 /* ----------------------- ITEM ORDER --------------------- */
74
75 int z_IOTargetPart(ODR o, Z_IOTargetPart **p, int opt, const char *name)
76 {
77     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
78         return opt && odr_ok(o);
79     return
80         odr_implicit(o, z_External, &(*p)->itemRequest, ODR_CONTEXT, 1, 1) &&
81         odr_implicit(o, z_External, &(*p)->statusOrErrorReport, ODR_CONTEXT,
82             2, 0) &&
83         odr_implicit(o, odr_integer, &(*p)->auxiliaryStatus, ODR_CONTEXT,
84             3, 1) &&
85         odr_sequence_end(o);
86 }
87
88 int z_IOResultSetItem(ODR o, Z_IOResultSetItem **p, int opt, const char *name)
89 {
90     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
91         return opt && odr_ok(o);
92     return
93         odr_implicit(o, z_InternationalString, &(*p)->resultSetId, ODR_CONTEXT,
94             1, 0) &&
95         odr_implicit(o, odr_integer, &(*p)->item, ODR_CONTEXT, 2, 1) &&
96         odr_sequence_end(o);
97 }
98
99 int z_IOOriginPartNotToKeep(ODR o, Z_IOOriginPartNotToKeep **p, int opt,
100                             const char *name)
101 {
102     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
103         return opt && odr_ok(o);
104     return
105         odr_implicit(o, z_IOResultSetItem, &(*p)->resultSetItem, ODR_CONTEXT,
106             1, 0) &&
107         odr_implicit(o, z_External, &(*p)->itemRequest, ODR_CONTEXT, 2, 1) &&
108         odr_sequence_end(o);
109 }
110
111 int z_IOContact(ODR o, Z_IOContact **p, int opt, const char *name)
112 {
113     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
114         return opt && odr_ok(o);
115     return
116         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
117             1, 1) &&
118         odr_implicit(o, z_InternationalString, &(*p)->phone, ODR_CONTEXT,
119             2, 1) &&
120         odr_implicit(o, z_InternationalString, &(*p)->email, ODR_CONTEXT,
121             3, 1) &&
122         odr_sequence_end(o);
123 }
124
125 int z_IOCreditCardInfo(ODR o, Z_IOCreditCardInfo **p, int opt,
126                        const char *name)
127 {
128     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
129         return opt && odr_ok(o);
130     return
131         odr_implicit(o, z_InternationalString, &(*p)->nameOnCard, ODR_CONTEXT,
132             1, 0) &&
133         odr_implicit(o, z_InternationalString, &(*p)->expirationDate,
134             ODR_CONTEXT, 2, 0) &&
135         odr_implicit(o, z_InternationalString, &(*p)->cardNumber, ODR_CONTEXT,
136             3, 0) &&
137         odr_sequence_end(o);
138 }
139
140 int z_IOBilling(ODR o, Z_IOBilling **p, int opt, const char *name)
141 {
142     static Odr_arm arm[] =
143     {
144         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_IOBilling_billInvoice,
145          (Odr_fun)odr_null, 0},
146         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IOBilling_prepay,
147          (Odr_fun)odr_null, 0},
148         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IOBilling_depositAccount,
149          (Odr_fun)odr_null, 0},
150         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IOBilling_creditCard,
151          (Odr_fun)z_IOCreditCardInfo, 0},
152         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_IOBilling_cardInfoPreviouslySupplied,
153          (Odr_fun)odr_null, 0},
154         {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_IOBilling_privateKnown,
155          (Odr_fun)odr_null, 0},
156         {ODR_IMPLICIT, ODR_CONTEXT, 6, Z_IOBilling_privateNotKnown,
157          (Odr_fun)z_External, 0},
158         {-1, -1, -1, -1, 0, 0}
159     };
160     
161     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
162         return opt && odr_ok(o);
163     return
164         odr_constructed_begin(o, &(*p)->paymentMethod,
165                               ODR_CONTEXT, 1, 0) &&
166         odr_choice(o, arm, &(*p)->paymentMethod, &(*p)->which, 0) &&
167         odr_constructed_end(o) &&
168         odr_implicit(o, z_InternationalString, &(*p)->customerReference,
169                      ODR_CONTEXT, 2, 1) &&
170         odr_implicit(o, z_InternationalString, &(*p)->customerPONumber,
171                      ODR_CONTEXT, 3, 1) &&
172         odr_sequence_end(o);
173 }
174
175 int z_IOOriginPartToKeep(ODR o, Z_IOOriginPartToKeep **p, int opt,
176                          const char *name)
177 {
178     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
179         return opt && odr_ok(o);
180     return
181         odr_implicit(o, z_External, &(*p)->supplDescription,
182                      ODR_CONTEXT, 1, 1) &&
183         odr_implicit(o, z_IOContact, &(*p)->contact, ODR_CONTEXT, 2, 1) &&
184         odr_implicit(o, z_IOBilling, &(*p)->addlBilling,
185                      ODR_CONTEXT, 3, 1) &&
186         odr_sequence_end(o);
187 }
188
189 int z_IORequest(ODR o, Z_IORequest **p, int opt, const char *name)
190 {
191     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
192         return opt && odr_ok(o);
193     return 
194         odr_implicit(o, z_IOOriginPartToKeep, &(*p)->toKeep,
195                      ODR_CONTEXT, 1, 1) &&
196         odr_implicit(o, z_IOOriginPartNotToKeep, &(*p)->notToKeep,
197                      ODR_CONTEXT, 2, 0) &&
198         odr_sequence_end(o);
199 }
200
201 int z_IOTaskPackage(ODR o, Z_IOTaskPackage **p, int opt, const char *name)
202 {
203     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
204         return opt && odr_ok(o);
205     return
206         odr_implicit(o, z_IOOriginPartToKeep, &(*p)->originPart,
207                      ODR_CONTEXT, 1, 1) &&
208         odr_implicit(o, z_IOTargetPart, &(*p)->targetPart,
209                      ODR_CONTEXT, 2, 0) &&
210         odr_sequence_end(o);
211 }
212
213 int z_ItemOrder(ODR o, Z_ItemOrder **p, int opt, const char *name)
214 {
215     static Odr_arm arm[] =
216     {
217         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ItemOrder_esRequest,
218          (Odr_fun)z_IORequest, 0},
219         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ItemOrder_taskPackage,
220          (Odr_fun)z_IOTaskPackage, 0},
221         {-1, -1, -1, -1, 0, 0}
222     };
223     
224     if (o->direction == ODR_DECODE)
225         *p = (Z_ItemOrder *)odr_malloc(o, sizeof(**p));
226     else if (!*p)
227         return opt;
228     if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
229         return 1;
230     *p = 0;
231     return opt && odr_ok(o);
232 }
233
234 /* ----------------------- ITEM UPDATE -------------------- */
235
236 int z_IUSuppliedRecordsId (ODR o, Z_IUSuppliedRecordsId **p, int opt,
237                            const char *name)
238 {
239     static Odr_arm arm[] = {
240         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUSuppliedRecordsId_timeStamp,
241          odr_generalizedtime, 0},
242         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUSuppliedRecordsId_versionNumber,
243          z_InternationalString, 0},
244         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IUSuppliedRecordsId_previousVersion,
245          (Odr_fun)odr_external, 0},
246         {-1, -1, -1, -1, 0, 0}
247     };
248     if (!odr_initmember(o, p, sizeof(**p)))
249         return opt && odr_ok(o);
250     if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
251         return 1;
252     *p = 0;
253     return opt && odr_ok(o);
254 }
255
256 int z_IUCorrelationInfo (ODR o, Z_IUCorrelationInfo **p, int opt,
257                          const char *name)
258 {
259     if (!odr_sequence_begin (o, p, sizeof(**p), 0))
260         return opt && odr_ok (o);
261     return
262         odr_implicit (o, z_InternationalString,
263                       &(*p)->note, ODR_CONTEXT, 1, 1) &&
264         odr_implicit (o, odr_integer,
265                       &(*p)->id, ODR_CONTEXT, 2, 1) &&
266         odr_sequence_end (o);
267 }
268
269 int z_IUSuppliedRecords_elem (ODR o, Z_IUSuppliedRecords_elem **p, int opt,
270                               const char *name)
271 {
272     static Odr_arm arm[] = {
273         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUSuppliedRecords_number,
274          (Odr_fun)odr_integer, 0},
275         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUSuppliedRecords_string,
276          (Odr_fun)z_InternationalString, 0},
277         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IUSuppliedRecords_opaque,
278          (Odr_fun)odr_octetstring, 0},
279         {-1, -1, -1, -1, 0, 0}
280     };
281     if (!odr_sequence_begin (o, p, sizeof(**p), 0))
282         return opt && odr_ok (o);
283     return
284         ((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
285           odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
286           odr_constructed_end (o)) || odr_ok(o)) &&
287         odr_explicit (o, z_IUSuppliedRecordsId,
288                       &(*p)->supplementalId, ODR_CONTEXT, 2, 1) &&
289         odr_implicit (o, z_IUCorrelationInfo,
290                       &(*p)->correlationInfo, ODR_CONTEXT, 3, 1) &&
291         odr_implicit (o, z_External,
292                       &(*p)->record, ODR_CONTEXT, 4, 0) &&
293         odr_sequence_end (o);
294 }
295
296 int z_IUSuppliedRecords (ODR o, Z_IUSuppliedRecords **p, int opt,
297                          const char *name)
298 {
299     if (!odr_initmember (o, p, sizeof(**p)))
300         return opt && odr_ok(o);
301     if (odr_sequence_of (o, (Odr_fun)z_IUSuppliedRecords_elem, &(*p)->elements,
302                          &(*p)->num, 0))
303         return 1;
304     *p = 0;
305     return opt && odr_ok(o);
306 }
307
308 int z_IUTaskPackageRecordStructure (ODR o, Z_IUTaskPackageRecordStructure **p,
309                                     int opt, const char *name)
310 {
311     static Odr_arm arm[] = {
312         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUTaskPackageRecordStructure_record,
313          (Odr_fun)odr_external, 0},
314         {ODR_EXPLICIT, ODR_CONTEXT, 2,
315          Z_IUTaskPackageRecordStructure_surrogateDiagnostics,
316          (Odr_fun)z_DiagRecs, 0},
317         {-1, -1, -1, -1, 0, 0}
318     };
319     if (!odr_sequence_begin (o, p, sizeof(**p), 0))
320         return opt && odr_ok (o);
321     return
322         ((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
323           odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
324           odr_constructed_end (o)) || odr_ok(o)) &&
325         odr_implicit (o, z_IUCorrelationInfo,
326                       &(*p)->correlationInfo, ODR_CONTEXT, 2, 1) &&
327         odr_implicit (o, odr_integer,
328                       &(*p)->recordStatus, ODR_CONTEXT, 3, 0) &&
329         odr_implicit (o, z_DiagRecs, 
330                       &(*p)->supplementalDiagnostics, ODR_CONTEXT, 4, 1) &&
331         odr_sequence_end (o);
332 }
333
334 int z_IUOriginPartToKeep (ODR o, Z_IUOriginPartToKeep **p, int opt,
335                           const char *name)
336 {
337     if (!odr_sequence_begin (o, p, sizeof(**p), 0))
338         return opt && odr_ok (o);
339     return
340         odr_implicit (o, odr_integer,
341                       &(*p)->action, ODR_CONTEXT, 1, 0) &&
342         odr_implicit (o, z_InternationalString,
343                       &(*p)->databaseName, ODR_CONTEXT, 2, 0) &&
344         odr_implicit (o, odr_oid,
345                       &(*p)->schema, ODR_CONTEXT, 3, 1) &&
346         odr_implicit (o, z_InternationalString,
347                       &(*p)->elementSetName, ODR_CONTEXT, 4, 1) &&
348         odr_implicit (o, odr_external,
349                       &(*p)->actionQualifier, ODR_CONTEXT, 5, 1) &&
350         odr_sequence_end (o);
351 }
352
353 int z_IUTargetPart (ODR o, Z_IUTargetPart **p, int opt, const char *name)
354 {
355     if (!odr_sequence_begin (o, p, sizeof(**p), 0))
356         return opt && odr_ok (o);
357     return
358         odr_implicit (o, odr_integer,
359                       &(*p)->updateStatus, ODR_CONTEXT, 1, 0) &&
360         odr_implicit_settag (o, ODR_CONTEXT, 2) &&
361         (odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->globalDiagnostics,
362                          &(*p)->num_globalDiagnostics, 0) || odr_ok(o)) &&
363         odr_implicit_settag (o, ODR_CONTEXT, 3) &&
364         odr_sequence_of(o, (Odr_fun)z_IUTaskPackageRecordStructure,
365                         &(*p)->taskPackageRecords,
366                         &(*p)->num_taskPackageRecords, 0) &&
367         odr_sequence_end (o);
368 }
369
370 int z_IUUpdateEsRequest (ODR o, Z_IUUpdateEsRequest **p, int opt,
371                          const char *name)
372 {
373     if (!odr_sequence_begin (o, p, sizeof(**p), 0))
374         return opt && odr_ok (o);
375     return
376         odr_explicit (o, z_IUOriginPartToKeep,
377                       &(*p)->toKeep, ODR_CONTEXT, 1, 0) &&
378         odr_explicit (o, z_IUSuppliedRecords,
379                       &(*p)->notToKeep, ODR_CONTEXT, 2, 0) &&
380         odr_sequence_end (o);
381 }
382
383 int z_IUUpdateTaskPackage (ODR o, Z_IUUpdateTaskPackage **p, int opt,
384                            const char *name)
385 {
386     if (!odr_sequence_begin (o, p, sizeof(**p), 0))
387         return opt && odr_ok (o);
388     return
389         odr_explicit (o, z_IUOriginPartToKeep,
390                       &(*p)->originPart, ODR_CONTEXT, 1, 0) &&
391         odr_explicit (o, z_IUTargetPart,
392                       &(*p)->targetPart, ODR_CONTEXT, 2, 0) &&
393         odr_sequence_end (o);
394 }
395
396 int z_IUUpdate (ODR o, Z_IUUpdate **p, int opt, const char *name)
397 {
398     static Odr_arm arm[] = {
399         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUUpdate_esRequest,
400          (Odr_fun)z_IUUpdateEsRequest, 0},
401         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUUpdate_taskPackage,
402          (Odr_fun)z_IUUpdateTaskPackage, 0},
403         {-1, -1, -1, -1, 0, 0}
404     };
405     if (!odr_initmember(o, p, sizeof(**p)))
406         return opt && odr_ok(o);
407     if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
408         return 1;
409     *p = 0;
410     return opt && odr_ok(o);
411 }