Wed Dec 1 20:26:15 PST 2004
- Previous message: [Slony1-commit] By darcyb: clean should yank the core too
- Next message: [Slony1-commit] By cbbrowne: Added overview of what the components of slon do
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Log Message:
-----------
Added new function upgradeSchema(old_version). Slonik now determines
the currently loaded slony1_funcs.sql version by calling slonyVersion()
before updating the functions. It then calls upgradeSchema(old_version)
so that this function can perform all the required modifications to the
slony1_base schema depending on the old version.
Jan
Modified Files:
--------------
slony1-engine/src/backend:
slony1_base.sql (r1.23 -> r1.24)
slony1_funcs.sql (r1.46 -> r1.47)
slony1-engine/src/ducttape:
test_1_update_functions (r1.1 -> r1.2)
slony1-engine/src/slonik:
slonik.c (r1.33 -> r1.34)
-------------- next part --------------
Index: slony1_base.sql
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_base.sql,v
retrieving revision 1.23
retrieving revision 1.24
diff -Lsrc/backend/slony1_base.sql -Lsrc/backend/slony1_base.sql -u -w -r1.23 -r1.24
--- src/backend/slony1_base.sql
+++ src/backend/slony1_base.sql
@@ -22,6 +22,7 @@
no_id int4,
no_active bool,
no_comment text,
+ no_spool boolean,
CONSTRAINT "sl_node-pkey"
PRIMARY KEY (no_id)
Index: slony1_funcs.sql
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_funcs.sql,v
retrieving revision 1.46
retrieving revision 1.47
diff -Lsrc/backend/slony1_funcs.sql -Lsrc/backend/slony1_funcs.sql -u -w -r1.46 -r1.47
--- src/backend/slony1_funcs.sql
+++ src/backend/slony1_funcs.sql
@@ -4708,64 +4708,32 @@
Checks if a table has our special serial key column that is used if
the table has no natural unique constraint.';
--- ----------------------------------------------------------------------
--- FUNCTION add_missing_table_field(text, text, text, text)
---
--- support function of only adding the fields to a table if they do not yet exist.
---
--- ----------------------------------------------------------------------
-create or replace function @NAMESPACE at .add_missing_table_field (text, text, text, text)
-returns bool as '
-DECLARE
- p_namespace alias for $1;
- p_table alias for $2;
- p_field alias for $3;
- p_type alias for $4;
- v_row record;
- v_query text;
-BEGIN
- select 1 into v_row from pg_namespace n, pg_class c, pg_attribute a
- where quote_ident(n.nspname) = p_namespace and
- c.relnamespace = n.oid and
- quote_ident(c.relname) = p_table and
- a.attrelid = c.oid and
- quote_ident(a.attname) = p_field;
- if not found then
- raise notice ''Upgrade table %.% - add field %'', p_namespace, p_table, p_field;
- v_query := ''alter table '' || p_namespace || ''.'' || p_table || '' add column '';
- v_query := v_query || p_field || '' '' || p_type || '';'';
- execute v_query;
- return ''t'';
- else
- return ''f'';
- end if;
-END;' language plpgsql;
-
-comment on function @NAMESPACE at .add_missing_table_field(text,text,text,text) is
- 'add_missing_table_field(namespace, table, field, type)';
-
-- ----------------------------------------------------------------------
--- FUNCTION upgrade_sl_node ()
---
--- adds the no_spool bool to sl_node
+-- FUNCTION upgradeSchema(old_version)
--
+-- Called by slonik during the function upgrade process.
-- ----------------------------------------------------------------------
-create or replace function @NAMESPACE at .upgrade_sl_node () returns bool
-as '
-DECLARE
- v_row record;
- ret boolean;
-BEGIN
- select @NAMESPACE at .add_missing_table_field(''@NAMESPACE@'', ''sl_node'', ''no_spool'', ''boolean'') into ret;
- return ret;
-
-END;'
-language plpgsql;
+create or replace function @NAMESPACE at .upgradeSchema(text)
+returns text as '
+declare
+ p_old alias for $1;
+begin
+ -- ----
+ -- Changes from 1.0.x to 1.1.0
+ -- ----
+ if p_old = ''1.0.2'' or p_old = ''1.0.5'' then
+ -- Add new column sl_node.no_spool for virtual spool nodes
+ execute ''alter table @NAMESPACE at .sl_node add column no_spool boolean'';
+ update @NAMESPACE at .sl_node set no_spool = false;
+ end if;
-comment on function @NAMESPACE at .upgrade_sl_node() is
- 'Schema changes required to upgrade to version 1.1';
+ return p_old;
+end;
+' language plpgsql;
+comment on function @NAMESPACE at .upgradeSchema(text) is
+ 'Called during "update functions" by slonik to perform schema changes';
-- ----------------------------------------------------------------------
-- VIEW sl_status
Index: test_1_update_functions
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/ducttape/test_1_update_functions,v
retrieving revision 1.1
retrieving revision 1.2
diff -Lsrc/ducttape/test_1_update_functions -Lsrc/ducttape/test_1_update_functions -u -w -r1.1 -r1.2
--- src/ducttape/test_1_update_functions
+++ src/ducttape/test_1_update_functions
@@ -14,12 +14,13 @@
# Move set 1 to node 2
######################################################################
-echo "**** Reloading the functions in node 2"
+echo "**** Reloading the functions in nodes 1 and 2"
slonik <<_EOF_
cluster name = T1;
node 1 admin conninfo = 'dbname=$DB1';
node 2 admin conninfo = 'dbname=$DB2';
+ update functions (id = 1);
update functions (id = 2);
_EOF_
Index: slonik.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -Lsrc/slonik/slonik.c -Lsrc/slonik/slonik.c -u -w -r1.33 -r1.34
--- src/slonik/slonik.c
+++ src/slonik/slonik.c
@@ -3680,8 +3680,6 @@
dstring_free(&query);
return 0;
-
- return 0;
}
@@ -3689,8 +3687,8 @@
slonik_update_functions(SlonikStmt_update_functions *stmt)
{
SlonikAdmInfo *adminfo;
+ PGresult *res;
SlonDString query;
- int rc;
adminfo = get_checked_adminfo((SlonikStmt *)stmt, stmt->no_id);
if (adminfo == NULL)
@@ -3699,21 +3697,97 @@
if (db_begin_xact((SlonikStmt *)stmt, adminfo) < 0)
return -1;
- rc = load_slony_functions((SlonikStmt *)stmt, stmt->no_id);
- if (rc < 0)
+ /*
+ * Check if the currently loaded schema has the function
+ * slonyVersion() defined.
+ */
+ dstring_init(&query);
+ slon_mkquery(&query,
+ "select true from pg_proc P, pg_namespace N "
+ " where P.proname = 'slonyversion' "
+ " and P.pronamespace = N.oid "
+ " and N.nspname = '_%s';",
+ stmt->hdr.script->clustername);
+ res = db_exec_select((SlonikStmt *)stmt, adminfo, &query);
+ if (res == NULL)
+ {
+ dstring_free(&query);
return -1;
+ }
+ if (PQntuples(res) == 0)
+ {
+ /*
+ * No - this must be a 1.0.2 or earlier. Generate a query to
+ * call upgradeSchema() from 1.0.2.
+ */
+ PQclear(res);
+ slon_mkquery(&query,
+ "select \"_%s\".upgradeSchema('1.0.2'); ",
+ stmt->hdr.script->clustername);
+ }
+ else
+ {
+ /*
+ * Yes - call the function and generate a query to call
+ * upgradeSchema() from that version later.
+ */
+ PQclear(res);
+ slon_mkquery(&query,
+ "select \"_%s\".slonyVersion(); ",
+ stmt->hdr.script->clustername);
+ res = db_exec_select((SlonikStmt *)stmt, adminfo, &query);
+ if (res == NULL)
+ {
+ dstring_free(&query);
+ return -1;
+ }
+ if (PQntuples(res) != 1)
+ {
+ printf("%s:%d: failed to determine current schema version\n",
+ stmt->hdr.stmt_filename, stmt->hdr.stmt_lno);
+ PQclear(res);
+ dstring_free(&query);
+ return -1;
+ }
+ slon_mkquery(&query,
+ "select \"_%s\".upgradeSchema('%s'); ",
+ stmt->hdr.script->clustername,
+ PQgetvalue(res, 0, 0));
+ PQclear(res);
+ }
- dstring_init(&query);
+ /*
+ * Load the new slony1_functions.sql
+ */
+ if (load_slony_functions((SlonikStmt *)stmt, stmt->no_id) < 0)
+ {
+ dstring_free(&query);
+ return -1;
+ }
+
+ /*
+ * Call the upgradeSchema() function
+ */
+ if (db_exec_command((SlonikStmt *)stmt, adminfo, &query) < 0)
+ {
+ dstring_free(&query);
+ return -1;
+ }
+
+ /*
+ * Finally restart the node.
+ */
slon_mkquery(&query,
"notify \"_%s_Restart\"; ",
stmt->hdr.script->clustername);
if (db_exec_command((SlonikStmt *)stmt, adminfo, &query) < 0)
- rc = -1;
- else
- rc = 0;
+ {
dstring_free(&query);
+ return -1;
+ }
- return rc;
+ dstring_free(&query);
+ return 0;
}
- Previous message: [Slony1-commit] By darcyb: clean should yank the core too
- Next message: [Slony1-commit] By cbbrowne: Added overview of what the components of slon do
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list