What status does this line return:
set sc=conn.Connect("Production","username","password") Can you execute a trivial statement such as:
SELECT 1or (depenting on your target DBMS):
SELECT 1 FROM dualor is it the same error?
- Log in to post comments
What status does this line return:
set sc=conn.Connect("Production","username","password") Can you execute a trivial statement such as:
SELECT 1or (depenting on your target DBMS):
SELECT 1 FROM dualor is it the same error?
Thank you,. Alexander.
Really didn't think that it could be any undefined variable.
Thank you, Robert!
I'll file a prodlog (about the docs), so we'll see.
Yes, tested it in Ensemble 2017.2 and InterSystems IRIS 2018.1.
About everything quoted is a valid property name:
Property "WHY( *?""*?";
You need to do these three steps in order:
In can be done via ^DATABASE utility or in management portal.
Thank you, John!
Looks like it is exactly what I heed.
If you have an XSD, it's as simple as importing it and using imported classes.
If you do not have a schema, you'll need to either generate an XSD from XML (there are many tools online) or just plain create Caché classes and make them XML-enabled.
Documentation:
That said, is XML really a part of the url?
Validation process is unable to process the message in 2 seconds. Probably because of the queue.
There are several ways to remedy that:
1. Increase timeout.
2. Make the call ASYNC.
3. Increase pool size for Validation process
4. Make validation process work faster.
File selection dialog sorts by file type (extension).
I agree that by Name would be better probably.
Can you share example production/BPs?
Check WebTerminal project.
Nice feature to have.
One note about the code: if you have a BO that accepts only one type of messages, you can (I myself prefer to - as it immediately notifies the reader that this BO works with only one type of messages, and not just a small BO in development) remove Message map altogether and define an OnRequest method, which would process these messages. Pull request.
You use 8bit Caché. Maybe you need to convert GraphQL.xml into your local encoding.
Or use Unicode Caché.
If you want, you can pass current IP as a header or inside the message body.
Do you want it for logging purposes, such as what actions were performed from which IP?
httpd/apache/apache2.
My go-to https redirect:
RewriteEngine on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]Looks like NAT. Cloud server only sees external address (214.17.17) as it should.
Why do you want to get internal address?
Try installing httpd from the package manager for your OS..
Add http to https redirect.
Maybe plugins go to https first, so redirect all traffic to https. Good for various cached links, etc.
If someone is interested, here's the same code but as a class:
/// Utility to match input against comma-separated string of masks.
Class util.Matcher
{
/// Returns $$$YES if input matches at least one element from the list
/// input - string to match
/// list - comma separated list of masks containig * and ?
/// write ##class(util.Matcher).MatchOr()
ClassMethod MatchOr(input As %String, list As %String) As %Boolean
{
set ok = $$$NO
for pie=1:1:$L(list,",") {
set mask=$P(list,",",pie)
if mask'="",..Match(input,mask) {
set ok = $$$YES
}
}
quit ok
}
/// Returns $$$YES if input matches all elements from the list
/// input - string to match
/// list - comma separated list of masks containig * and ?
/// write ##class(util.Matcher).MatchAnd()
ClassMethod MatchAnd(input As %String, list As %String) As %Boolean
{
set ok = $$$YES
for pie=1:1:$L(list,",") {
set mask=$P(list,",",pie)
if mask'="",'..Match(input,mask) {
set ok = $$$NO
}
}
quit ok
}
/// Returns $$$YES if input matches the mask
/// write ##class(util.Matcher).Match()
ClassMethod Match(input As %String, mask As %String) As %Boolean [ CodeMode = expression ]
{
input?@..MaskToPattern(mask)
}
/// Translate mask into a pattern
/// write ##class(util.Matcher).MaskToPattern()
ClassMethod MaskToPattern(mask As %String) As %String
{
set pattern = ""
set char = ""
for pos = 1:1:$length(mask) {
set curChar = $extract(mask, pos)
if curChar = "*" {
set pattern = pattern _ $select(char="":"", 1:"1"""_char_"""") _ ".E"
set char = ""
} elseif curChar = "?" {
set pattern = pattern _ $select(char="":"", 1:"1"""_char_"""") _ "1E"
set char = ""
} else {
set char = char _ curChar
}
}
set pattern = pattern _ $select(char="":"", 1:"1"""_char_"""")
quit pattern
}
}Nice. Thank you!
Do not store passwords.
Store password hashes + Unique salt. When entered hash
Check $system.Encryption class for various hashing algorithms.
The only case where you need to store passwords is when they are used to authenticate Cache server against external systems.
In that case use the same $system.Encryption class to encrypt them for storage.
we're talking of 200-300+ passwords here.
Per user?
Is the "bi login" hosted on the same Cache server?
If so you'll need to add /dsw and /mdx2json to the same group/same cookie path as your app and you should be all set.
Please mark Stefan's answer as accepted.
You could (and probably should) separate these parts of routines as separate methods or at least subroutines.
And if you don't have labels, adding them wouldn't break existing code.
For example you have this routine:
TEST
write 1
write 2
write 3
quitIt, when called would output
>do ^TEST
123If you then add a label somewhere:
TEST
write 1
MYLABEL
write 2
write 3
quitThe routine would wok the same on previous calls:
>do ^TEST
123But you'll also be able to call only the label:
>do MYLABEL^TEST
23Can you ballpark the workload?
If it's not too big, I think the easiest solution would be just writing ObjectScript method that calculates what you need.
Thank you!