1414#include < pqxx/transaction>
1515#include < pqxx/nontransaction>
1616#include < pqxx/pipeline>
17+ #include < pqxx/tablewriter>
1718#include < pqxx/version>
1819
1920using namespace std ;
@@ -44,6 +45,7 @@ struct config
4445 int initialSize;
4546 bool useSystemTime;
4647 bool noPK;
48+ bool useCopy;
4749 string connection;
4850
4951 config () {
@@ -55,6 +57,7 @@ struct config
5557 transactionSize = 100 ;
5658 useSystemTime = false ;
5759 noPK = false ;
60+ useCopy = false ;
5861 }
5962};
6063
@@ -105,10 +108,25 @@ void* inserter(void* arg)
105108 work txn (con);
106109 if (cfg.useSystemTime )
107110 {
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+ }
112130 } else {
113131 txn.prepared (" insert" )(curr)(curr+cfg.transactionSize -1 ).exec ();
114132 curr += cfg.transactionSize ;
@@ -167,9 +185,23 @@ void initializeDatabase()
167185 }
168186 if (cfg.useSystemTime )
169187 {
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+ }
173205 }
174206 } else {
175207 txn.prepared (" insert" )(cfg.initialSize )(cfg.initialSize -1 ).exec ();
@@ -235,6 +267,9 @@ int main (int argc, char* argv[])
235267 case ' p' :
236268 cfg.noPK = true ;
237269 continue ;
270+ case ' C' :
271+ cfg.useCopy = true ;
272+ continue ;
238273 }
239274 }
240275 printf (" Options:\n "
@@ -246,6 +281,7 @@ int main (int argc, char* argv[])
246281 " \t -i N\t initial table size (1000000)\n "
247282 " \t -q\t use system time and libpq\n "
248283 " \t -p\t no primary key\n "
284+ " \t -C\t use COPY command\n "
249285 " \t -c STR\t database connection string\n " );
250286 return 1 ;
251287 }
0 commit comments