objpascal/regexpr/Source/RegExpr.ppu
perl/mal.pl
php/mal.php
-plsql/io.sql
-plsql/step*.sql
ps/mal.ps
python/mal.pyz
r/mal.r
mal_TEST_OPTS = --start-timeout 60 --test-timeout 120
miniMAL_TEST_OPTS = --start-timeout 60 --test-timeout 120
plpgsql_TEST_OPTS = --start-timeout 60 --test-timeout 180
+plsql_TEST_OPTS = --start-timeout 60 --test-timeout 120
DOCKERIZE=
test_EXCLUDES += test^make^step5 # no TCO capability (iteration or recursion)
test_EXCLUDES += test^mal^step5 # host impl dependent
test_EXCLUDES += test^matlab^step5 # never completes at 10,000
-test_EXCLUDES += test^plpgsql^step5 # too slow for 10,000
+test_EXCLUDES += test^plpgsql^step5 # too slow for 10,000
+test_EXCLUDES += test^plsql^step5 # too slow for 10,000
perf_EXCLUDES = mal # TODO: fix this
CREATE OR REPLACE PACKAGE BODY io AS
PROCEDURE open(sid integer) AS
+ PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
-- DBMS_OUTPUT.PUT_LINE('stream_open(' || sid || ') start');
UPDATE stream SET data = '', rl_prompt = '', open = 1
END;
PROCEDURE close(sid integer) AS
+ PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
-- DBMS_OUTPUT.PUT_LINE('stream_close(' || sid || ') start');
UPDATE stream SET rl_prompt = '', open = 0
-- LOCK TABLE stream IN EXCLUSIVE MODE;
SELECT data, open INTO input, isopen FROM stream
WHERE stream_id = sid;
- IF isopen = 1 AND input IS NOT NULL THEN
+ IF input IS NOT NULL THEN
UPDATE stream SET data = '' WHERE stream_id = sid;
COMMIT;
RETURN trim(TRAILING chr(10) FROM input);
BEGIN
-- set prompt / request readline style input
-- LOCK TABLE stream IN EXCLUSIVE MODE;
+ IF sid = 0 THEN
+ wait_flushed(1);
+ ELSIF sid = 1 THEN
+ wait_flushed(0);
+ END IF;
UPDATE stream SET rl_prompt = prompt WHERE stream_id = sid;
COMMIT;
LOCK TABLE stream IN EXCLUSIVE MODE;
SELECT open, rl_prompt INTO isopen, prompt
FROM stream WHERE stream_id = sid;
- SELECT count(*) INTO datas FROM stream WHERE data IS NOT NULL;
+ SELECT count(stream_id) INTO datas FROM stream WHERE data IS NOT NULL;
IF isopen = 0 THEN
raise_application_error(-20001,
sleep := 0.05;
WHILE true
LOOP
- SELECT count(*) INTO pending FROM stream
- WHERE stream_id = sid AND data IS NOT NULL;
+ SELECT count(stream_id) INTO pending FROM stream
+ WHERE stream_id = sid AND data IS NOT NULL;
IF pending = 0 THEN RETURN; END IF;
DBMS_LOCK.SLEEP(sleep);
IF sleep < 0.5 THEN
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ stream_writeline('closing stream 1');
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
line := REP('(def! load-file (fn* (f) (eval (read-string (str "(do " (slurp f) ")")))))');
IF argv.COUNT() > 0 THEN
- line := REP('(load-file "' ||
- TREAT(M(argv(1)) AS mal_str_type).val_str ||
- '")');
- RETURN 0;
+ BEGIN
+ line := REP('(load-file "' ||
+ TREAT(M(argv(1)) AS mal_str_type).val_str ||
+ '")');
+ io.close(1); -- close output stream
+ RETURN 0;
+ EXCEPTION WHEN OTHERS THEN
+ io.writeline('Error: ' || SQLERRM);
+ io.writeline(dbms_utility.format_error_backtrace);
+ io.close(1); -- close output stream
+ RAISE;
+ END;
END IF;
WHILE true LOOP
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
line := REP('(def! load-file (fn* (f) (eval (read-string (str "(do " (slurp f) ")")))))');
IF argv.COUNT() > 0 THEN
- line := REP('(load-file "' ||
- TREAT(M(argv(1)) AS mal_str_type).val_str ||
- '")');
- RETURN 0;
+ BEGIN
+ line := REP('(load-file "' ||
+ TREAT(M(argv(1)) AS mal_str_type).val_str ||
+ '")');
+ io.close(1); -- close output stream
+ RETURN 0;
+ EXCEPTION WHEN OTHERS THEN
+ io.writeline('Error: ' || SQLERRM);
+ io.writeline(dbms_utility.format_error_backtrace);
+ io.close(1); -- close output stream
+ RAISE;
+ END;
END IF;
WHILE true LOOP
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
line := REP('(defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) `(let* (or_FIXME ~(first xs)) (if or_FIXME or_FIXME (or ~@(rest xs))))))))');
IF argv.COUNT() > 0 THEN
- line := REP('(load-file "' ||
- TREAT(M(argv(1)) AS mal_str_type).val_str ||
- '")');
- RETURN 0;
+ BEGIN
+ line := REP('(load-file "' ||
+ TREAT(M(argv(1)) AS mal_str_type).val_str ||
+ '")');
+ io.close(1); -- close output stream
+ RETURN 0;
+ EXCEPTION WHEN OTHERS THEN
+ io.writeline('Error: ' || SQLERRM);
+ io.writeline(dbms_utility.format_error_backtrace);
+ io.close(1); -- close output stream
+ RAISE;
+ END;
END IF;
WHILE true LOOP
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
line := REP('(defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) `(let* (or_FIXME ~(first xs)) (if or_FIXME or_FIXME (or ~@(rest xs))))))))');
IF argv.COUNT() > 0 THEN
- line := REP('(load-file "' ||
- TREAT(M(argv(1)) AS mal_str_type).val_str ||
- '")');
- RETURN 0;
+ BEGIN
+ line := REP('(load-file "' ||
+ TREAT(M(argv(1)) AS mal_str_type).val_str ||
+ '")');
+ io.close(1); -- close output stream
+ RETURN 0;
+ EXCEPTION WHEN OTHERS THEN
+ io.writeline('Error: ' || SQLERRM);
+ io.writeline(dbms_utility.format_error_backtrace);
+ io.close(1); -- close output stream
+ RAISE;
+ END;
END IF;
WHILE true LOOP
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
line := REP('(defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) (let* (condvar (gensym)) `(let* (~condvar ~(first xs)) (if ~condvar ~condvar (or ~@(rest xs)))))))))');
IF argv.COUNT() > 0 THEN
- line := REP('(load-file "' ||
- TREAT(M(argv(1)) AS mal_str_type).val_str ||
- '")');
- RETURN 0;
+ BEGIN
+ line := REP('(load-file "' ||
+ TREAT(M(argv(1)) AS mal_str_type).val_str ||
+ '")');
+ io.close(1); -- close output stream
+ RETURN 0;
+ EXCEPTION WHEN OTHERS THEN
+ io.writeline('Error: ' || SQLERRM);
+ io.writeline(dbms_utility.format_error_backtrace);
+ io.close(1); -- close output stream
+ RAISE;
+ END;
END IF;
line := REP('(println (str "Mal [" *host-language* "]"))');
WHILE true LOOP
BEGIN
line := io.readline('user> ', 0);
- IF line IS NULL OR line = EMPTY_CLOB() THEN CONTINUE; END IF;
+ IF line = EMPTY_CLOB() THEN CONTINUE; END IF;
IF line IS NOT NULL THEN
io.writeline(REP(line));
END IF;
EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20001 THEN -- io streams closed
+ IF SQLCODE = -20001 THEN -- io read stream closed
+ io.close(1); -- close output stream
RETURN 0;
END IF;
io.writeline('Error: ' || SQLERRM);
RL_HISTORY_FILE=${HOME}/.mal-history
SKIP_INIT="${SKIP_INIT:-}"
-#MALDIR=$(readlink -f $(dirname $0)/..)
-#echo MALDIR: ${MALDIR}
SQLPLUS="sqlplus -S system/oracle"
FILE_PID=
echo "${out}"
done
) &
+STDOUT_PID=$!
# Perform readline input into stream table when requested
(
echo -en "\n/" ) \
| ${SQLPLUS} >/dev/null || break
done
-echo -e "BEGIN io.close(0); io.close(1); END;\n/" \
+echo -e "BEGIN io.close(0); END;\n/" \
| ${SQLPLUS} > /dev/null
) <&0 >&1 &
res=0
shift
-#echo "CREATE OR REPLACE DIRECTORY ROOTDIR AS '${MALDIR}';" \
-# | ${SQLPLUS} > /dev/null
if [ $# -gt 0 ]; then
# If there are command line arguments then run a command and exit
args=$(for a in "$@"; do echo -n "\"$a\" "; done)
| ${SQLPLUS} > /dev/null
res=$?
fi
-# TODO: fix this
-sleep 2
-echo -e "BEGIN io.close(0); io.close(1); END;\n/" \
- | ${SQLPLUS} > /dev/null
+# Wait for output to flush
+wait ${STDOUT_PID}
exit ${res}