|
|
|
@ -108,20 +108,18 @@ create_rel_filename_map(const char *old_data, const char *new_data, |
|
|
|
|
* relation belongs to the default tablespace, hence relfiles should |
|
|
|
|
* exist in the data directories. |
|
|
|
|
*/ |
|
|
|
|
strlcpy(map->old_tablespace, old_data, sizeof(map->old_tablespace)); |
|
|
|
|
strlcpy(map->new_tablespace, new_data, sizeof(map->new_tablespace)); |
|
|
|
|
strlcpy(map->old_tablespace_suffix, "/base", sizeof(map->old_tablespace_suffix)); |
|
|
|
|
strlcpy(map->new_tablespace_suffix, "/base", sizeof(map->new_tablespace_suffix)); |
|
|
|
|
map->old_tablespace = old_data; |
|
|
|
|
map->new_tablespace = new_data; |
|
|
|
|
map->old_tablespace_suffix = "/base"; |
|
|
|
|
map->new_tablespace_suffix = "/base"; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
/* relation belongs to a tablespace, so use the tablespace location */ |
|
|
|
|
strlcpy(map->old_tablespace, old_rel->tablespace, sizeof(map->old_tablespace)); |
|
|
|
|
strlcpy(map->new_tablespace, new_rel->tablespace, sizeof(map->new_tablespace)); |
|
|
|
|
strlcpy(map->old_tablespace_suffix, old_cluster.tablespace_suffix, |
|
|
|
|
sizeof(map->old_tablespace_suffix)); |
|
|
|
|
strlcpy(map->new_tablespace_suffix, new_cluster.tablespace_suffix, |
|
|
|
|
sizeof(map->new_tablespace_suffix)); |
|
|
|
|
map->old_tablespace = old_rel->tablespace; |
|
|
|
|
map->new_tablespace = new_rel->tablespace; |
|
|
|
|
map->old_tablespace_suffix = old_cluster.tablespace_suffix; |
|
|
|
|
map->new_tablespace_suffix = new_cluster.tablespace_suffix; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
map->old_db_oid = old_db->db_oid; |
|
|
|
@ -231,7 +229,7 @@ get_db_infos(ClusterInfo *cluster) |
|
|
|
|
{ |
|
|
|
|
dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid)); |
|
|
|
|
dbinfos[tupnum].db_name = pg_strdup(PQgetvalue(res, tupnum, i_datname)); |
|
|
|
|
snprintf(dbinfos[tupnum].db_tblspace, sizeof(dbinfos[tupnum].db_tblspace), "%s", |
|
|
|
|
snprintf(dbinfos[tupnum].db_tablespace, sizeof(dbinfos[tupnum].db_tablespace), "%s", |
|
|
|
|
PQgetvalue(res, tupnum, i_spclocation)); |
|
|
|
|
} |
|
|
|
|
PQclear(res); |
|
|
|
@ -264,6 +262,7 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo) |
|
|
|
|
int num_rels = 0; |
|
|
|
|
char *nspname = NULL; |
|
|
|
|
char *relname = NULL; |
|
|
|
|
char *tablespace = NULL; |
|
|
|
|
int i_spclocation, |
|
|
|
|
i_nspname, |
|
|
|
|
i_relname, |
|
|
|
@ -271,6 +270,7 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo) |
|
|
|
|
i_relfilenode, |
|
|
|
|
i_reltablespace; |
|
|
|
|
char query[QUERY_ALLOC]; |
|
|
|
|
char *last_namespace = NULL, *last_tablespace = NULL; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* pg_largeobject contains user data that does not appear in pg_dumpall |
|
|
|
@ -366,26 +366,53 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo) |
|
|
|
|
for (relnum = 0; relnum < ntups; relnum++) |
|
|
|
|
{ |
|
|
|
|
RelInfo *curr = &relinfos[num_rels++]; |
|
|
|
|
const char *tblspace; |
|
|
|
|
|
|
|
|
|
curr->reloid = atooid(PQgetvalue(res, relnum, i_oid)); |
|
|
|
|
|
|
|
|
|
nspname = PQgetvalue(res, relnum, i_nspname); |
|
|
|
|
curr->nspname = pg_strdup(nspname); |
|
|
|
|
curr->nsp_alloc = false; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Many of the namespace and tablespace strings are identical, |
|
|
|
|
* so we try to reuse the allocated string pointers where possible |
|
|
|
|
* to reduce memory consumption. |
|
|
|
|
*/ |
|
|
|
|
/* Can we reuse the previous string allocation? */ |
|
|
|
|
if (last_namespace && strcmp(nspname, last_namespace) == 0) |
|
|
|
|
curr->nspname = last_namespace; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
last_namespace = curr->nspname = pg_strdup(nspname); |
|
|
|
|
curr->nsp_alloc = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
relname = PQgetvalue(res, relnum, i_relname); |
|
|
|
|
curr->relname = pg_strdup(relname); |
|
|
|
|
|
|
|
|
|
curr->relfilenode = atooid(PQgetvalue(res, relnum, i_relfilenode)); |
|
|
|
|
curr->tblsp_alloc = false; |
|
|
|
|
|
|
|
|
|
/* Is the tablespace oid non-zero? */ |
|
|
|
|
if (atooid(PQgetvalue(res, relnum, i_reltablespace)) != 0) |
|
|
|
|
/* Might be "", meaning the cluster default location. */ |
|
|
|
|
tblspace = PQgetvalue(res, relnum, i_spclocation); |
|
|
|
|
{ |
|
|
|
|
/*
|
|
|
|
|
* The tablespace location might be "", meaning the cluster |
|
|
|
|
* default location, i.e. pg_default or pg_global. |
|
|
|
|
*/ |
|
|
|
|
tablespace = PQgetvalue(res, relnum, i_spclocation); |
|
|
|
|
|
|
|
|
|
/* Can we reuse the previous string allocation? */ |
|
|
|
|
if (last_tablespace && strcmp(tablespace, last_tablespace) == 0) |
|
|
|
|
curr->tablespace = last_tablespace; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
last_tablespace = curr->tablespace = pg_strdup(tablespace); |
|
|
|
|
curr->tblsp_alloc = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
/* A zero reltablespace indicates the database tablespace. */ |
|
|
|
|
tblspace = dbinfo->db_tblspace; |
|
|
|
|
|
|
|
|
|
strlcpy(curr->tablespace, tblspace, sizeof(curr->tablespace)); |
|
|
|
|
/* A zero reltablespace oid indicates the database tablespace. */ |
|
|
|
|
curr->tablespace = dbinfo->db_tablespace; |
|
|
|
|
} |
|
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
@ -419,8 +446,11 @@ free_rel_infos(RelInfoArr *rel_arr) |
|
|
|
|
|
|
|
|
|
for (relnum = 0; relnum < rel_arr->nrels; relnum++) |
|
|
|
|
{ |
|
|
|
|
pg_free(rel_arr->rels[relnum].nspname); |
|
|
|
|
if (rel_arr->rels[relnum].nsp_alloc) |
|
|
|
|
pg_free(rel_arr->rels[relnum].nspname); |
|
|
|
|
pg_free(rel_arr->rels[relnum].relname); |
|
|
|
|
if (rel_arr->rels[relnum].tblsp_alloc) |
|
|
|
|
pg_free(rel_arr->rels[relnum].tablespace); |
|
|
|
|
} |
|
|
|
|
pg_free(rel_arr->rels); |
|
|
|
|
rel_arr->nrels = 0; |
|
|
|
|