InterSystems enforced SOAP/REST licensing but may have removed it.
In the InterSystems IRIS® Upgrade Checklist (2023.1) you can see in the Google cached webpage:
 

DP-417320: Enforce SOAP/REST licensing

Category: Licensing
Platforms: All
Version: 2023.1.0

In previous versions, the product did not enforce the SOAP/REST licensing rules.

With this version, we are now enforcing those licensing rules. Each authenticated SOAP/REST request will be licensed as a concurrent user (with multiple connections allowed). Unauthenticated requests (i.e. $Username = "UnknownUser") will be counted as independent user connections and subject to a 10-second minimum connection time.


Maybe you can try again with a more recent release or rework your app to use authenticated users.

Hi, I just did the same thing.
I am using Visual Studio Code with InterSystems plugins.
Using the plugin, connect to your server in the appropriate namespace.

Once done, locate your Production.cls in VSCode explorer, right click and select Export, this will export from IRIS to your local filesystem.


You should be able to find the location of the exported class in your filesystem in the output panel:

export "Namespace.Production.cls" as "/Users/yourself/Developer/Project/Namespace/Production.cls" - SuccessExported items: 1

Do the search and replace that you in the local Production.cls. When saving your modifications, the class is automatically compiled in the server:

The output also shows:

Compilation started on 09/20/2022 13:33:15 with qualifiers 'cuk'
Compiling class EAI.Production
Compiling routine EAI.Production.1
Compilation finished successfully in 0.113s.

While working on your changes, pay attention to the notification that can occur

Thanks everyone, I've read all your answers.


I​​ am using a %DocDB.Database. I have many colons created using %CreateProperty and some of them have the UNIQUE indicator set to true, therefore an index is created.
BUT, the %CreateProperty method is quite limited and I couldn't find how to make indexes on multiple columns/properties without doing some kind of trick (adding a property whose propertyExpression is the combination of other properties).

Anyway, I ended up building some indexes manually like that:

SET className = tfullDatabaseName
SET indexDefinition = ##class(%Dictionary.IndexDefinition).%New()
DO indexDefinition.parentSetObjectId(className)
SET indexDefinition.Name = "col1AndColB"
SET indexDefinition.Properties = "col1,colB"
SET indexDefinition.Unique = 1
SET status = indexDefinition.%Save()


Whenever I want to update my database schema, our strategy is to remove all properties and indexes.
Of course, the original %DropProperty drops indexes associated to the property to drop using an internal server only method dropIndex:
 

/// dropIndex() - delete an index definition and its structure. This method returns an oref referencing the index definition
/// document that was removed from the index definition database.
/// <br>
/// <pre>
/// SAMPLES>set people = $system.DocDB.GetDatabase("People")
/// SAMPLES>set index = people.%DropIndex("HC")
/// SAMPLES>write index.%ToJSON()
/// {"database":"People","name":"HC","type":"bitmap","class":"%DocDB.Server.Index.Bitmap","key":[["HomeCity","string"]]}
/// </pre>

Method dropIndex(indexName As %RawString = "") As %Library.DynamicAbstractObject [ Internal, ServerOnly = 1 ]

{
    TRY {
        SET response = $THIS
        $$$THROWONERROR(status,$CLASSMETHOD(..ClassName,"%PurgeIndices",$LISTBUILD(indexName)))
        $$$THROWONERROR(status,##class(%Dictionary.IndexDefinition).%Delete($$$oidForm(..ClassName_"||"_indexName)))
// check status?

    } CATCH exception {
        SET response = ""
        THROW exception
}
RETURN response
}


By the way, the documentation of this method suggest that you can use %DropIndex ... maybe this is an error.

Note that this instance method is called only within the %DropProperty method, within a TSTART TCOMMIT block and the class is also locked.

About my initial question, my original intent was to drop ALL indexes on the database, even those NOT created with %CreateProperty.
I tried to mimic the code of %DroptProperty (TSTART TCOMMIT, lock class, ...) with no success. When I try to recreate properties and columns for all my %DocDb.Databases it fails randomly.


 

Thanks, this works.
But, my question did not exactly reflect my thoughts, I needed the ID of a class' indices in order to delete them manually since I haven't found any method that would be %RemoveIndices(pIndexList As %List=""...).


So, in order to get the IDs, I use 

SELECT ID
FROM %Dictionary.IndexDefinition
WHERE  parent = 'your.class'

Then we use %DeleteId to delete the found indices. This is not fully tested yet.




 

We are looking forward for Embedded Python ! About the mindset|languages, don't be rude please ! 😚. Whenever a new developer comes in and jumps into ObjectScript, you don't necessarily tell him about this very rule exception when writing arithmetic nor does he think that he should read the documentation SQL/Using SQL/... whilst it's not trivial that is is related. I was just asking about a setting that would make me confident when we deliver our platform to future developers.
I always format my expressions with "(" but for some people this is just some coding style...

Operator precedence in ObjectScript is strictly left-to-right; within an expression operations are performed in the order in which they appear. This is different from other languages in which certain operators have higher precedence than others

I am fine with each language having its own operator precedence, but, is there a setting somewhere, even hidden or activable with some obscur guru command to have the same as pretty much everyone else ?

Hi,

I don't really get it, I don't understand the flow.

The documentation says :

structure your code to use SendRequestAsync() instead of this method, and handle response messages in the OnResponse() callback method

But I want a synced request.

Set tSC = SendRequestSync(request, .response)
// Now I continue the flow from here ... but you're telling me I should handle in OnResponse() ... but how do I take control right back here if I use OnResponse() +?