@@ -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{
149166PGresult * res_db ;
150167char * ptrack_version_str ;
168+ int ptrack_version_num ;
151169
152170res_db = pgut_execute (backup_conn ,
153171"SELECT extnamespace::regnamespace, extversion "
@@ -191,24 +209,16 @@ get_ptrack_version(PGconn *backup_conn, PGNodeInfo *nodeInfo)
191209ptrack_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\"" ,
208216ptrack_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{
213223if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
214224{
@@ -231,12 +241,12 @@ pg_ptrack_enable(PGconn *backup_conn, int ptrack_version_num)
231241PGresult * res_db ;
232242bool result = false;
233243
234- if (ptrack_version_num < 20 )
244+ if (ptrack_version_num < 200 )
235245{
236246res_db = pgut_execute (backup_conn ,"SHOW ptrack_enable" ,0 ,NULL );
237247result = strcmp (PQgetvalue (res_db ,0 ,0 ),"on" )== 0 ;
238248}
239- else if (ptrack_version_num == 20 )
249+ else if (ptrack_version_num == 200 )
240250{
241251res_db = pgut_execute (backup_conn ,"SHOW ptrack_map_size" ,0 ,NULL );
242252result = strcmp (PQgetvalue (res_db ,0 ,0 ),"0" )!= 0 ;
@@ -270,7 +280,7 @@ pg_ptrack_clear(PGconn *backup_conn, int ptrack_version_num)
270280char * params [2 ];
271281
272282// FIXME Perform this check on caller's side
273- if (ptrack_version_num >=20 )
283+ if (ptrack_version_num >=200 )
274284return ;
275285
276286params [0 ]= palloc (64 );
@@ -472,14 +482,14 @@ get_last_ptrack_lsn(PGconn *backup_conn, PGNodeInfo *nodeInfo)
472482uint32 lsn_lo ;
473483XLogRecPtr lsn ;
474484
475- if (nodeInfo -> ptrack_version_num < 20 )
485+ if (nodeInfo -> ptrack_version_num < 200 )
476486res = pgut_execute (backup_conn ,"SELECT pg_catalog.pg_ptrack_control_lsn()" ,
4774870 ,NULL );
478488else
479489{
480490char query [128 ];
481491
482- if (nodeInfo -> ptrack_version_num == 20 )
492+ if (nodeInfo -> ptrack_version_num == 200 )
483493sprintf (query ,"SELECT %s.pg_ptrack_control_lsn()" ,nodeInfo -> ptrack_schema );
484494else
485495sprintf (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 )
541551res = pgut_execute_parallel (arguments -> conn ,
542552arguments -> 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,
550560if (!ptrack_schema )
551561elog (ERROR ,"Schema name of ptrack extension is missing" );
552562
553- if (ptrack_version_num == 20 )
563+ if (ptrack_version_num == 200 )
554564sprintf (query ,"SELECT %s.pg_ptrack_get_block($1, $2, $3, $4)" ,ptrack_schema );
555565else
556566elog (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,
614624if (!ptrack_schema )
615625elog (ERROR ,"Schema name of ptrack extension is missing" );
616626
617- if (ptrack_version_num == 20 )
627+ if (ptrack_version_num == 200 )
618628sprintf (query ,"SELECT path, pagemap FROM %s.pg_ptrack_get_pagemapset($1) ORDER BY 1" ,
619629ptrack_schema );
620630else