exip  Alpha 0.5.4
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
genexi.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <math.h>
6 
7 //#define EXIP_DECIMAL int
8 
9 #include "EXIParser.h"
10 #include "EXISerializer.h"
11 #include "stringManipulate.h"
12 #include "grammarGenerator.h"
13 
14 
15 #define BUFFER_SIZE 30000000 // 30 MB
16 size_t writeFileOutputStream(void* buf, size_t readSize, void* stream);
17 
18 
19 // EXIP strings
20 
21 #define EXIP_STRING(str) {(char*)str, sizeof(str)-1}
22 
23 const String STR_EMPTY = {NULL, 0};
24 const String STR_DOCUMENT = EXIP_STRING("document");
25 const String STR_QUERY = EXIP_STRING("query");
26 const String STR_RESULT = EXIP_STRING("result");
27 const String STR_VALUE = EXIP_STRING("value");
28 const String STR_ID = EXIP_STRING("id");
29 const String STR_OP = EXIP_STRING("op");
30 const String STR_ADD = EXIP_STRING("add");
31 
32 
33 void _error(int lineno, const char *msg) {
34  fprintf(stderr, "Error: %s. Line number: %d.\n", msg, lineno);
35  fflush(stderr);
36 }
37 
38 void _error2(int lineno, const char *msg, int code) {
39  fprintf(stderr, "Error: %s. Code: %d. Line number: %d.\n", msg, code, lineno);
40  fflush(stderr);
41 }
42 
43 #define error(msg) _error(__LINE__, msg)
44 #define error2(msg, code) _error2(__LINE__, msg, code)
45 
46 
47 int main(int argc, char *argv[]) {
48  printf("%s starting\n", argv[0]);
49 
50  // Seed random number generator
51  srand(time(NULL));
52 
53  int i;
54  for (i=1; i <= 100; i++) {
55  char txt[100];
56  int n = pow(i*20, 1.6);
57  //int numqueries = i*100;
58  printf("data%05d.exi, %d entries\n", i, n);
59 
60  // Init output file
61  sprintf(txt, "data%05d.exi", i);
62  FILE *fd = fopen(txt, "wb");
63  if (fd == NULL) {
64  error("creating file");
65  return 1;
66  }
67 
68 
69  // Init serializer
70  EXIStream serStrm;
71  errorCode err;
72  QName qname = {&STR_EMPTY, NULL, NULL};
73  EXITypeClass valueType;
74  char *buf = malloc(BUFFER_SIZE);
75 
76  BinaryBuffer serbuf;
77  serbuf.buf = buf;
78  serbuf.bufLen = BUFFER_SIZE;
79  serbuf.bufContent = 0;
81  serbuf.ioStrm.stream = fd;
82 
83  serialize.initHeader(&serStrm);
84  serStrm.header.has_cookie = TRUE;
85  serStrm.header.has_options = TRUE;
86  serStrm.header.opts.valueMaxLength = 300;
87  serStrm.header.opts.valuePartitionCapacity = 50;
88  SET_STRICT(serStrm.header.opts.enumOpt);
89 
90  err = serialize.initStream(&serStrm, serbuf, NULL, SCHEMA_ID_ABSENT, NULL);
91  if (err != EXIP_OK) {
92  error2("initializing EXI output stream", err);
93  fclose(fd);
94  return 1;
95  }
96 
97  err += serialize.exiHeader(&serStrm);
98  err += serialize.startDocument(&serStrm);
99 
100  // <document>
101  qname.localName = &STR_DOCUMENT;
102  err += serialize.startElement(&serStrm, qname, &valueType);
103 
104 
105  // <query id="1" op="add"><value>497</value><value>5102</value></query>
106  int j;
107  for (j=1; j <= n; j++) {
108  String chVal;
109 
110  // <query
111  qname.localName = &STR_QUERY;
112  err += serialize.startElement(&serStrm, qname, &valueType);
113 
114  // id=
115  qname.localName = &STR_ID;
116  err += serialize.attribute(&serStrm, qname, TRUE, &valueType);
117  sprintf(txt, "%d", j);
118  err += asciiToString(txt, &chVal, &serStrm.memList, TRUE);
119  err += serialize.stringData(&serStrm, chVal);
120 
121  // op="add"
122  qname.localName = &STR_OP;
123  err += serialize.attribute(&serStrm, qname, TRUE, &valueType);
124  err += asciiToString("add", &chVal, &serStrm.memList, TRUE);
125  err += serialize.stringData(&serStrm, chVal);
126 
127  // generate 1 <= x,y <= 1000
128  int x = (rand()%1000)+1;
129  int y = (rand()%1000)+1;
130 
131  // <value>x</value>
132  qname.localName = &STR_VALUE;
133  err += serialize.startElement(&serStrm, qname, &valueType);
134  sprintf(txt, "%d", x);
135  err += asciiToString(txt, &chVal, &serStrm.memList, TRUE);
136  err += serialize.stringData(&serStrm, chVal);
137  err += serialize.endElement(&serStrm);
138 
139  // <value>y</value>
140  err += serialize.startElement(&serStrm, qname, &valueType);
141  sprintf(txt, "%d", y);
142  err += asciiToString(txt, &chVal, &serStrm.memList, TRUE);
143  err += serialize.stringData(&serStrm, chVal);
144  err += serialize.endElement(&serStrm);
145 
146  // </query>
147  err += serialize.endElement(&serStrm);
148  }
149 
150  // </document>
151  err += serialize.endElement(&serStrm);
152  err += serialize.endDocument(&serStrm);
153  err += serialize.closeEXIStream(&serStrm);
154 
155  if (err != EXIP_OK) {
156  error2("EXI serializer", err);
157  fclose(fd);
158  return 1;
159  }
160 
161  free(buf);
162  }
163 
164  printf("All done.\n");
165 
166 
167  return 0;
168 }
169 
170 size_t writeFileOutputStream(void* buf, size_t readSize, void* stream)
171 {
172  FILE *outfile = (FILE*) stream;
173  return fwrite(buf, 1, readSize, outfile);
174 }