14
14
#include < pqxx/transaction>
15
15
#include < pqxx/nontransaction>
16
16
#include < pqxx/pipeline>
17
+ #include < pqxx/tablewriter>
17
18
#include < pqxx/version>
18
19
19
20
using namespace std ;
@@ -44,6 +45,7 @@ struct config
44
45
int initialSize;
45
46
bool useSystemTime;
46
47
bool noPK;
48
+ bool useCopy;
47
49
string connection;
48
50
49
51
config () {
@@ -55,6 +57,7 @@ struct config
55
57
transactionSize = 100 ;
56
58
useSystemTime = false ;
57
59
noPK = false ;
60
+ useCopy = false ;
58
61
}
59
62
};
60
63
@@ -105,10 +108,25 @@ void* inserter(void* arg)
105
108
work txn (con);
106
109
if (cfg.useSystemTime )
107
110
{
108
- for (int j = 0 ; j < cfg.transactionSize ; j++)
109
- {
110
- txn.prepared (" insert" )(getCurrentTime ())(random ())(random ())(random ())(random ())(random ())(random ())(random ())(random ()).exec ();
111
- }
111
+ if (cfg.useCopy )
112
+ {
113
+ tablewriter writer (txn," t" );
114
+ vector<int64_t > row (9 );
115
+ for (int j = 0 ; j < cfg.transactionSize ; j++)
116
+ {
117
+ row[0 ] = getCurrentTime ();
118
+ for (int c = 1 ; c <= 8 ; c++) {
119
+ row[c] = random ();
120
+ }
121
+ writer << row;
122
+ }
123
+ writer.complete ();
124
+ } else {
125
+ for (int j = 0 ; j < cfg.transactionSize ; j++)
126
+ {
127
+ txn.prepared (" insert" )(getCurrentTime ())(random ())(random ())(random ())(random ())(random ())(random ())(random ())(random ()).exec ();
128
+ }
129
+ }
112
130
} else {
113
131
txn.prepared (" insert" )(curr)(curr+cfg.transactionSize -1 ).exec ();
114
132
curr += cfg.transactionSize ;
@@ -167,9 +185,23 @@ void initializeDatabase()
167
185
}
168
186
if (cfg.useSystemTime )
169
187
{
170
- for (int i = 0 ; i < cfg.initialSize ; i++)
171
- {
172
- txn.prepared (" insert" )(getCurrentTime ())(random ())(random ())(random ())(random ())(random ())(random ())(random ())(random ()).exec ();
188
+ if (cfg.useCopy ) {
189
+ tablewriter writer (txn," t" );
190
+ vector<int64_t > row (9 );
191
+ for (int i = 0 ; i < cfg.initialSize ; i++)
192
+ {
193
+ row[0 ] = getCurrentTime ();
194
+ for (int c = 1 ; c <= 8 ; c++) {
195
+ row[c] = random ();
196
+ }
197
+ writer << row;
198
+ }
199
+ writer.complete ();
200
+ } else {
201
+ for (int i = 0 ; i < cfg.initialSize ; i++)
202
+ {
203
+ txn.prepared (" insert" )(getCurrentTime ())(random ())(random ())(random ())(random ())(random ())(random ())(random ())(random ()).exec ();
204
+ }
173
205
}
174
206
} else {
175
207
txn.prepared (" insert" )(cfg.initialSize )(cfg.initialSize -1 ).exec ();
@@ -235,6 +267,9 @@ int main (int argc, char* argv[])
235
267
case ' p' :
236
268
cfg.noPK = true ;
237
269
continue ;
270
+ case ' C' :
271
+ cfg.useCopy = true ;
272
+ continue ;
238
273
}
239
274
}
240
275
printf (" Options:\n "
@@ -246,6 +281,7 @@ int main (int argc, char* argv[])
246
281
" \t -i N\t initial table size (1000000)\n "
247
282
" \t -q\t use system time and libpq\n "
248
283
" \t -p\t no primary key\n "
284
+ " \t -C\t use COPY command\n "
249
285
" \t -c STR\t database connection string\n " );
250
286
return 1 ;
251
287
}
0 commit comments