1
0
mirror of https://github.com/sasjs/core.git synced 2025-12-11 14:34:35 +00:00

Compare commits

...

74 Commits

Author SHA1 Message Date
Allan Bowe
06a5ea06f8 Merge pull request #46 from sasjs/mendfixes
sasjs lint fix for macro name in MEND statement
2021-06-23 22:27:36 +03:00
Allan Bowe
955471ed3c Merge branch 'main' into mendfixes 2021-06-23 21:55:44 +03:00
Allan Bowe
c8d3b43b12 fix: adding lrecl to mv_createfile to support lines 1 million characters wide. Closes #47 2021-06-23 21:53:32 +03:00
Allan Bowe
3e313b06a9 fix: adding mend in python lua build 2021-06-21 17:25:58 +03:00
Allan Bowe
d7371a4505 fix: adding mend to every macro statement using sasjs lint fix 2021-06-21 17:25:01 +03:00
Allan Bowe
32a6d15c2e Merge pull request #44 from sasjs/vpn-connection
chore: added vpn connection
2021-06-21 14:35:19 +03:00
Allan Bowe
b109e7cead fix: bumping core 2021-06-21 11:27:06 +00:00
d291d3e287 chore: added vpn connection 2021-06-21 11:49:37 +02:00
Allan Bowe
5a2968e798 fix: supporting LATIN1 as well as WLATIN1 in mm_webout 2021-06-17 16:31:29 +03:00
Allan Bowe
120ad9a7da fix: supporting bell cand escape characters when creating viya jobs / services with macro 2021-06-11 00:09:16 +03:00
Allan Bowe
67a81b2690 chore: updating the docs for mm_spkexport.sas 2021-06-08 20:09:23 +03:00
Allan Bowe
506cf1812f fix: deal with dashes in sysencoding 2021-06-08 16:59:43 +03:00
Allan Bowe
8cc0eb0dd7 Merge pull request #42 from sasjs/issue41
closes #42 Issue41
2021-06-03 22:44:16 +03:00
Allan Bowe
4c1f69da3a fix: using PROC JSON for JSON where SYSENCODING=wlatin1 2021-06-01 18:24:04 +03:00
Allan Bowe
f160ebe705 chore: updating all.sas from previous pushes 2021-06-01 18:01:01 +03:00
Allan Bowe
3f49925d01 Merge pull request #40 from sasjs/dependabot/npm_and_yarn/ws-7.4.6
chore(deps): bump ws from 7.4.5 to 7.4.6
2021-06-01 17:58:49 +03:00
Allan Bowe
53ed5dc916 fix: adding extra debugging to mf_getvarlist 2021-06-01 09:32:19 +03:00
Allan Bowe
808b24e31b chore: adding mend statement 2021-05-31 15:15:17 +03:00
dependabot[bot]
c51c9c2ca9 chore(deps): bump ws from 7.4.5 to 7.4.6
Bumps [ws](https://github.com/websockets/ws) from 7.4.5 to 7.4.6.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.4.5...7.4.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-31 02:08:52 +00:00
Allan Bowe
4d6edf5566 feat: additional options for mv_createfile.sas, also a log message to enable file to be easily opened 2021-05-30 13:22:50 +03:00
Allan Bowe
41a24677f5 chore: automated commit 2021-05-27 09:42:15 +03:00
Allan Bowe
e7d8d8ffb3 chore: updating docs 2021-05-27 09:40:38 +03:00
Allan Bowe
60d23dd618 Merge pull request #39 from sasjs/newviyafeatures
Newviyafeatures
2021-05-27 00:31:44 +03:00
Allan Bowe
d2764c3cd1 chore: updating all.sas 2021-05-26 23:37:38 +03:00
Allan Bowe
f9f4355143 feat: adding mv_createfile.sas and tests 2021-05-26 23:37:24 +03:00
Allan Bowe
18bc6c889d feat: adding mfv_existfolder.sas and tests 2021-05-26 23:37:06 +03:00
Allan Bowe
42a16ef496 feat: adding mfv_existfile.sas and tests 2021-05-26 23:36:43 +03:00
Allan Bowe
8178b801fb fix: using mfv_existfolder macro in mv_createfolder to save requests 2021-05-26 23:36:09 +03:00
Allan Bowe
ce331a23c8 fix: ensuring obs is updated when the table has zero columns 2021-05-26 23:35:25 +03:00
Allan Bowe
1cc9213467 feat: refreshing mf_abort (it's now an actual macro function) 2021-05-26 23:34:43 +03:00
Allan Bowe
aabbf4d0f9 Merge pull request #38 from sasjs/weboutfixes
fix: changing replace to YES in mm_createwebservice.sas, also setting…
2021-05-26 18:29:08 +03:00
Allan Bowe
2bea8be70d chore: logging in test 2021-05-26 18:19:04 +03:00
Allan Bowe
9b2368443e fix: changing replace to YES in mm_createwebservice.sas, also setting a default for code to ft15f001. More debugging added to mv_createfolder.sas 2021-05-26 10:36:45 +03:00
Allan Bowe
7915ba2c41 fix: running python to rebuild all.sas and mx_createwebservice macros 2021-05-25 15:50:06 +03:00
Yury Shkoda
cc61e48868 Merge pull request #37 from sasjs/createfolderfix
fix: addressed issue when creating recursive folers in mv_createfolde…
2021-05-25 15:40:27 +03:00
Allan Bowe
62db83dcf6 fix: addressed issue when creating recursive folers in mv_createfolder.sas 2021-05-25 15:33:02 +03:00
Allan Bowe
7ea9e0f8e9 Merge pull request #36 from sasjs/filter_json_fixes
Filter json fixes
2021-05-21 16:30:53 +03:00
Allan Bowe
1c852515f5 fix: adding more tests to mp_filtervalidate 2021-05-21 16:27:10 +03:00
Allan Bowe
b7e677bd8e fix: adding utf8 to mp_jsonout 2021-05-21 16:26:53 +03:00
Allan Bowe
f47f0d2cee chore: removing ghooks reference from package.json 2021-05-20 11:56:41 +03:00
Allan Bowe
3d0f426a98 Merge pull request #35 from sasjs/issue33
fix: adding sysvlong to mp_abort also
2021-05-20 11:40:29 +03:00
Allan Bowe
2cb51f6164 fix: adding sysvlong to mp_abort also 2021-05-20 11:39:28 +03:00
Allan Bowe
b73bf998da Merge pull request #34 from sasjs/issue33
feat: adding sysvlong to the webout macros, also updating documentati…
2021-05-20 11:25:43 +03:00
Allan Bowe
c9ad38ee98 feat: adding sysvlong to the webout macros, also updating documentation and adding tests. Closes #33 2021-05-20 11:23:10 +03:00
Allan Bowe
76b1b951c0 chore: adding SECURITY.md 2021-05-19 19:05:46 +03:00
Allan Bowe
996054b17a Merge pull request #32 from sasjs/git-commit-hook
feat(git): enabled pre-commit hook enforcing conventional commits
2021-05-19 18:55:35 +03:00
Allan Bowe
7fca3d4e3f chore: readme update for star graph 2021-05-19 18:24:02 +03:00
Allan Bowe
c4e599c861 chore: readme update (badges for issue counts) 2021-05-19 18:19:35 +03:00
Allan Bowe
0f6ff2cc1e chore: updating devdependency version for sasjs/cli 2021-05-19 18:16:00 +03:00
Allan Bowe
7cac4c71fb chore: updating package.json 2021-05-19 18:14:04 +03:00
Allan Bowe
1322bdab92 fix: deprecating ghooks, adding conventional commit hook also 2021-05-19 18:10:57 +03:00
Allan Bowe
f201df606a chore: automated commit 2021-05-19 17:42:43 +03:00
Yury Shkoda
a56fce86b1 feat(git): enabled pre-commit hook enforcing conventional commits 2021-05-19 15:03:02 +03:00
Allan Bowe
41ccc5fdd9 Merge pull request #30 from sasjs/travis
chore: travis yaml
2021-05-16 00:25:49 +03:00
Allan Bowe
b2877bd493 chore: automated commit 2021-05-16 00:25:04 +03:00
Allan Bowe
df8f8893e7 chore: automated commit 2021-05-16 00:16:59 +03:00
Allan Bowe
27fbdf193b chore: automated commit 2021-05-16 00:15:52 +03:00
Allan Bowe
6ae892989d chore: automated commit 2021-05-16 00:14:37 +03:00
Allan Bowe
39a7b332da chore: automated commit 2021-05-16 00:12:35 +03:00
Allan Bowe
c81794b542 chore: automated commit 2021-05-16 00:08:10 +03:00
Allan Bowe
e456da846a chore: automated commit 2021-05-16 00:03:13 +03:00
Allan Bowe
5c144be05b chore: automated commit 2021-05-16 00:00:01 +03:00
Allan Bowe
055669c133 fix: adding test action 2021-05-15 23:41:41 +03:00
Allan Bowe
4b67e13b24 chore: travis yaml 2021-05-15 23:31:50 +03:00
Allan Bowe
f1ec3eda81 fix: more badges for README 2021-05-15 22:20:53 +03:00
Allan Bowe
f2d5859675 fix: adding CHANGELOG (as a stub) 2021-05-15 21:35:54 +03:00
Allan Bowe
ea057d4655 fix: adding .npmignore to reduce bundle size and updating homepage in README 2021-05-15 21:05:51 +03:00
Allan Bowe
26c085b354 fix: adding badges to README 2021-05-15 20:41:27 +03:00
Allan Bowe
d13ac52739 fix: adding test command to package.json 2021-05-15 16:55:57 +03:00
Allan Bowe
bbbc28ad6d Merge branch 'main' of github.com:sasjs/core 2021-05-15 16:31:13 +03:00
Allan Bowe
530cd6e95c feat: adding two more test types to mp_assertdsobs.sas, also a test for the assertion macro itself 2021-05-15 16:30:57 +03:00
Allan Bowe
c4e17e43e8 Create CODE_OF_CONDUCT.md 2021-05-15 15:03:59 +03:00
Allan Bowe
fed217eec3 Merge pull request #29 from sasjs/issue10
fix: adding checks for consul token access, and two tests to ensure t…
2021-05-15 14:42:53 +03:00
Allan Bowe
1934dc8332 fix: adding checks for consul token access, and two tests to ensure the macro is working. closes #10 2021-05-15 14:41:10 +03:00
167 changed files with 3957 additions and 1305 deletions

18
.git-hooks/commit-msg Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/sh
RED="\033[1;31m"
GREEN="\033[1;32m"
# Get the commit message (the parameter we're given is just the path to the
# temporary file which holds the message).
commit_message=$(cat "$1")
if (echo "$commit_message" | grep -Eq "^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([a-z \-]+\))?!?: .+$") then
echo "${GREEN} ✔ Commit message meets Conventional Commit standards"
exit 0
fi
echo "${RED}❌ Commit message does not meet the Conventional Commit standard!"
echo "An example of a valid message is:"
echo " feat(login): add the 'remember me' button"
echo " More details at: https://www.conventionalcommits.org/en/v1.0.0/#summary"
exit 1

2
.git-hooks/pre-commit Executable file
View File

@@ -0,0 +1,2 @@
#!/bin/sh
sasjs lint

30
.github/vpn/config.ovpn vendored Normal file
View File

@@ -0,0 +1,30 @@
cipher AES-256-CBC
setenv FORWARD_COMPATIBLE 1
client
server-poll-timeout 4
nobind
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 443 tcp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
dev tun
dev-type tun
ns-cert-type server
setenv opt tls-version-min 1.0 or-highest
reneg-sec 604800
sndbuf 0
rcvbuf 0
# NOTE: LZO commands are pushed by the Access Server at connect time.
# NOTE: The below line doesn't disable LZO.
comp-lzo no
verb 3
setenv PUSH_PEER_INFO
ca ca.crt
cert user.crt
key user.key
tls-auth tls.key 1

84
.github/workflows/run-tests.yml vendored Normal file
View File

@@ -0,0 +1,84 @@
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Node.js CI
on:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Write VPN Files
run: |
echo "$CA_CRT" > .github/vpn/ca.crt
echo "$USER_CRT" > .github/vpn/user.crt
echo "$USER_KEY" > .github/vpn/user.key
echo "$TLS_KEY" > .github/vpn/tls.key
shell: bash
env:
CA_CRT: ${{ secrets.CA_CRT}}
USER_CRT: ${{ secrets.USER_CRT }}
USER_KEY: ${{ secrets.USER_KEY }}
TLS_KEY: ${{ secrets.TLS_KEY }}
- name: Install Open VPN
run: |
sudo apt install apt-transport-https
sudo wget https://swupdate.openvpn.net/repos/openvpn-repo-pkg-key.pub
sudo apt-key add openvpn-repo-pkg-key.pub
sudo wget -O /etc/apt/sources.list.d/openvpn3.list https://swupdate.openvpn.net/community/openvpn3/repos/openvpn3-bionic.list
sudo apt update
sudo apt install openvpn3
- name: Start Open VPN 3
run: openvpn3 session-start --config .github/vpn/config.ovpn
- name: Install Doxygen
run: sudo apt-get install doxygen
- name: Install dependencies
run: npm ci
- name: Check code style
run: npm run lint
- name: Add client
run: echo "CLIENT=${{secrets.CLIENT}}"> .env.viya
- name: Add secret
run: echo "SECRET=${{secrets.SECRET}}" >> .env.viya
- name: Add access token
run: echo "ACCESS_TOKEN=${{secrets.ACCESS_TOKEN}}" >> .env.viya
- name: Add refresh token
run: echo "REFRESH_TOKEN=${{secrets.REFRESH_TOKEN}}" >> .env.viya
- name: Build Project
run: npm run build
- name: Run SASjs tests
run: npm run test
env:
CI: true
CLIENT: ${{secrets.CLIENT}}
SECRET: ${{secrets.SECRET}}
SAS_USERNAME: ${{secrets.SAS_USERNAME}}
SAS_PASSWORD: ${{secrets.SAS_PASSWORD}}
SERVER_URL: ${{secrets.SERVER_URL}}
SERVER_TYPE: ${{secrets.SERVER_TYPE}}
ACCESS_TOKEN: ${{secrets.ACCESS_TOKEN}}
REFRESH_TOKEN: ${{secrets.REFRESH_TOKEN}}

View File

@@ -1,5 +1,5 @@
tasks:
- init: npm i -g @sasjs/cli
- init: nvm install --latest-npm && npm i -g @sasjs/cli
image:
file: .gitpod.dockerfile

11
.npmignore Normal file
View File

@@ -0,0 +1,11 @@
all.sas
build.py
.gitpod*
tests/
sasjs/
.github/
.git-hooks/
.vscode/
main.dox
make_singlefile.sh
*.md

View File

@@ -2,11 +2,11 @@
"noTrailingSpaces": true,
"noEncodedPasswords": true,
"hasDoxygenHeader": true,
"hasMacroNameInMend": false,
"hasMacroNameInMend": true,
"hasMacroParentheses": true,
"noNestedMacros": false,
"noSpacesInFileNames": true,
"maxLineLength": 135,
"maxLineLength": 230,
"lowerCaseFileNames": true,
"noTabIndentation": true,
"indentationMultiple": 2

5
CHANGELOG.md Normal file
View File

@@ -0,0 +1,5 @@
# CHANGELOG
As the changes are managed automatically in github, we don't generate an additional changelog. To view the fixes/features in each release, check out the releases page below:
[https://github.com/sasjs/core/releases](https://github.com/sasjs/core/releases)

128
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
https://sasapps.io/contact-us.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@@ -1,4 +1,25 @@
# Macro Core
[![npm package][npm-image]][npm-url]
[![Github Workflow][githubworkflow-image]][githubworkflow-url]
[![Dependency Status][dependency-image]][dependency-url]
[![npm](https://img.shields.io/npm/dt/@sasjs/core)]()
![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/@sasjs/core)
[![License](https://img.shields.io/apm/l/atomic-design-ui.svg)](/LICENSE)
![GitHub top language](https://img.shields.io/github/languages/top/sasjs/core)
[![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sasjs/core)](https://github.com/sasjs/core/issues?q=is%3Aissue+is%3Aclosed)
[![GitHub issues](https://img.shields.io/github/issues-raw/sasjs/core)](https://github.com/sasjs/core/issues)
![total lines](https://tokei.rs/b1/github/sasjs/core)
[![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-908a85?logo=gitpod)](https://gitpod.io/#https://github.com/sasjs/core)
[npm-image]:https://img.shields.io/npm/v/@sasjs/core.svg
[npm-url]:http://npmjs.org/package/@sasjs/core
[githubworkflow-image]:https://github.com/sasjs/core/actions/workflows/main.yml/badge.svg
[githubworkflow-url]:https://github.com/sasjs/core/blob/main/.github/workflows/main.yml
[dependency-image]:https://david-dm.org/sasjs/core.svg
[dependency-url]:https://github.com/sasjs/core/blob/main/package.json
Much quality. Many standards. The **Macro Core** library exists to save time and development effort! Herein ye shall find a veritable host of MIT-licenced, production quality SAS macros. These are a mix of tools, utilities, functions and code generators that are useful in the context of [Application Development](https://sasapps.io) on the SAS platform (eg https://datacontroller.io). [Contributions](https://github.com/sasjs/core/blob/main/CONTRIBUTING.md) are welcomed.
@@ -149,3 +170,12 @@ When contributing to this library, it is therefore important to ensure that all
# General Notes
- All macros should be compatible with SAS versions from support level B and above (so currently 9.2 and later). If an earlier version is not supported, then the macro should say as such in the header documentation, and exit gracefully (eg `%if %sysevalf(&sysver<9.3) %then %return`).
## Star Gazing
If you find this library useful, please leave a [star](https://github.com/sasjs/core/stargazers) and help us grow our star graph!
![](https://starchart.cc/sasjs/core.svg)

18
SECURITY.md Normal file
View File

@@ -0,0 +1,18 @@
# Security Policy
Security is an extremely high priority when it comes to the SASjs product suite. We take a number of steps across all repositories to minimise risk, such as:
* Regular dependabot updates
* Snyk reports
* Minimising dependencies, especially production dependencies (sasjs/core has NONE)
* Testing & Code review process
## Supported Versions
We support only the latest version
## Reporting a Vulnerability
We welcome disclosures of all kinds in relation to all the SASjs libraries. You can submit them here: [https://sasapps.io/contact-us](https://sasapps.io/contact-us)

932
all.sas

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,17 @@
/**
@file
@brief to be deprecated
@details We will deprecate this macro in 2022
@brief Abort, ungracefully
@details Will abort with a straightforward %abort if the condition is true.
As you can see, it's not a macro function.
Use mp_abort.sas instead.
<h4> Related Macros </h4>
@li mp_abort.sas
@version 9.2
@author Allan Bowe
@cond
**/
%macro mf_abort(mac=mf_abort.sas, type=, msg=, iftrue=%str(1=1)
%macro mf_abort(mac=mf_abort.sas, type=deprecated, msg=, iftrue=%str(1=1)
)/*/STORE SOURCE*/;
%if not(%eval(%unquote(&iftrue))) %then %return;
@@ -21,116 +20,8 @@
%if %length(&mac)>0 %then %put NOTE- called by &mac;
%put NOTE - &msg;
/* Stored Process Server web app context */
%if %symexist(_metaperson) or "&SYSPROCESSNAME"="Compute Server" %then %do;
options obs=max replace nosyntaxcheck mprint;
/* extract log err / warn, if exist */
%local logloc logline;
%global logmsg; /* capture global messages */
%if %symexist(SYSPRINTTOLOG) %then %let logloc=&SYSPRINTTOLOG;
%else %let logloc=%qsysfunc(getoption(LOG));
proc printto log=log;run;
%if %length(&logloc)>0 %then %do;
%let logline=0;
data _null_;
infile &logloc lrecl=5000;
input; putlog _infile_;
i=1;
retain logonce 0;
if (
_infile_=:"%str(WARN)ING" or _infile_=:"%str(ERR)OR"
) and logonce=0
then do;
call symputx('logline',_n_);
logonce+1;
end;
run;
/* capture log including lines BEFORE the err */
%if &logline>0 %then %do;
data _null_;
infile &logloc lrecl=5000;
input;
i=1;
stoploop=0;
if _n_ ge &logline-5 and stoploop=0 then do until (i>12);
call symputx('logmsg',catx('\n',symget('logmsg'),_infile_));
input;
i+1;
stoploop=1;
end;
if stoploop=1 then stop;
run;
%end;
%end;
%abort;
/* send response in SASjs JSON format */
data _null_;
file _webout mod lrecl=32000;
length msg $32767;
sasdatetime=datetime();
msg=cats(symget('msg'),'\n\nLog Extract:\n',symget('logmsg'));
/* escape the quotes */
msg=tranwrd(msg,'"','\"');
/* ditch the CRLFs as chrome complains */
msg=compress(msg,,'kw');
/* quote without quoting the quotes (which are escaped instead) */
msg=cats('"',msg,'"');
if symexist('_debug') then debug=symget('_debug');
if debug ge 131 then put '>>weboutBEGIN<<';
put '{"START_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '"';
put ',"sasjsAbort" : [{';
put ' "MSG":' msg ;
put ' ,"MAC": "' "&mac" '"}]';
put ",""SYSUSERID"" : ""&sysuserid"" ";
if symexist('_metauser') then do;
_METAUSER=quote(trim(symget('_METAUSER')));
put ",""_METAUSER"": " _METAUSER;
_METAPERSON=quote(trim(symget('_METAPERSON')));
put ',"_METAPERSON": ' _METAPERSON;
end;
_PROGRAM=quote(trim(resolve(symget('_PROGRAM'))));
put ',"_PROGRAM" : ' _PROGRAM ;
put ",""SYSCC"" : ""&syscc"" ";
put ",""SYSERRORTEXT"" : ""&syserrortext"" ";
put ",""SYSJOBID"" : ""&sysjobid"" ";
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
put "}" @;
%if &_debug ge 131 %then %do;
put '>>weboutEND<<';
%end;
run;
%let syscc=0;
%if %symexist(SYS_JES_JOB_URI) %then %do;
/* refer web service output to file service in one hit */
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
name="_webout.json";
%let rc=%sysfunc(fcopy(_web,_webout));
%end;
%else %do;
data _null_;
if symexist('sysprocessmode')
then if symget("sysprocessmode")="SAS Stored Process Server"
then rc=stpsrvset('program error', 0);
run;
%end;
/**
* endsas is reliable but kills some deployments.
* Abort variants are ungraceful (non zero return code)
* This approach lets SAS run silently until the end :-)
*/
%put _all_;
filename skip temp;
data _null_;
file skip;
put '%macro skip(); %macro skippy();';
run;
%inc skip;
%end;
%else %do;
%put _all_;
%abort cancel;
%end;
%mend;
%mend mf_abort;
/** @endcond */

View File

@@ -23,4 +23,4 @@
%if %sysfunc(exist(&libds)) ne 1 & %sysfunc(exist(&libds,VIEW)) ne 1 %then 0;
%else 1;
%mend;
%mend mf_existds;

View File

@@ -42,6 +42,6 @@
-1
%put &sysmacroname: &feature not found;
%end;
%mend;
%mend mf_existfeature;
/** @endcond */

View File

@@ -24,4 +24,4 @@
0
%end;
%mend;
%mend mf_existfileref;

View File

@@ -30,6 +30,6 @@
%let rc=%sysfunc(close(&dsid));
%end;
%mend;
%mend mf_existvar;
/** @endcond */

View File

@@ -54,6 +54,6 @@
0
%put Vars not found: &found;
%end;
%mend;
%mend mf_existvarlist;
/** @endcond */

View File

@@ -31,4 +31,4 @@
%sysfunc(attrc(&dsid,&attr))
%let rc=%sysfunc(close(&dsid));
%end;
%mend;
%mend mf_getattrc;

View File

@@ -31,4 +31,4 @@
%sysfunc(attrn(&dsid,&attr))
%let rc=%sysfunc(close(&dsid));
%end;
%mend;
%mend mf_getattrn;

View File

@@ -48,6 +48,6 @@
&engine
%mend;
%mend mf_getengine;
/** @endcond */

View File

@@ -44,4 +44,4 @@
%sysfunc(INPUTN(&bytes, best.),sizekmg.)
%end;
%mend ;
%mend mf_getfilesize ;

View File

@@ -29,4 +29,4 @@
&valc
%end;
%else %put %str(ERR)OR: Unable to find key &key in ds &libds;
%mend;
%mend mf_getkeyvalue;

View File

@@ -62,4 +62,4 @@
%else %if &switch=VIYARESTAPI %then %do;
%mf_trimstr(%sysfunc(getoption(servicesbaseurl)),/)
%end;
%mend;
%mend mf_getplatform;

View File

@@ -50,4 +50,4 @@
&buffer
%mend;
%mend mf_getquotedstr;

View File

@@ -38,6 +38,6 @@
&schema
%mend;
%mend mf_getschema;
/** @endcond */

View File

@@ -34,4 +34,4 @@
%end;
%end;
%put unable to find available fileref in range &prefix.0-&maxtries;
%mend;
%mend mf_getuniquefileref;

View File

@@ -37,4 +37,4 @@
%end;
%end;
%put unable to find available libref in range &prefix.0-&maxtries;
%mend;
%mend mf_getuniquelibref;

View File

@@ -39,4 +39,4 @@
%quote(&user)
%mend;
%mend mf_getuser;

View File

@@ -30,4 +30,4 @@
%trim(&&&variable)
%end;
%mend;
%mend mf_getvalue;

View File

@@ -29,4 +29,4 @@
%let rc=%sysfunc(close(&dsid));
%end;
&nvars
%mend;
%mend mf_getvarcount;

View File

@@ -49,4 +49,4 @@
%let rc = %sysfunc(close(&dsid));
/* Return variable format */
&vlen
%mend;
%mend mf_getVarLen;

View File

@@ -66,7 +66,8 @@
%let rc=%sysfunc(close(&dsid));
%end;
%else %do;
%put unable to open &libds (rc=&dsid);
%put &sysmacroname: Unable to open &libds (rc=&dsid);
%put &sysmacroname: SYSMSG= %sysfunc(sysmsg());
%let rc=%sysfunc(close(&dsid));
%end;
&outvar

View File

@@ -51,4 +51,4 @@ returns:
/* Return variable number */
&vnum.
%mend;
%mend mf_getVarNum;

View File

@@ -40,4 +40,4 @@
&engine
%mend;
%mend mf_getxengine;

View File

@@ -24,4 +24,4 @@
%sysevalf(%superq(param)=,boolean)
%mend;
%mend mf_isblank;

View File

@@ -31,4 +31,4 @@
&is_directory
%mend;
%mend mf_isdir;

View File

@@ -26,4 +26,4 @@
&root
%end;
%mend;
%mend mf_loc;

View File

@@ -64,4 +64,4 @@ Usage:
%end;
%end;
/* exit quietly if directory did exist.*/
%mend;
%mend mf_mkdir;

View File

@@ -16,4 +16,4 @@
%if %symexist(&var) %then %do;
%superq(&var)
%end;
%mend;
%mend mf_mval;

View File

@@ -23,4 +23,4 @@
%macro mf_nobs(libds
)/*/STORE SOURCE*/;
%mf_getattrn(&libds,NLOBS)
%mend;
%mend mf_nobs;

View File

@@ -47,4 +47,4 @@
&basestr
%end;
%mend;
%mend mf_trimstr;

View File

@@ -62,4 +62,4 @@
%else %mf_abort(mac=mf_verifymacvars,type=&mabort,msg=&abortmsg);
%exit_success:
%mend;
%mend mf_verifymacvars;

View File

@@ -50,5 +50,5 @@
&outvar
%mend;
%mend mf_wordsInStr1ButNotStr2;

View File

@@ -99,7 +99,7 @@
/* send response in SASjs JSON format */
data _null_;
file _webout mod lrecl=32000;
file _webout mod lrecl=32000 encoding='utf-8';
length msg $32767 debug $8;
sasdatetime=datetime();
msg=cats(symget('msg'),'\n\nLog Extract:\n',symget('logmsg'));
@@ -133,6 +133,8 @@
put ",""SYSCC"" : ""&syscc"" ";
put ",""SYSERRORTEXT"" : ""&syserrortext"" ";
put ",""SYSJOBID"" : ""&sysjobid"" ";
sysvlong=quote(trim(symget('sysvlong')));
put ',"SYSVLONG" : ' sysvlong;
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
put "}" @;

View File

@@ -142,4 +142,4 @@
proc sql;
drop table &ds;
%mend;
%mend mp_assertcols;

View File

@@ -144,4 +144,4 @@
proc sql;
drop table &ds;
%mend;
%mend mp_assertcolvals;

View File

@@ -18,7 +18,11 @@
@param [in] test= (HASOBS) The test to apply. Valid values are:
@li HASOBS - Test is a PASS if the input dataset has any observations
@li EMPTY - Test is a PASS if input dataset is empty
@li EQUALS [integer] - Test passes if obs count matches the provided integer
@li EQUALS [integer] - Test passes if row count matches the provided integer
@LI ATLEAST [integer] - Test passes if row count is more than or equal to
the provided integer
@LI ATMOST [integer] - Test passes if row count is less than or equal to
the provided integer
@param [out] outds= (work.test_results) The output dataset to contain the
results. If it does not exist, it will be created, with the following format:
|TEST_DESCRIPTION:$256|TEST_RESULT:$4|TEST_COMMENTS:$256|
@@ -27,6 +31,8 @@
<h4> Related Macros </h4>
@li mp_assertcolvals.sas
@li mp_assert.sas
@li mp_assertcols.sas
@version 9.2
@author Allan Bowe
@@ -51,6 +57,22 @@
)
%let test=EQUALS;
%end;
%else %if %substr(&test.xxxxxxx,1,7)=ATLEAST %then %do;
%let val=%scan(&test,2,%str( ));
%mp_abort(iftrue= (%DATATYP(&val)=CHAR)
,mac=&sysmacroname
,msg=%str(Invalid test - &test, expected ATLEAST [integer])
)
%let test=ATLEAST;
%end;
%else %if %substr(&test.xxxxxxx,1,7)=ATMOST %then %do;
%let val=%scan(&test,2,%str( ));
%mp_abort(iftrue= (%DATATYP(&val)=CHAR)
,mac=&sysmacroname
,msg=%str(Invalid test - &test, expected ATMOST [integer])
)
%let test=ATMOST;
%end;
%else %if &test ne HASOBS and &test ne EMPTY %then %do;
%mp_abort(
mac=&sysmacroname,
@@ -62,7 +84,8 @@
length test_description $256 test_result $4 test_comments $256;
test_description=symget('desc');
test_result='FAIL';
test_comments="&sysmacroname: Dataset &inds has &nobs observations";
test_comments="&sysmacroname: Dataset &inds has &nobs observations.";
test_comments=test_comments!!" Test was "!!symget('test');
%if &test=HASOBS %then %do;
if &nobs>0 then test_result='PASS';
%end;
@@ -72,6 +95,12 @@
%else %if &test=EQUALS %then %do;
if &nobs=&val then test_result='PASS';
%end;
%else %if &test=ATLEAST %then %do;
if &nobs ge &val then test_result='PASS';
%end;
%else %if &test=ATMOST %then %do;
if &nobs le &val then test_result='PASS';
%end;
%else %do;
test_comments="&sysmacroname: Unsatisfied test condition - &test";
%end;
@@ -86,4 +115,4 @@
proc sql;
drop table &ds;
%mend;
%mend mp_assertdsobs;

View File

@@ -53,4 +53,4 @@
%if &outref=____out %then %do;
filename &outref clear;
%end;
%mend;
%mend mp_binarycopy;

View File

@@ -67,5 +67,5 @@
else put inchar $char1.;
end;
run;
%mend;
%mend mp_cleancsv;
/** @endcond */

View File

@@ -64,4 +64,4 @@ data &outds;
output;
run;
%mend;
%mend mp_createconstraints;

View File

@@ -80,4 +80,4 @@ Usage:
)
%end;
%mend;
%mend mp_createwebservice;

View File

@@ -141,4 +141,4 @@ data &outds
%end;
run;
%mend;
%mend mp_csv2ds;

View File

@@ -49,4 +49,4 @@ data &outds;
end;
run;
%mend;
%mend mp_deleteconstraints;

View File

@@ -167,4 +167,4 @@ run;
by filepath file_or_folder filename ext ;
run;
%end;
%mend;
%mend mp_dirlist;

View File

@@ -47,4 +47,4 @@
%end;
as &outvar length=&varlen
from &libds;
%mend;
%mend mp_distinctfmtvalues;

View File

@@ -251,4 +251,4 @@ quit;
%put NOTE-;%put NOTE-;
%put NOTE- %sysfunc(dequote(&cards_file.));
%put NOTE-;%put NOTE-;
%mend;
%mend mp_ds2cards;

View File

@@ -55,4 +55,4 @@ data _null_;
run;
%mend;
%mend mp_ds2csv;

View File

@@ -99,4 +99,4 @@ filename &outref temp;
run;
%end;
%mend;
%mend mp_filtergenerate;

View File

@@ -78,7 +78,8 @@ run;
data &outds;
if &sqlrc or &syscc or &syserr then do;
REASON_CD=coalescec(symget('SYSERRORTEXT'),symget('SYSWARNINGTEXT'));
REASON_CD='VALIDATION_ERROR: '!!
coalescec(symget('SYSERRORTEXT'),symget('SYSWARNINGTEXT'));
output;
end;
else stop;
@@ -102,4 +103,4 @@ filename &fref1 clear;
%let syscc=1008;
%end;
%mend;
%mend mp_filtervalidate;

View File

@@ -57,4 +57,4 @@ create table &outds as
%end;
;
%mend;
%mend mp_getconstraints;

View File

@@ -332,4 +332,4 @@ run;
run;
%end;
%mend;
%mend mp_getdbml;

View File

@@ -115,7 +115,7 @@ create table _data_ as
end;
run;
%put &=constraints_used;
%mend;
%mend addConst;
data _null_;
file &fref;
@@ -378,4 +378,4 @@ run;
run;
%end;
%mend;
%mend mp_getddl;

View File

@@ -70,4 +70,4 @@ create table &outds (rename=(
out=&outds(rename=(_name_=NAME COL1=MAXLEN));
run;
%mend;
%mend mp_getmaxvarlengths;

View File

@@ -301,4 +301,4 @@
%return;
%end;
%mend;
%mend mp_guesspk;

View File

@@ -72,4 +72,4 @@
if &lastvar then output;
run;
%end;
%mend;
%mend mp_hashdataset;

View File

@@ -102,7 +102,8 @@
%let fmtds=%scan(&syslast,2,.);
/* prepare formats and varnames */
data _null_;
set &fmtds end=last;
if _n_=1 then call symputx('nobs',nobs,'l');
set &fmtds end=last nobs=nobs;
name=upcase(name);
/* fix formats */
if type=2 or type=6 then do;
@@ -128,7 +129,6 @@
call symputx(cats('len',_n_),newlen,'l');
call symputx(cats('fmt',_n_),fmt,'l');
call symputx(cats('type',_n_),type,'l');
if last then call symputx('nobs',_n_,'l');
run;
data &fmtds;
/* rename on entry */
@@ -147,7 +147,7 @@
run;
%let ds=&fmtds;
%end; /* &fmt=Y */
data _null_;file &jref mod ;
data _null_;file &jref mod encoding='utf-8';
put "["; call symputx('cols',0,'l');
proc sort
data=sashelp.vcolumn(where=(libname='WORK' & memname="%upcase(&ds)"))

View File

@@ -75,4 +75,4 @@ select distinct lowcase(memname)
)
%end;
%mend;
%mend mp_lib2cards;

View File

@@ -39,4 +39,4 @@
,dttm=%sysfunc(datetime());
quit;
%mend;
%mend mp_perflog;

View File

@@ -85,4 +85,4 @@
"with record &record and " _n_=;
%end;
%mend;
%mend mp_prevobs;

View File

@@ -87,4 +87,4 @@ insert into &outds select distinct * from &append_ds;
)
%end;
%mend;
%mend mp_recursivejoin;

View File

@@ -30,4 +30,4 @@ data _null_;
end;
run;
%mend;
%mend mp_resetoption;

View File

@@ -46,4 +46,4 @@
%mend;
%mend mp_runddl;

View File

@@ -117,4 +117,4 @@ proc sql
%put process finished at %sysfunc(datetime(),datetime19.);
%mend;
%mend mp_searchdata;

View File

@@ -49,4 +49,4 @@
quit;
%mend;
%mend mp_setkeyvalue;

View File

@@ -71,4 +71,4 @@
proc append base=&libds data=&syslast nowarn;run;
options &etls_syntaxcheck;
%mend;
%mend mp_stprequests;

View File

@@ -134,4 +134,4 @@ run;
%mp_binarycopy(inloc="&inloc",outref=_webout)
%end;
%mend;
%mend mp_streamfile;

View File

@@ -89,4 +89,4 @@ quit;
libname &lib clear;
%mend;
%mend mp_testjob;

View File

@@ -56,4 +56,4 @@ data &outds;
duration_seconds=end_dttm-start_dttm;
run;
%mend;
%mend mp_testwritespeedlibrary;

View File

@@ -68,4 +68,4 @@ data &outds ;
rc=filename('tmp');
run;
%mend;
%mend mp_tree;

View File

@@ -63,4 +63,4 @@ data _null_;
!!'filename &fname2 clear; filename &fname3 clear;');
run;
%mend;
%mend mp_unzip;

View File

@@ -90,4 +90,4 @@ alter table &libds modify &var char(&len);
%mp_createconstraints(inds=&dsconst,outds=&dsconst._addd,execute=YES)
%mend;
%mend mp_updatevarlength;

View File

@@ -76,4 +76,4 @@ ods package publish archive properties
(archive_name="&outname..zip" archive_path="&outpath");
ods package close;
%mend;
%mend mp_zip;

View File

@@ -23,7 +23,7 @@ for file in files:
ml.write(" put '" + line.rstrip().replace("'","''") + " ';\n")
ml.write("run;\n\n")
ml.write("%inc \"%sysfunc(pathname(work))/" + name + ".lua\";\n\n")
ml.write("%mend;\n")
ml.write("%mend " + name + ";\n")
ml.close()

View File

@@ -391,4 +391,4 @@ run;
%inc "%sysfunc(pathname(work))/ml_json.lua";
%mend;
%mend ml_json;

View File

@@ -42,6 +42,13 @@
*/
/*! \dir Tests
* \brief SASjs Tests
* \details These folders contain the macro tests. They are first compiled
and deployed (sasjs cbd) then executed (sasjs test).
*/
/*! \dir viya
* \brief Viya macros
* \details These macros have the following attributes:

View File

@@ -95,4 +95,4 @@ run;
filename __us2grp clear;
%mend;
%mend mm_adduser2group;

View File

@@ -460,4 +460,4 @@ run;
%return;
%end;
%mend;
%mend mm_assigndirectlib;

View File

@@ -75,4 +75,4 @@
%else %do;
%put NOTE: Library &libref is already assigned;
%end;
%mend;
%mend mm_assignlib;

View File

@@ -152,4 +152,4 @@ run;
%else %put NOTE: Application (&name) successfully created in (&tree)!;
%mend;
%mend mm_createapplication;

View File

@@ -80,4 +80,4 @@ data _null_;
if last then call execute('call missing(of _all_);stop;run;');
run;
%mend;
%mend mm_createdataset;

View File

@@ -122,4 +122,4 @@ run;
run;
%end;
%mend;
%mend mm_createdocument;

View File

@@ -157,4 +157,4 @@ run;
%end;
%put &sysmacroname: execution finished for &path;
%mend;
%mend mm_createfolder;

View File

@@ -318,4 +318,4 @@ filename &frefout temp;
filename &frefout clear;
%end;
%mend;
%mend mm_createlibrary;

View File

@@ -385,4 +385,4 @@ run;
%put %str(WARN)ING: STPTYPE=*&stptype* not recognised!;
%end;
%mend;
%mend mm_createstp;

View File

@@ -22,7 +22,7 @@ Usage:
%webout(OBJ,example2) * Object format, easier to work with ;
%webout(CLOSE)
;;;;
%mm_createwebservice(path=/Public/app/common,name=appInit)
%mm_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001)
<h4> SAS Macros </h4>
@li mm_createstp.sas
@@ -37,12 +37,15 @@ Usage:
@param desc= The description of the service (optional)
@param precode= Space separated list of filerefs, pointing to the code that
needs to be attached to the beginning of the service (optional)
@param code= Space seperated fileref(s) of the actual code to be added
@param server= The server which will run the STP. Server name or uri is fine.
@param mDebug= set to 1 to show debug messages in the log
@param replace= select YES to replace any existing service in that location
@param adapter= the macro uses the sasjs adapter by default. To use another
adapter, add a (different) fileref here.
@param code=(ft15f001) Space seperated fileref(s) of the actual code to be
added
@param server=(SASApp) The server which will run the STP. Server name or uri
is fine.
@param mDebug=(0) set to 1 to show debug messages in the log
@param replace=(YES) select NO to avoid replacing an existing service in that
location
@param adapter=(sasjs) the macro uses the sasjs adapter by default. To use
another adapter, add a (different) fileref here.
@version 9.2
@author Allan Bowe
@@ -52,11 +55,11 @@ Usage:
%macro mm_createwebservice(path=
,name=initService
,precode=
,code=
,code=ft15f001
,desc=This stp was created automagically by the mm_createwebservice macro
,mDebug=0
,server=SASApp
,replace=NO
,replace=YES
,adapter=sasjs
)/*/STORE SOURCE*/;
@@ -131,7 +134,8 @@ data _null_;
put ' %let fmtds=%scan(&syslast,2,.); ';
put ' /* prepare formats and varnames */ ';
put ' data _null_; ';
put ' set &fmtds end=last; ';
put ' if _n_=1 then call symputx(''nobs'',nobs,''l''); ';
put ' set &fmtds end=last nobs=nobs; ';
put ' name=upcase(name); ';
put ' /* fix formats */ ';
put ' if type=2 or type=6 then do; ';
@@ -157,7 +161,6 @@ data _null_;
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
put ' call symputx(cats(''type'',_n_),type,''l''); ';
put ' if last then call symputx(''nobs'',_n_,''l''); ';
put ' run; ';
put ' data &fmtds; ';
put ' /* rename on entry */ ';
@@ -176,7 +179,7 @@ data _null_;
put ' run; ';
put ' %let ds=&fmtds; ';
put ' %end; /* &fmt=Y */ ';
put ' data _null_;file &jref mod ; ';
put ' data _null_;file &jref mod encoding=''utf-8''; ';
put ' put "["; call symputx(''cols'',0,''l''); ';
put ' proc sort ';
put ' data=sashelp.vcolumn(where=(libname=''WORK'' & memname="%upcase(&ds)")) ';
@@ -263,7 +266,12 @@ data _null_;
put '%macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y); ';
put '%global _webin_file_count _webin_fileref1 _webin_name1 _program _debug ';
put ' sasjs_tables; ';
put '%local i tempds; ';
put '%local i tempds jsonengine; ';
put ' ';
put '/* see https://github.com/sasjs/core/issues/41 */ ';
put '%if "%upcase(&SYSENCODING)" ne "UTF-8" %then %let jsonengine=PROCJSON; ';
put '%else %let jsonengine=DATASTEP; ';
put ' ';
put ' ';
put '%if &action=FETCH %then %do; ';
put ' %if %str(&_debug) ge 131 %then %do; ';
@@ -298,7 +306,7 @@ data _null_;
put ' OPTIONS NOBOMFILE; ';
put ' ';
put ' /** ';
put ' * check engine type to avoid the below err message: ';
put ' * check xengine type to avoid the below err message: ';
put ' * > Function is only valid for filerefs using the CACHE access method. ';
put ' */ ';
put ' data _null_; ';
@@ -319,8 +327,8 @@ data _null_;
put '%end; ';
put ' ';
put '%else %if &action=ARR or &action=OBJ %then %do; ';
put ' %mp_jsonout(&action,&ds,dslabel=&dslabel,fmt=&fmt ';
put ' ,engine=DATASTEP,dbg=%str(&_debug) ';
put ' %mp_jsonout(&action,&ds,dslabel=&dslabel,fmt=&fmt,jref=&fref ';
put ' ,engine=&jsonengine,dbg=%str(&_debug) ';
put ' ) ';
put '%end; ';
put '%else %if &action=CLOSE %then %do; ';
@@ -333,7 +341,7 @@ data _null_;
put ' %local wtcnt;%let wtcnt=0; ';
put ' data _null_; ';
put ' set &tempds; ';
put ' if not (name =:"DATA"); ';
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
put ' i+1; ';
put ' call symputx(''wt''!!left(i),name,''l''); ';
put ' call symputx(''wtcnt'',i,''l''); ';
@@ -353,8 +361,8 @@ data _null_;
put ' put " ""&wt"" : {"; ';
put ' put ''"nlobs":'' nlobs; ';
put ' put '',"nvars":'' nvars; ';
put ' %mp_jsonout(OBJ,&tempds,jref=&fref,dslabel=colattrs,engine=DATASTEP) ';
put ' %mp_jsonout(OBJ,&wt,jref=&fref,dslabel=first10rows,engine=DATASTEP) ';
put ' %mp_jsonout(OBJ,&tempds,jref=&fref,dslabel=colattrs,engine=&jsonengine) ';
put ' %mp_jsonout(OBJ,&wt,jref=&fref,dslabel=first10rows,engine=&jsonengine) ';
put ' data _null_; file &fref mod encoding=''utf-8''; ';
put ' put "}"; ';
put ' %end; ';
@@ -378,6 +386,8 @@ data _null_;
put ' put ",""SYSHOSTNAME"" : ""&syshostname"" "; ';
put ' put ",""SYSJOBID"" : ""&sysjobid"" "; ';
put ' put ",""SYSSITE"" : ""&syssite"" "; ';
put ' sysvlong=quote(trim(symget(''sysvlong''))); ';
put ' put '',"SYSVLONG" : '' sysvlong; ';
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
put ' put "}" @; ';
@@ -387,7 +397,7 @@ data _null_;
put ' run; ';
put '%end; ';
put ' ';
put '%mend; ';
put '%mend mm_webout; ';
put ' ';
put '%macro mf_getuser(type=META ';
put ')/*/STORE SOURCE*/; ';
@@ -405,7 +415,7 @@ data _null_;
put ' ';
put ' %quote(&user) ';
put ' ';
put '%mend; ';
put '%mend mf_getuser; ';
/* WEBOUT END */
put '%macro webout(action,ds,dslabel=,fmt=);';
put ' %mm_webout(&action,ds=&ds,dslabel=&dslabel,fmt=&fmt)';
@@ -466,4 +476,4 @@ run;
%put &url?_PROGRAM=&path/&name;
%put ;%put ;%put ;%put ;%put ;%put ;
%mend;
%mend mm_createwebservice;

View File

@@ -68,4 +68,4 @@ run;
%return;
%end;
%mend;
%mend mm_deletedocument;

View File

@@ -89,4 +89,4 @@ run;
%put &sysmacroname: Library &name (&liburi) was successfully deleted;
%mend;
%mend mm_deletelibrary;

View File

@@ -67,4 +67,4 @@ run;
%return;
%end;
%mend;
%mend mm_deletestp;

View File

@@ -113,4 +113,4 @@ run;
filename &fileref clear;
%mend;
%mend mm_getauthinfo;

Some files were not shown because too many files have changed in this diff Show More