@@ -139,6 +139,23 @@ make_pagemap_from_ptrack_1(parray *files, PGconn *backup_conn)
139139 }
140140}
141141
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+
142159/* Check if the instance supports compatible version of ptrack,
143160 * fill-in version number if it does.
144161 * Also for ptrack 2.x save schema namespace.
@@ -148,6 +165,7 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
148165{
149166 PGresult * res_db ;
150167 char * ptrack_version_str ;
168+ int ptrack_version_num ;
151169
152170 res_db = pgut_execute (backup_conn ,
153171 "SELECT extnamespace::regnamespace, extversion "
@@ -191,24 +209,16 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
191209 ptrack_version_str = PQgetvalue (res_db , 0 , 0 );
192210 }
193211
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\"" ,
208216 ptrack_version_str );
217+ else
218+ nodeInfo -> ptrack_version_num = ptrack_version_num ;
209219
210220 /* 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 )
212222 {
213223 if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
214224 {
@@ -231,12 +241,12 @@ pg_ptrack_enable(PGconn *backup_conn, int ptrack_version_num)
231241 PGresult * res_db ;
232242 bool result = false;
233243
234- if (ptrack_version_num < 20 )
244+ if (ptrack_version_num < 200 )
235245 {
236246 res_db = pgut_execute (backup_conn , "SHOW ptrack_enable" , 0 , NULL );
237247 result = strcmp (PQgetvalue (res_db , 0 , 0 ), "on" ) == 0 ;
238248 }
239- else if (ptrack_version_num == 20 )
249+ else if (ptrack_version_num == 200 )
240250 {
241251 res_db = pgut_execute (backup_conn , "SHOW ptrack_map_size" , 0 , NULL );
242252 result = strcmp (PQgetvalue (res_db , 0 , 0 ), "0" ) != 0 ;
@@ -270,7 +280,7 @@ pg_ptrack_clear(PGconn *backup_conn, int ptrack_version_num)
270280 char * params [2 ];
271281
272282 // FIXME Perform this check on caller's side
273- if (ptrack_version_num >= 20 )
283+ if (ptrack_version_num >= 200 )
274284 return ;
275285
276286 params [0 ] = palloc (64 );
@@ -472,14 +482,14 @@ get_last_ptrack_lsn(PGconn *backup_conn, PGNodeInfo *nodeInfo)
472482 uint32 lsn_lo ;
473483 XLogRecPtr lsn ;
474484
475- if (nodeInfo -> ptrack_version_num < 20 )
485+ if (nodeInfo -> ptrack_version_num < 200 )
476486 res = pgut_execute (backup_conn , "SELECT pg_catalog.pg_ptrack_control_lsn()" ,
477487 0 , NULL );
478488 else
479489 {
480490 char query [128 ];
481491
482- if (nodeInfo -> ptrack_version_num == 20 )
492+ if (nodeInfo -> ptrack_version_num == 200 )
483493 sprintf (query , "SELECT %s.pg_ptrack_control_lsn()" , nodeInfo -> ptrack_schema );
484494 else
485495 sprintf (query , "SELECT %s.ptrack_init_lsn()" , nodeInfo -> ptrack_schema );
@@ -537,7 +547,7 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
537547
538548 // elog(LOG, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
539549
540- if (ptrack_version_num < 20 )
550+ if (ptrack_version_num < 200 )
541551 res = pgut_execute_parallel (arguments -> conn ,
542552 arguments -> cancel_conn ,
543553 "SELECT pg_catalog.pg_ptrack_get_block_2($1, $2, $3, $4)" ,
@@ -550,7 +560,7 @@ pg_ptrack_get_block(ConnectionArgs *arguments,
550560 if (!ptrack_schema )
551561 elog (ERROR , "Schema name of ptrack extension is missing" );
552562
553- if (ptrack_version_num == 20 )
563+ if (ptrack_version_num == 200 )
554564 sprintf (query , "SELECT %s.pg_ptrack_get_block($1, $2, $3, $4)" , ptrack_schema );
555565 else
556566 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,
614624 if (!ptrack_schema )
615625 elog (ERROR , "Schema name of ptrack extension is missing" );
616626
617- if (ptrack_version_num == 20 )
627+ if (ptrack_version_num == 200 )
618628 sprintf (query , "SELECT path, pagemap FROM %s.pg_ptrack_get_pagemapset($1) ORDER BY 1" ,
619629 ptrack_schema );
620630 else
0 commit comments