From: Gil Moskowitz Date: Wed, 17 Sep 2014 21:10:31 +0000 (-0400) Subject: Merge branch '4_7_x' of https://github.com/xtuple/xtuple into i24559_xtlocks X-Git-Tag: v4.7.0-beta.2~13^2 X-Git-Url: http://git.roojs.org/?a=commitdiff_plain;h=6f3e82ba3f1b8ec449de7b2d7154eddb55a0be6b;hp=8c5b966332a20878a9f3a63711f35da1dfe5a5a3;p=xtuple Merge branch '4_7_x' of https://github.com/xtuple/xtuple into i24559_xtlocks and change language of wipe_views to allow building a database Conflicts: enyo-client/database/source/delete_system_orms.sql --- diff --git a/enyo-client/database/source/delete_system_orms.sql b/enyo-client/database/source/delete_system_orms.sql index 79e2b31e9..66ea97675 100644 --- a/enyo-client/database/source/delete_system_orms.sql +++ b/enyo-client/database/source/delete_system_orms.sql @@ -1,10 +1,10 @@ -DO $$ +do $$ /* Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. - See www.xm.ple.com/CPAL for the full text of the software license. */ + See www.xtuple.com/CPAL for the full text of the software license. */ - plv8.execute("select xt.js_init()"); - plv8.execute("alter table xt.orm disable trigger orm_did_change"); + plv8.execute("select xt.js_init();"); + plv8.execute("alter table xt.orm disable trigger orm_did_change;"); plv8.execute("delete from xt.orm where orm_json ~ '\"isSystem\":true';"); - plv8.execute("alter table xt.orm enable trigger orm_did_change"); + plv8.execute("alter table xt.orm enable trigger orm_did_change;"); $$ language plv8; diff --git a/enyo-client/database/source/wipe_views.sql b/enyo-client/database/source/wipe_views.sql index 87ec0d33f..b92157597 100644 --- a/enyo-client/database/source/wipe_views.sql +++ b/enyo-client/database/source/wipe_views.sql @@ -1,19 +1,16 @@ -DO $$ +do $$ /* Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. See www.xm.ple.com/CPAL for the full text of the software license. */ - - var sql, - result, - viewname, - schemaname, - i; - - sql = "select schemaname, viewname from pg_views where schemaname in ('xm','sys', 'xt');" - result = plv8.execute(sql); - for (i = 0; i < result.length; i++) { - viewname = result[i].viewname; - schemaname = result[i].schemaname; - plv8.execute('drop view if exists ' + schemaname + '.' + viewname + ' cascade;'); - } - -$$ language plv8; +declare + sqlstring text; +begin + select string_agg('drop view ' || t.oid::regclass || ';', ' ') into sqlstring + from pg_class t + join pg_namespace n on n.oid = relnamespace + where relkind = 'v' + and nspname in ('xm','sys', 'xt'); + if length(sqlstring) > 0 then + execute sqlstring; + end if; +end +$$; diff --git a/enyo-client/database/source/xt/functions/pg_advisory_unlock.sql b/enyo-client/database/source/xt/functions/pg_advisory_unlock.sql index c892882ca..25c3b7aff 100644 --- a/enyo-client/database/source/xt/functions/pg_advisory_unlock.sql +++ b/enyo-client/database/source/xt/functions/pg_advisory_unlock.sql @@ -1,4 +1,8 @@ create or replace function xt.pg_advisory_unlock(oid integer, id integer) returns boolean as $$ + var sql = "select pg_catalog.pg_advisory_unlock($1, $2) as result;"; + return plv8.execute(sql, [oid, id])[0].result; + /* temporary: let qt client use advisory locks but web client use xt.lock */ + var pid = plv8.execute("select pg_backend_pid() as pid;")[0].pid, username = plv8.execute("select geteffectivextuser() as username;")[0].username, sql = "select * from xt.lock where lock_table_oid = $1 and lock_record_id = $2 and lock_username = $3 and lock_pid = $4;", diff --git a/enyo-client/database/source/xt/functions/trylock.sql b/enyo-client/database/source/xt/functions/trylock.sql index 0c73312f6..719607b4d 100644 --- a/enyo-client/database/source/xt/functions/trylock.sql +++ b/enyo-client/database/source/xt/functions/trylock.sql @@ -1,4 +1,8 @@ create or replace function xt.trylock(oid integer, id integer) returns boolean as $$ + var sql = "select public.trylock($1, $2) as result;"; + return plv8.execute(sql, [oid, id])[0].result; + /* temporary: let qt client use advisory locks but web client use xt.lock */ + var pid = plv8.execute("select pg_backend_pid() as pid;")[0].pid, data = Object.create(XT.Data), lock = data.tryLock(oid, id, {pid: pid}); diff --git a/foundation-database/public/functions/logout.sql b/foundation-database/public/functions/logout.sql index 1626bf200..5806fc812 100644 --- a/foundation-database/public/functions/logout.sql +++ b/foundation-database/public/functions/logout.sql @@ -3,9 +3,16 @@ CREATE OR REPLACE FUNCTION logout() RETURNS integer AS $$ -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. -- See www.xtuple.com/CPAL for the full text of the software license. BEGIN - PERFORM pg_advisory_unlock(datid::integer, procpid) + IF (compareversion('9.2.0') <= 0) + THEN + PERFORM pg_advisory_unlock(datid::integer, pid) FROM pg_stat_activity - WHERE(procpid = pg_backend_pid()); + WHERE(pid = pg_backend_pid()); + ELSE + PERFORM pg_advisory_unlock(datid::integer, procpid) + FROM pg_stat_activity + WHERE(procpid = pg_backend_pid()); + END IF; RETURN 0; END; diff --git a/lib/orm/source/xt/javascript/data.sql b/lib/orm/source/xt/javascript/data.sql index 0cacd1851..ada5e1bdf 100644 --- a/lib/orm/source/xt/javascript/data.sql +++ b/lib/orm/source/xt/javascript/data.sql @@ -1727,6 +1727,31 @@ select xt.install_js('XT','Data','xtuple', $$ return ret; }, + /** + * Get the current database server version. + * If the optional precision argument is passed, return the first prec + * fields of the full version number. + * + * @example + * var x = getPgVersion(1), // '9' + * xy = getPgVersion(2), // '9.1' + * xyz = getPgVersion(3), // '9.1.3' + * all = getPgVersion(); // '9.1.3' + * + * @param {Number} proc - optional precision + * @returns {String} X[.Y[.Z]] + */ + getPgVersion: function (prec) { + var q = plv8.execute("select setting from pg_settings " + + "where name='server_version';"), + ret; + ret = q[0].setting; + if (typeof prec === 'number') { + ret = ret.split(".").slice(0,prec).join("."); + } + return ret; + }, + /** * Get the oid for a given table name. * @@ -2399,12 +2424,14 @@ select xt.install_js('XT','Data','xtuple', $$ lockExp, oid, pcheck, + pgver = 0 + XT.Data.getPgVersion(2), pid = options.pid || null, - pidSql = "select usename, procpid " + + pidcol = (pgver < 9.2) ? "procpid" : "pid", + pidSql = "select usename, {pidcol} " + "from pg_stat_activity " + "where datname=current_database() " + " and usename=$1 " + - " and procpid=$2;", + " and {pidcol}=$2;", query, selectSql = "select * " + "from xt.lock " + @@ -2412,6 +2439,8 @@ select xt.install_js('XT','Data','xtuple', $$ " and lock_record_id = $2;", username = XT.username; + pidSql = pidSql.replace(/{pidcol}/g, pidcol); + /* If passed a table name, look up the oid. */ oid = typeof table === "string" ? this.getTableOid(table) : table; diff --git a/scripts/install_xtuple.sh b/scripts/install_xtuple.sh index ee2121be9..b8ae265c8 100644 --- a/scripts/install_xtuple.sh +++ b/scripts/install_xtuple.sh @@ -139,7 +139,10 @@ install_packages() { sudo add-apt-repository -y "deb http://apt.postgresql.org/pub/repos/apt/ ${DEBDIST}-pgdg main" sudo wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get -qq update 2>&1 | tee -a $LOG_FILE - sudo apt-get -q -y install curl build-essential libssl-dev postgresql-9.1 postgresql-server-dev-9.1 postgresql-contrib-9.1 postgresql-9.1-plv8 2>&1 | tee -a $LOG_FILE + sudo apt-get -q -y install curl build-essential libssl-dev \ + postgresql-${PG_VERSION} postgresql-server-dev-${PG_VERSION} \ + postgresql-contrib-${PG_VERSION} postgresql-${PG_VERSION}-plv8 2>&1 \ + | tee -a $LOG_FILE if [ ! -d "/usr/local/nvm" ]; then sudo rm -f /usr/local/bin/nvm @@ -154,10 +157,11 @@ install_packages() { sudo nvm alias xtuple $NODE_VERSION # use latest npm - npm install -fg npm@1.4.25 + sudo npm install -fg npm@1.4.25 # npm no longer supports its self-signed certificates log "telling npm to use known registrars..." npm config set ca "" + sudo chown -R $USER $HOME/.npm log "installing npm modules..." npm install --unsafe-perm 2>&1 | tee -a $LOG_FILE @@ -189,7 +193,7 @@ setup_postgres() { return 1 fi - PGDIR=/etc/postgresql/9.1/main + PGDIR=/etc/postgresql/${PG_VERSION}/main log "copying configs..." sudo cp $PGDIR/postgresql.conf $PGDIR/postgresql.conf.default diff --git a/scripts/lib/build_database.js b/scripts/lib/build_database.js index aa0b85c58..8ae4296d6 100644 --- a/scripts/lib/build_database.js +++ b/scripts/lib/build_database.js @@ -191,9 +191,8 @@ var async = require('async'), return memo + script; }, ""); - // Without this, when we delegate to exec psql the err var will not be set even - // on the case of error. - allSql = "\\set ON_ERROR_STOP TRUE;\n" + allSql; + // Without this, psql runs all input and returns success even if errors occurred + allSql = "\\set ON_ERROR_STOP TRUE\n" + allSql; winston.info("Applying build to database " + spec.database); credsClone.database = spec.database;