ExtensionInfo *extinfo;
InhInfo *inhinfo;
int numTables;
- int numTypes;
- int numFuncs;
- int numOperators;
- int numCollations;
- int numNamespaces;
int numExtensions;
- int numPublications;
- int numAggregates;
int numInherits;
- int numRules;
- int numProcLangs;
- int numCasts;
- int numTransforms;
- int numAccessMethods;
- int numOpclasses;
- int numOpfamilies;
- int numConversions;
- int numTSParsers;
- int numTSTemplates;
- int numTSDicts;
- int numTSConfigs;
- int numForeignDataWrappers;
- int numForeignServers;
- int numDefaultACLs;
- int numEventTriggers;
/*
* We must read extensions and extension membership info first, because
getExtensionMembership(fout, extinfo, numExtensions);
pg_log_info("reading schemas");
- (void) getNamespaces(fout, &numNamespaces);
+ getNamespaces(fout);
/*
* getTables should be done as soon as possible, so as to minimize the
getOwnedSeqs(fout, tblinfo, numTables);
pg_log_info("reading user-defined functions");
- (void) getFuncs(fout, &numFuncs);
+ getFuncs(fout);
/* this must be after getTables and getFuncs */
pg_log_info("reading user-defined types");
- (void) getTypes(fout, &numTypes);
+ getTypes(fout);
/* this must be after getFuncs, too */
pg_log_info("reading procedural languages");
- getProcLangs(fout, &numProcLangs);
+ getProcLangs(fout);
pg_log_info("reading user-defined aggregate functions");
- getAggregates(fout, &numAggregates);
+ getAggregates(fout);
pg_log_info("reading user-defined operators");
- (void) getOperators(fout, &numOperators);
+ getOperators(fout);
pg_log_info("reading user-defined access methods");
- getAccessMethods(fout, &numAccessMethods);
+ getAccessMethods(fout);
pg_log_info("reading user-defined operator classes");
- getOpclasses(fout, &numOpclasses);
+ getOpclasses(fout);
pg_log_info("reading user-defined operator families");
- getOpfamilies(fout, &numOpfamilies);
+ getOpfamilies(fout);
pg_log_info("reading user-defined text search parsers");
- getTSParsers(fout, &numTSParsers);
+ getTSParsers(fout);
pg_log_info("reading user-defined text search templates");
- getTSTemplates(fout, &numTSTemplates);
+ getTSTemplates(fout);
pg_log_info("reading user-defined text search dictionaries");
- getTSDictionaries(fout, &numTSDicts);
+ getTSDictionaries(fout);
pg_log_info("reading user-defined text search configurations");
- getTSConfigurations(fout, &numTSConfigs);
+ getTSConfigurations(fout);
pg_log_info("reading user-defined foreign-data wrappers");
- getForeignDataWrappers(fout, &numForeignDataWrappers);
+ getForeignDataWrappers(fout);
pg_log_info("reading user-defined foreign servers");
- getForeignServers(fout, &numForeignServers);
+ getForeignServers(fout);
pg_log_info("reading default privileges");
- getDefaultACLs(fout, &numDefaultACLs);
+ getDefaultACLs(fout);
pg_log_info("reading user-defined collations");
- (void) getCollations(fout, &numCollations);
+ getCollations(fout);
pg_log_info("reading user-defined conversions");
- getConversions(fout, &numConversions);
+ getConversions(fout);
pg_log_info("reading type casts");
- getCasts(fout, &numCasts);
+ getCasts(fout);
pg_log_info("reading transforms");
- getTransforms(fout, &numTransforms);
+ getTransforms(fout);
pg_log_info("reading table inheritance information");
inhinfo = getInherits(fout, &numInherits);
pg_log_info("reading event triggers");
- getEventTriggers(fout, &numEventTriggers);
+ getEventTriggers(fout);
/* Identify extension configuration tables that should be dumped */
pg_log_info("finding extension tables");
getTriggers(fout, tblinfo, numTables);
pg_log_info("reading rewrite rules");
- getRules(fout, &numRules);
+ getRules(fout);
pg_log_info("reading policies");
getPolicies(fout, tblinfo, numTables);
pg_log_info("reading publications");
- (void) getPublications(fout, &numPublications);
+ getPublications(fout);
pg_log_info("reading publication membership of tables");
getPublicationTables(fout, tblinfo, numTables);
* getPublications
* get information about publications
*/
-PublicationInfo *
-getPublications(Archive *fout, int *numPublications)
+void
+getPublications(Archive *fout)
{
DumpOptions *dopt = fout->dopt;
PQExpBuffer query;
ntups;
if (dopt->no_publications || fout->remoteVersion < 100000)
- {
- *numPublications = 0;
- return NULL;
- }
+ return;
query = createPQExpBuffer();
PQclear(res);
destroyPQExpBuffer(query);
-
- *numPublications = ntups;
- return pubinfo;
}
/*
/*
* getNamespaces:
- * read all namespaces in the system catalogs and return them in the
- * NamespaceInfo* structure
- *
- * numNamespaces is set to the number of namespaces read in
+ * get information about all namespaces in the system catalogs
*/
-NamespaceInfo *
-getNamespaces(Archive *fout, int *numNamespaces)
+void
+getNamespaces(Archive *fout)
{
PGresult *res;
int ntups;
PQclear(res);
destroyPQExpBuffer(query);
-
- *numNamespaces = ntups;
-
- return nsinfo;
}
/*
/*
* getTypes:
- * read all types in the system catalogs and return them in the
- * TypeInfo* structure
- *
- * numTypes is set to the number of types read in
+ * get information about all types in the system catalogs
*
* NB: this must run after getFuncs() because we assume we can do
* findFuncByOid().
*/
-TypeInfo *
-getTypes(Archive *fout, int *numTypes)
+void
+getTypes(Archive *fout)
{
PGresult *res;
int ntups;
}
}
- *numTypes = ntups;
-
PQclear(res);
destroyPQExpBuffer(query);
-
- return tyinfo;
}
/*
* getOperators:
- * read all operators in the system catalogs and return them in the
- * OprInfo* structure
- *
- * numOprs is set to the number of operators read in
+ * get information about all operators in the system catalogs
*/
-OprInfo *
-getOperators(Archive *fout, int *numOprs)
+void
+getOperators(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numOprs = ntups;
oprinfo = (OprInfo *) pg_malloc(ntups * sizeof(OprInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return oprinfo;
}
/*
* getCollations:
- * read all collations in the system catalogs and return them in the
- * CollInfo* structure
- *
- * numCollations is set to the number of collations read in
+ * get information about all collations in the system catalogs
*/
-CollInfo *
-getCollations(Archive *fout, int *numCollations)
+void
+getCollations(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numCollations = ntups;
collinfo = (CollInfo *) pg_malloc(ntups * sizeof(CollInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return collinfo;
}
/*
* getConversions:
- * read all conversions in the system catalogs and return them in the
- * ConvInfo* structure
- *
- * numConversions is set to the number of conversions read in
+ * get information about all conversions in the system catalogs
*/
-ConvInfo *
-getConversions(Archive *fout, int *numConversions)
+void
+getConversions(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numConversions = ntups;
convinfo = (ConvInfo *) pg_malloc(ntups * sizeof(ConvInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return convinfo;
}
/*
* getAccessMethods:
- * read all user-defined access methods in the system catalogs and return
- * them in the AccessMethodInfo* structure
- *
- * numAccessMethods is set to the number of access methods read in
+ * get information about all user-defined access methods
*/
-AccessMethodInfo *
-getAccessMethods(Archive *fout, int *numAccessMethods)
+void
+getAccessMethods(Archive *fout)
{
PGresult *res;
int ntups;
/* Before 9.6, there are no user-defined access methods */
if (fout->remoteVersion < 90600)
- {
- *numAccessMethods = 0;
- return NULL;
- }
+ return;
query = createPQExpBuffer();
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numAccessMethods = ntups;
aminfo = (AccessMethodInfo *) pg_malloc(ntups * sizeof(AccessMethodInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return aminfo;
}
/*
* getOpclasses:
- * read all opclasses in the system catalogs and return them in the
- * OpclassInfo* structure
- *
- * numOpclasses is set to the number of opclasses read in
+ * get information about all opclasses in the system catalogs
*/
-OpclassInfo *
-getOpclasses(Archive *fout, int *numOpclasses)
+void
+getOpclasses(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numOpclasses = ntups;
opcinfo = (OpclassInfo *) pg_malloc(ntups * sizeof(OpclassInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return opcinfo;
}
/*
* getOpfamilies:
- * read all opfamilies in the system catalogs and return them in the
- * OpfamilyInfo* structure
- *
- * numOpfamilies is set to the number of opfamilies read in
+ * get information about all opfamilies in the system catalogs
*/
-OpfamilyInfo *
-getOpfamilies(Archive *fout, int *numOpfamilies)
+void
+getOpfamilies(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numOpfamilies = ntups;
opfinfo = (OpfamilyInfo *) pg_malloc(ntups * sizeof(OpfamilyInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return opfinfo;
}
/*
* getAggregates:
- * read all the user-defined aggregates in the system catalogs and
- * return them in the AggInfo* structure
- *
- * numAggs is set to the number of aggregates read in
+ * get information about all user-defined aggregates in the system catalogs
*/
-AggInfo *
-getAggregates(Archive *fout, int *numAggs)
+void
+getAggregates(Archive *fout)
{
DumpOptions *dopt = fout->dopt;
PGresult *res;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numAggs = ntups;
agginfo = (AggInfo *) pg_malloc(ntups * sizeof(AggInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return agginfo;
}
/*
* getFuncs:
- * read all the user-defined functions in the system catalogs and
- * return them in the FuncInfo* structure
- *
- * numFuncs is set to the number of functions read in
+ * get information about all user-defined functions in the system catalogs
*/
-FuncInfo *
-getFuncs(Archive *fout, int *numFuncs)
+void
+getFuncs(Archive *fout)
{
DumpOptions *dopt = fout->dopt;
PGresult *res;
ntups = PQntuples(res);
- *numFuncs = ntups;
-
finfo = (FuncInfo *) pg_malloc0(ntups * sizeof(FuncInfo));
i_tableoid = PQfnumber(res, "tableoid");
PQclear(res);
destroyPQExpBuffer(query);
-
- return finfo;
}
/*
/*
* getRules
* get basic information about every rule in the system
- *
- * numRules is set to the number of rules read in
*/
-RuleInfo *
-getRules(Archive *fout, int *numRules)
+void
+getRules(Archive *fout)
{
PGresult *res;
int ntups;
ntups = PQntuples(res);
- *numRules = ntups;
-
ruleinfo = (RuleInfo *) pg_malloc(ntups * sizeof(RuleInfo));
i_tableoid = PQfnumber(res, "tableoid");
PQclear(res);
destroyPQExpBuffer(query);
-
- return ruleinfo;
}
/*
* getEventTriggers
* get information about event triggers
*/
-EventTriggerInfo *
-getEventTriggers(Archive *fout, int *numEventTriggers)
+void
+getEventTriggers(Archive *fout)
{
int i;
PQExpBuffer query;
/* Before 9.3, there are no event triggers */
if (fout->remoteVersion < 90300)
- {
- *numEventTriggers = 0;
- return NULL;
- }
+ return;
query = createPQExpBuffer();
ntups = PQntuples(res);
- *numEventTriggers = ntups;
-
evtinfo = (EventTriggerInfo *) pg_malloc(ntups * sizeof(EventTriggerInfo));
i_tableoid = PQfnumber(res, "tableoid");
PQclear(res);
destroyPQExpBuffer(query);
-
- return evtinfo;
}
/*
* getProcLangs
* get basic information about every procedural language in the system
*
- * numProcLangs is set to the number of langs read in
- *
* NB: this must run after getFuncs() because we assume we can do
* findFuncByOid().
*/
-ProcLangInfo *
-getProcLangs(Archive *fout, int *numProcLangs)
+void
+getProcLangs(Archive *fout)
{
PGresult *res;
int ntups;
ntups = PQntuples(res);
- *numProcLangs = ntups;
-
planginfo = (ProcLangInfo *) pg_malloc(ntups * sizeof(ProcLangInfo));
i_tableoid = PQfnumber(res, "tableoid");
PQclear(res);
destroyPQExpBuffer(query);
-
- return planginfo;
}
/*
* getCasts
* get basic information about most casts in the system
*
- * numCasts is set to the number of casts read in
- *
* Skip casts from a range to its multirange, since we'll create those
* automatically.
*/
-CastInfo *
-getCasts(Archive *fout, int *numCasts)
+void
+getCasts(Archive *fout)
{
PGresult *res;
int ntups;
ntups = PQntuples(res);
- *numCasts = ntups;
-
castinfo = (CastInfo *) pg_malloc(ntups * sizeof(CastInfo));
i_tableoid = PQfnumber(res, "tableoid");
PQclear(res);
destroyPQExpBuffer(query);
-
- return castinfo;
}
static char *
/*
* getTransforms
* get basic information about every transform in the system
- *
- * numTransforms is set to the number of transforms read in
*/
-TransformInfo *
-getTransforms(Archive *fout, int *numTransforms)
+void
+getTransforms(Archive *fout)
{
PGresult *res;
int ntups;
/* Transforms didn't exist pre-9.5 */
if (fout->remoteVersion < 90500)
- {
- *numTransforms = 0;
- return NULL;
- }
+ return;
query = createPQExpBuffer();
ntups = PQntuples(res);
- *numTransforms = ntups;
-
transforminfo = (TransformInfo *) pg_malloc(ntups * sizeof(TransformInfo));
i_tableoid = PQfnumber(res, "tableoid");
PQclear(res);
destroyPQExpBuffer(query);
-
- return transforminfo;
}
/*
/*
* getTSParsers:
- * read all text search parsers in the system catalogs and return them
- * in the TSParserInfo* structure
- *
- * numTSParsers is set to the number of parsers read in
+ * get information about all text search parsers in the system catalogs
*/
-TSParserInfo *
-getTSParsers(Archive *fout, int *numTSParsers)
+void
+getTSParsers(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numTSParsers = ntups;
prsinfo = (TSParserInfo *) pg_malloc(ntups * sizeof(TSParserInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return prsinfo;
}
/*
* getTSDictionaries:
- * read all text search dictionaries in the system catalogs and return them
- * in the TSDictInfo* structure
- *
- * numTSDicts is set to the number of dictionaries read in
+ * get information about all text search dictionaries in the system catalogs
*/
-TSDictInfo *
-getTSDictionaries(Archive *fout, int *numTSDicts)
+void
+getTSDictionaries(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numTSDicts = ntups;
dictinfo = (TSDictInfo *) pg_malloc(ntups * sizeof(TSDictInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return dictinfo;
}
/*
* getTSTemplates:
- * read all text search templates in the system catalogs and return them
- * in the TSTemplateInfo* structure
- *
- * numTSTemplates is set to the number of templates read in
+ * get information about all text search templates in the system catalogs
*/
-TSTemplateInfo *
-getTSTemplates(Archive *fout, int *numTSTemplates)
+void
+getTSTemplates(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numTSTemplates = ntups;
tmplinfo = (TSTemplateInfo *) pg_malloc(ntups * sizeof(TSTemplateInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return tmplinfo;
}
/*
* getTSConfigurations:
- * read all text search configurations in the system catalogs and return
- * them in the TSConfigInfo* structure
- *
- * numTSConfigs is set to the number of configurations read in
+ * get information about all text search configurations
*/
-TSConfigInfo *
-getTSConfigurations(Archive *fout, int *numTSConfigs)
+void
+getTSConfigurations(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numTSConfigs = ntups;
cfginfo = (TSConfigInfo *) pg_malloc(ntups * sizeof(TSConfigInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return cfginfo;
}
/*
* getForeignDataWrappers:
- * read all foreign-data wrappers in the system catalogs and return
- * them in the FdwInfo* structure
- *
- * numForeignDataWrappers is set to the number of fdws read in
+ * get information about all foreign-data wrappers in the system catalogs
*/
-FdwInfo *
-getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers)
+void
+getForeignDataWrappers(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numForeignDataWrappers = ntups;
fdwinfo = (FdwInfo *) pg_malloc(ntups * sizeof(FdwInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return fdwinfo;
}
/*
* getForeignServers:
- * read all foreign servers in the system catalogs and return
- * them in the ForeignServerInfo * structure
- *
- * numForeignServers is set to the number of servers read in
+ * get information about all foreign servers in the system catalogs
*/
-ForeignServerInfo *
-getForeignServers(Archive *fout, int *numForeignServers)
+void
+getForeignServers(Archive *fout)
{
PGresult *res;
int ntups;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numForeignServers = ntups;
srvinfo = (ForeignServerInfo *) pg_malloc(ntups * sizeof(ForeignServerInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return srvinfo;
}
/*
* getDefaultACLs:
- * read all default ACL information in the system catalogs and return
- * them in the DefaultACLInfo structure
- *
- * numDefaultACLs is set to the number of ACLs read in
+ * get information about all default ACL information in the system catalogs
*/
-DefaultACLInfo *
-getDefaultACLs(Archive *fout, int *numDefaultACLs)
+void
+getDefaultACLs(Archive *fout)
{
DumpOptions *dopt = fout->dopt;
DefaultACLInfo *daclinfo;
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
- *numDefaultACLs = ntups;
daclinfo = (DefaultACLInfo *) pg_malloc(ntups * sizeof(DefaultACLInfo));
PQclear(res);
destroyPQExpBuffer(query);
-
- return daclinfo;
}
/*
/*
* version specific routines
*/
-extern NamespaceInfo *getNamespaces(Archive *fout, int *numNamespaces);
+extern void getNamespaces(Archive *fout);
extern ExtensionInfo *getExtensions(Archive *fout, int *numExtensions);
-extern TypeInfo *getTypes(Archive *fout, int *numTypes);
-extern FuncInfo *getFuncs(Archive *fout, int *numFuncs);
-extern AggInfo *getAggregates(Archive *fout, int *numAggs);
-extern OprInfo *getOperators(Archive *fout, int *numOprs);
-extern AccessMethodInfo *getAccessMethods(Archive *fout, int *numAccessMethods);
-extern OpclassInfo *getOpclasses(Archive *fout, int *numOpclasses);
-extern OpfamilyInfo *getOpfamilies(Archive *fout, int *numOpfamilies);
-extern CollInfo *getCollations(Archive *fout, int *numCollations);
-extern ConvInfo *getConversions(Archive *fout, int *numConversions);
+extern void getTypes(Archive *fout);
+extern void getFuncs(Archive *fout);
+extern void getAggregates(Archive *fout);
+extern void getOperators(Archive *fout);
+extern void getAccessMethods(Archive *fout);
+extern void getOpclasses(Archive *fout);
+extern void getOpfamilies(Archive *fout);
+extern void getCollations(Archive *fout);
+extern void getConversions(Archive *fout);
extern TableInfo *getTables(Archive *fout, int *numTables);
extern void getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables);
extern InhInfo *getInherits(Archive *fout, int *numInherits);
extern void getIndexes(Archive *fout, TableInfo tblinfo[], int numTables);
extern void getExtendedStatistics(Archive *fout);
extern void getConstraints(Archive *fout, TableInfo tblinfo[], int numTables);
-extern RuleInfo *getRules(Archive *fout, int *numRules);
+extern void getRules(Archive *fout);
extern void getTriggers(Archive *fout, TableInfo tblinfo[], int numTables);
-extern ProcLangInfo *getProcLangs(Archive *fout, int *numProcLangs);
-extern CastInfo *getCasts(Archive *fout, int *numCasts);
-extern TransformInfo *getTransforms(Archive *fout, int *numTransforms);
+extern void getProcLangs(Archive *fout);
+extern void getCasts(Archive *fout);
+extern void getTransforms(Archive *fout);
extern void getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables);
extern bool shouldPrintColumn(const DumpOptions *dopt, const TableInfo *tbinfo, int colno);
-extern TSParserInfo *getTSParsers(Archive *fout, int *numTSParsers);
-extern TSDictInfo *getTSDictionaries(Archive *fout, int *numTSDicts);
-extern TSTemplateInfo *getTSTemplates(Archive *fout, int *numTSTemplates);
-extern TSConfigInfo *getTSConfigurations(Archive *fout, int *numTSConfigs);
-extern FdwInfo *getForeignDataWrappers(Archive *fout,
- int *numForeignDataWrappers);
-extern ForeignServerInfo *getForeignServers(Archive *fout,
- int *numForeignServers);
-extern DefaultACLInfo *getDefaultACLs(Archive *fout, int *numDefaultACLs);
+extern void getTSParsers(Archive *fout);
+extern void getTSDictionaries(Archive *fout);
+extern void getTSTemplates(Archive *fout);
+extern void getTSConfigurations(Archive *fout);
+extern void getForeignDataWrappers(Archive *fout);
+extern void getForeignServers(Archive *fout);
+extern void getDefaultACLs(Archive *fout);
extern void getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
int numExtensions);
extern void processExtensionTables(Archive *fout, ExtensionInfo extinfo[],
int numExtensions);
-extern EventTriggerInfo *getEventTriggers(Archive *fout, int *numEventTriggers);
+extern void getEventTriggers(Archive *fout);
extern void getPolicies(Archive *fout, TableInfo tblinfo[], int numTables);
-extern PublicationInfo *getPublications(Archive *fout,
- int *numPublications);
+extern void getPublications(Archive *fout);
extern void getPublicationNamespaces(Archive *fout);
extern void getPublicationTables(Archive *fout, TableInfo tblinfo[],
int numTables);