/xmlbench/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/xmlbench/trunk

« back to all changes in this revision

Viewing changes to xmlgen/xmlgen.h

  • Committer: Suren A. Chilingaryan
  • Date: 2009-02-16 09:27:17 UTC
  • Revision ID: csa@dside.dyndns.org-20090216092717-wipyvaaw2srxhgns
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <string.h>
 
2
#include <math.h>
 
3
#include "random.h"
 
4
 
 
5
#define strlength 12
 
6
#define xmlsec_maxpri 10000000
 
7
#define xmlsec_maxsec 25
 
8
#define xmlsec_minpri 10
 
9
#define xmlsec_basesize 500
 
10
#define xmlsec_secsize 300
 
11
#define xmlsec_min_maxsize 1024
 
12
char xmlgen_s[xmlsec_basesize];
 
13
char xmlgen_ss[xmlsec_secsize];
 
14
char *xmlgen_mem;
 
15
char *xmlgen_feel_mem;
 
16
long xmlgen_real_maxsec;
 
17
unsigned long xmlgen_maxsize;
 
18
unsigned long xmlgen_header_size;
 
19
 
 
20
char *xmlgen_strgen(int size) {
 
21
    int i;
 
22
    char *s;
 
23
    
 
24
    s=(char*)malloc(size+1);
 
25
 
 
26
#ifdef CYRILLIC_TEXT
 
27
    for (i=0;i<size;i++) s[i]=rnd_cyr();
 
28
#else
 
29
    for (i=0;i<size;i++) s[i]=rnd_char();
 
30
#endif
 
31
 
 
32
    s[size]=0;
 
33
    return s;
 
34
}
 
35
 
 
36
void xmlgen_gensec(char *str) {
 
37
    char *s1,*s2;
 
38
    
 
39
    s1=xmlgen_strgen(strlength);
 
40
    s2=xmlgen_strgen(strlength);
 
41
    sprintf(xmlgen_ss,"<item><title>%s</title><note>%s</note><quantity>%u</quantity><price>%.2f</price></item>\n",
 
42
        s1,s2,1+rand()/(RAND_MAX/98),0.1+((double)rand())/(RAND_MAX/99));
 
43
    free(s1);
 
44
    free(s2);
 
45
    strcat(str,xmlgen_ss);
 
46
}
 
47
 
 
48
int xmlgen_genfirst(char *str,int maxsize,int maxsec) {
 
49
    int i,max,size,fullsize;
 
50
    char *s1,*s2,*s3,*s4,*s5;
 
51
 
 
52
    s1=xmlgen_strgen(strlength);
 
53
    s2=xmlgen_strgen(strlength);
 
54
    s3=xmlgen_strgen(strlength);
 
55
    s4=xmlgen_strgen(strlength);
 
56
    s5=xmlgen_strgen(strlength);
 
57
    sprintf(xmlgen_s,"<shiporder orderid=\"%06u\"><orderperson>%s</orderperson><shipto><name>%s</name><address>%s</address><city>%s</city><country>%s</country></shipto>\n",
 
58
            rand()/(RAND_MAX/100000),s1,s2,s3,s4,s5);
 
59
    free(s1);
 
60
    free(s2);
 
61
    free(s3);
 
62
    free(s4);
 
63
    free(s5);
 
64
    strcat(str,xmlgen_s);
 
65
    fullsize=strlen(xmlgen_s);
 
66
    
 
67
    xmlgen_gensec(str);
 
68
    size=strlen(xmlgen_ss)+10;
 
69
    fullsize+=(size-10);
 
70
        
 
71
    max=(maxsize-fullsize-13)/size;
 
72
    if (max>maxsec) max=maxsec;
 
73
    max=rand()/(RAND_MAX/max);
 
74
 
 
75
    for (i=0;i<max;i++) {
 
76
        xmlgen_gensec(str);
 
77
        fullsize+=strlen(xmlgen_ss);
 
78
    }
 
79
    strcat(str,"</shiporder>\n");
 
80
    fullsize+=strlen("</shiporder>\n");
 
81
    return fullsize;
 
82
 
 
83
}
 
84
 
 
85
char *xmlgen_init(int maxsize) {
 
86
    
 
87
    if (maxsize<xmlsec_min_maxsize) maxsize=xmlsec_min_maxsize;
 
88
    
 
89
    xmlgen_mem=(char*)malloc(maxsize+1);
 
90
    if (!xmlgen_mem) {
 
91
        fprintf(stderr,"Can't allocate %lu bytes of memory!\n",maxsize+1);
 
92
        exit(0);
 
93
    }
 
94
 
 
95
    xmlgen_real_maxsec = (long)( ( maxsize / xmlsec_minpri ) - xmlsec_basesize ) / xmlsec_secsize;
 
96
    if (2*xmlgen_real_maxsec<xmlsec_minpri) {
 
97
        xmlgen_real_maxsec = (long)(sqrt((double)(xmlsec_basesize*xmlsec_basesize+4*xmlsec_secsize*maxsize))-xmlsec_basesize)/(2*xmlsec_secsize);
 
98
    }
 
99
    if (xmlgen_real_maxsec<2) xmlgen_real_maxsec=2;
 
100
    if (xmlgen_real_maxsec>xmlsec_maxsec) xmlgen_real_maxsec=xmlsec_maxsec;
 
101
    
 
102
#if defined(ORACLE_PARSER_FIX)
 
103
    strcpy(xmlgen_mem,"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"../xml.files/generated.xsl\"?>\n<data xmlns:xsi=\"http://www.w3.org/2000/08/XMLSchema-instance\">\n");
 
104
#elif defined(PARABIX_PARSER_FIX)
 
105
    strcpy(xmlgen_mem,"<data>\n");
 
106
#else
 
107
    strcpy(xmlgen_mem,"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"../xml.files/generated.xsl\"?>\n<data xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"../xml.files/generated.xsd\">\n");
 
108
#endif
 
109
    xmlgen_header_size = strlen(xmlgen_mem);
 
110
    
 
111
    xmlgen_feel_mem=xmlgen_mem + xmlgen_header_size;
 
112
 
 
113
    xmlgen_maxsize=maxsize - xmlgen_header_size;
 
114
 
 
115
    return xmlgen_mem;
 
116
}
 
117
 
 
118
void xmlgen_deinit() {
 
119
    free(xmlgen_mem);
 
120
}
 
121
 
 
122
unsigned long xmlgen() {
 
123
    int i;
 
124
    char *s=xmlgen_feel_mem;
 
125
    unsigned long maxsize=xmlgen_maxsize;
 
126
    unsigned long size;
 
127
    *s=0;    
 
128
    for (i=0;((i<xmlsec_maxpri)&&(maxsize>xmlsec_basesize));i++) {
 
129
        size=xmlgen_genfirst(s,maxsize,xmlgen_real_maxsec);
 
130
        maxsize-=size;
 
131
        s+=size;
 
132
    }
 
133
    strcat(s,"</data>");
 
134
    return xmlgen_header_size + (xmlgen_maxsize - maxsize) + 7;
 
135
}