@@ -139,6 +139,23 @@ make_pagemap_from_ptrack_1(parray *files, PGconn *backup_conn)
139
139
}
140
140
}
141
141
142
+ /*
143
+ * Parse a string like "2.1" into int
144
+ * result: int by formula major_number * 100 + minor_number
145
+ * or -1 if string cannot be parsed
146
+ */
147
+ static int
148
+ ptrack_parse_version_string (const char * version_str )
149
+ {
150
+ int ma , mi ;
151
+ int sscanf_readed_count ;
152
+ if (sscanf (version_str , "%u.%2u%n" , & ma , & mi , & sscanf_readed_count ) != 2 )
153
+ return -1 ;
154
+ if (sscanf_readed_count != strlen (version_str ))
155
+ return -1 ;
156
+ return ma * 100 + mi ;
157
+ }
158
+
142
159
/* Check if the instance supports compatible version of ptrack,
143
160
* fill-in version number if it does.
144
161
* Also for ptrack 2.x save schema namespace.
@@ -148,6 +165,7 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
148
165
{
149
166
PGresult * res_db ;
150
167
char * ptrack_version_str ;
168
+ int ptrack_version_num ;
151
169
152
170
res_db = pgut_execute (backup_conn ,
153
171
"SELECT extnamespace::regnamespace, extversion "
@@ -191,24 +209,16 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
191
209
ptrack_version_str = PQgetvalue (res_db , 0 , 0 );
192
210
}
193
211
194
- if (strcmp (ptrack_version_str , "1.5" ) == 0 )
195
- nodeInfo -> ptrack_version_num = 15 ;
196
- else if (strcmp (ptrack_version_str , "1.6" ) == 0 )
197
- nodeInfo -> ptrack_version_num = 16 ;
198
- else if (strcmp (ptrack_version_str , "1.7" ) == 0 )
199
- nodeInfo -> ptrack_version_num = 17 ;
200
- else if (strcmp (ptrack_version_str , "2.0" ) == 0 )
201
- nodeInfo -> ptrack_version_num = 20 ;
202
- else if (strcmp (ptrack_version_str , "2.1" ) == 0 )
203
- nodeInfo -> ptrack_version_num = 21 ;
204
- else if (strcmp (ptrack_version_str , "2.2" ) == 0 )
205
- nodeInfo -> ptrack_version_num = 22 ;
206
- else
207
- elog (WARNING , "Update your ptrack to the version 2.1 or upper. Current version is %s" ,
212
+ ptrack_version_num = ptrack_parse_version_string (ptrack_version_str );
213
+ if (ptrack_version_num == -1 )
214
+ /* leave default nodeInfo->ptrack_version_num = 0 from pgNodeInit() */
215
+ elog (WARNING , "Cannot parse ptrack version string \"%s\"" ,
208
216
ptrack_version_str );
217
+ else
218
+ nodeInfo -> ptrack_version_num = ptrack_version_num ;
209
219
210
220
/* ptrack 1.X is buggy, so fall back to DELTA backup strategy for safety */
211
- if (nodeInfo -> ptrack_version_num >= 15 && nodeInfo -> ptrack_version_num < 20 )
221
+ if (nodeInfo -> ptrack_version_num >= 105 && nodeInfo -> ptrack_version_num < 200 )
212
222
{
213
223
if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
214
224
{
@@ -231,12 +241,12 @@ pg_ptrack_enable(PGconn *backup_conn, int ptrack_version_num)
231
241
PGresult * res_db ;
232
242
bool result = false;
233
243
234
- if (ptrack_version_num < 20 )
244
+ if (ptrack_version_num < 200 )
235
245
{
236
246
res_db = pgut_execute (backup_conn , "SHOW ptrack_enable" , 0 , NULL );
237
247
result = strcmp (PQgetvalue (res_db , 0 , 0 ), "on" ) == 0 ;
238
248
}
239
- else if (ptrack_version_num == 20 )
249
+ else if (ptrack_version_num == 200 )
240
250
{
241
251
res_db = pgut_execute (backup_conn , "SHOW ptrack_map_size" , 0 , NULL );
242
252
result = strcmp (PQgetvalue (res_db , 0 , 0 ), "0" ) != 0 ;
@@ -270,7 +280,7 @@ pg_ptrack_clear(PGconn *backup_conn, int ptrack_version_num)
270
280
char * params [2 ];
271
281
272
282
// FIXME Perform this check on caller's side
273
- if (ptrack_version_num >= 20 )
283
+ if (ptrack_version_num >= 200 )
274
284
return ;
275
285
276
286
params [0 ] = palloc (64 );
@@ -472,14 +482,14 @@ get_last_ptrack_lsn(PGconn *backup_conn, PGNodeInfo *nodeInfo)
472
482
uint32 lsn_lo ;
473
483
XLogRecPtr lsn ;
474
484
475
- if (nodeInfo -> ptrack_version_num < 20 )
485
+ if (nodeInfo -> ptrack_version_num < 200 )
476
486
res = pgut_execute (backup_conn , "SELECT pg_catalog.pg_ptrack_control_lsn()" ,
477
487
0 , NULL );
478
488
else
479
489
{
480
490
char query [128 ];
481
491
482
- if (nodeInfo -> ptrack_version_num == 20 )
492
+ if (nodeInfo -> ptrack_version_num == 200 )
483
493
sprintf (query , "SELECT %s.pg_ptrack_control_lsn()" , nodeInfo -> ptrack_schema );
484
494
else
485
495
sprintf (query , "SELECT %s.ptrack_init_lsn()" , nodeInfo -> ptrack_schema );
@@ -537,7 +547,7 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
537
547
538
548
// elog(LOG, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
539
549
540
- if (ptrack_version_num < 20 )
550
+ if (ptrack_version_num < 200 )
541
551
res = pgut_execute_parallel (arguments -> conn ,
542
552
arguments -> cancel_conn ,
543
553
"SELECT pg_catalog.pg_ptrack_get_block_2($1, $2, $3, $4)" ,
@@ -550,7 +560,7 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
550
560
if (!ptrack_schema )
551
561
elog (ERROR , "Schema name of ptrack extension is missing" );
552
562
553
- if (ptrack_version_num == 20 )
563
+ if (ptrack_version_num == 200 )
554
564
sprintf (query , "SELECT %s.pg_ptrack_get_block($1, $2, $3, $4)" , ptrack_schema );
555
565
else
556
566
elog (ERROR , "ptrack >= 2.1.0 does not support pg_ptrack_get_block()" );
@@ -614,7 +624,7 @@ pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema,
614
624
if (!ptrack_schema )
615
625
elog (ERROR , "Schema name of ptrack extension is missing" );
616
626
617
- if (ptrack_version_num == 20 )
627
+ if (ptrack_version_num == 200 )
618
628
sprintf (query , "SELECT path, pagemap FROM %s.pg_ptrack_get_pagemapset($1) ORDER BY 1" ,
619
629
ptrack_schema );
620
630
else
0 commit comments