Mercurial > projects > libpws
comparison pws-record.c @ 0:d541e748cfd8
Initial revision
author | Guido Berhoerster <guido+libpws@berhoerster.name> |
---|---|
date | Tue, 10 Feb 2015 11:29:54 +0100 |
parents | |
children | 956e97003bad |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:d541e748cfd8 |
---|---|
1 /* | |
2 * Copyright (C) 2015 Guido Berhoerster <guido+libpws@berhoerster.name> | |
3 * | |
4 * Permission is hereby granted, free of charge, to any person obtaining | |
5 * a copy of this software and associated documentation files (the | |
6 * "Software"), to deal in the Software without restriction, including | |
7 * without limitation the rights to use, copy, modify, merge, publish, | |
8 * distribute, sublicense, and/or sell copies of the Software, and to | |
9 * permit persons to whom the Software is furnished to do so, subject to | |
10 * the following conditions: | |
11 * | |
12 * The above copyright notice and this permission notice shall be included | |
13 * in all copies or substantial portions of the Software. | |
14 * | |
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |
21 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
22 */ | |
23 | |
24 #include "compat.h" | |
25 | |
26 #include <stdlib.h> | |
27 | |
28 #include "pws-internal.h" | |
29 | |
30 void | |
31 pws3_record_destroy(struct pws3_record *record) | |
32 { | |
33 size_t i; | |
34 | |
35 if (record == NULL) { | |
36 return; | |
37 } | |
38 | |
39 for (i = 0x01; i <= 0xff; i++) { | |
40 pws3_field_destroy(record->fields[i]); | |
41 } | |
42 pws_free(record, sizeof (record)); | |
43 } | |
44 | |
45 struct pws3_record * | |
46 pws3_record_create(void) | |
47 { | |
48 struct pws3_field *uuid_field = NULL; | |
49 unsigned char uuid[PWS3_UUID_SIZE]; | |
50 struct pws3_record *record = NULL; | |
51 size_t i; | |
52 | |
53 /* | |
54 * always add an UUID field which is mandatory and needed for inserting | |
55 * a record into a database | |
56 */ | |
57 if (pws_generate_uuid(uuid) != 0) { | |
58 goto err; | |
59 } | |
60 uuid_field = pws3_field_create(0, PWS3_RECORD_FIELD_UUID); | |
61 if (uuid_field == NULL) { | |
62 goto err; | |
63 } | |
64 pws3_field_set_uuid(uuid_field, uuid); | |
65 | |
66 record = pws_alloc(sizeof (struct pws3_record)); | |
67 if (record == NULL) { | |
68 goto err; | |
69 } | |
70 | |
71 for (i = 0x00; i <= 0xff; i++) { | |
72 record->fields[i] = NULL; | |
73 } | |
74 | |
75 pws3_record_set_field(record, uuid_field); | |
76 | |
77 return (record); | |
78 err: | |
79 pws3_field_destroy(uuid_field); | |
80 pws_free(record, (record != NULL) ? sizeof (struct pws3_record) : 0); | |
81 | |
82 return (NULL); | |
83 } | |
84 | |
85 void | |
86 pws3_record_set_field(struct pws3_record *record, struct pws3_field *field) | |
87 { | |
88 uint8_t field_type; | |
89 | |
90 PWS_ASSERT(!pws3_field_is_header(field)); | |
91 PWS_ASSERT((pws3_field_get_data_type(field) != PWS_DATA_TYPE_TEXT) || | |
92 (field->value.text != NULL)); | |
93 PWS_ASSERT((pws3_field_get_data_type(field) != PWS_DATA_TYPE_BYTES) || | |
94 (field->value.bytes != NULL)); | |
95 | |
96 field_type = pws3_field_get_type(field); | |
97 pws3_field_destroy(pws3_record_remove_field(record, field_type)); | |
98 record->fields[field_type] = field; | |
99 } | |
100 | |
101 struct pws3_field * | |
102 pws3_record_get_field(struct pws3_record *record, uint8_t field_type) | |
103 { | |
104 return (record->fields[field_type]); | |
105 } | |
106 | |
107 struct pws3_field * | |
108 pws3_record_remove_field(struct pws3_record *record, uint8_t field_type) | |
109 { | |
110 struct pws3_field *field; | |
111 | |
112 field = pws3_record_get_field(record, field_type); | |
113 record->fields[field_type] = NULL; | |
114 | |
115 return (field); | |
116 } |