Dmitry Maslennikov · Oct 24, 2016 go to post

So let's suggest you have some object with such properties (Legs=4, Fur=True, Tail=True, Attitude=100). In a global it will looks something like this

^MyPets("Cat")=$lb(4,1,1,100)

And in this case, we should have any pointer block in anyway, and while we don't have so many data in our global, yet. Type for pointer block will be 70

Block Repair Function (Current Block 3): 44
Block # 44               Type: 70 TOP/BOTTOM POINTER
Link Block: 0            Offset: 40
Count of Nodes: 1        Collate: 5
 
--more--
 
#    Node                    POINTER
1    ^MyPets                 78

But we also have not so big value for our object, and data block can store subscripts in this block, as well as a value.

Block Repair Function (Current Block 44): 78
Block # 78               Type: 8 DATA
Link Block: 0            Offset: 60
Count of Nodes: 2        Collate: 5             Big String Nodes: 0
Pointer Length:6         Next Pointer Length:0   Diff Byte:Hex 0
Pointer Reference:      ^MyPets
Next Pointer Reference:
Next pointer stored? No
 
 
--more--
 
#    Node                    Data
1    ^MyPets
2    ^MyPets("Cat")          $lb(4,1,1,100)

Or our global could be looks a bit different

^MyPets("Cat","Attitude")=100
^MyPets("Cat","Fur")=1
^MyPets("Cat","Legs")=4
^MyPets("Cat","Tail")=1

But change nothing.

Block Repair Function (Current Block 44): 78
Block # 78               Type: 8 DATA
Link Block: 0            Offset: 108
Count of Nodes: 5        Collate: 5             Big String Nodes: 0
Pointer Length:6         Next Pointer Length:0   Diff Byte:Hex 0
Pointer Reference:      ^MyPets
Next Pointer Reference:
Next pointer stored? No
 
 
--more--
 
#    Node                    Data
1    ^MyPets
2    ^MyPets("Cat","Attitude") 100 *
3    ^MyPets("Cat","Fur")    1 *
4    ^MyPets("Cat","Legs")   4 *
5    ^MyPets("Cat","Tail")   1 *

So, we can see that yes, our subscripts now stores only in data block, yes it is, but they represent here as a nodes, and could be named as branches in a tree, we still have to store data in a data block, but we also need to store information about global, that's why we can see it here. And when will get more data than could be stored in one block, this block will be splitted, and in a parent block will see two nodes, for first nodes in a children blocks.

Dmitry Maslennikov · Oct 24, 2016 go to post

I haven't used SSD in production yet. I'm sure there lots of people who can say more about it. But anyway as I know, all modern SSD, and even which is special for servers, now has a very big count of rewrites. So, it means, that in most cases now you should care about it at all. And fragmentation could be a problem only when you have so many empty blocks, which should be cached, but you don't have some many RAM for it. 

Dmitry Maslennikov · Oct 26, 2016 go to post

In a development process, you can use any latest version of Caché, and export all code to source control system, in version which you use in production. It is not so difficult as may looks. Except only if you use so old system, like 2010.1 or earlier, because export qualificator /cacheversion supports version 2010.2 and later. In this case, you should have some building process, which will be at right version, which you need. I've used this way for years, and for our client we built two versions 2010.2 and 2012.2 from the same repository. You just should not use some new features, or use macroconditions by version, except JSON, you can't use anyway if lowest version doesn't support it yet.

Dmitry Maslennikov · Oct 27, 2016 go to post

Can you share a bit more details, how you embedded it to Ensemble ?

Wizard - is it Studio wizard ?

And have you configured .Net gateway ? You should have it anyway, and you can configure log file, which may be contain some errors. 

Sorry, that I'm confused you. I'm edited a bit your post, and fixed image, which had a big white useless space, and link to old design instead of new.

Yes, you right, but you should also remember, that your file can also be in another property, like `Content`. 

I think that you want to set some limit, for file which is available to upload to server. And in this case, this file will be uploaded at the server any way. And I would recommend to use FileAPI on client side, and you can check file size before loading it to the server.

No, in this case it will be just a list of tags, not a tag cloud. The same idea should be for block Browse by member. But looks like after some latest update it was broken, and sort people in some strange way, or even not show some useful persons.

And also, I forgot to mention about method CreateDirectoryChain in %File class. And you should use it, if you want just create a folder.

But back to $zf, can you try this command ?

set cmd="mkdir e:\Sample\new" > output.log 2> output.log"
set res=$zf(-1, cmd)

and what will be in res variable, and in output.log file which you can find in database folder for your namespace.

Ok, it was known that on non-Windows systems, used more then one write daemon. But why 8, and is it configurable somehow ? And as I know mgstat, shows activity of writedaemon, I understand and know how it looks like on Windows, but how it will looks like on Linux ? I think we need more information, about multiple write daemons, how they works.

This issue is not with with emoji. As you can see in html source for your post, you will see an IMG tag. And post just was splitted in wrong place, automatically. I fixed it by manually inserting separator. 

What do you mean by without creating a link to a particular table? You can create CSP with any of your ways to get table name which it should return.

Really, do you want to retrieve data from another database and show it with CSP ?

Well, it still possible, but needs more details. You can do it by creating some connection via JDBC or ODBC or in any other ways to this particular database, and call queries to get needed data. But it means you should know, how to connect to this database. Can you say, which database you should connect to? And maybe you can describe reasons why you should do so?

Dmitry Maslennikov · Nov 14, 2016 go to post

The title says, removal tool for System Methods. While such methods appeared only in JSON classes, like %DynamicObject which you mentioned. But this tool scans all code in all classes, for using these methods, and change it.

Dmitry Maslennikov · Nov 18, 2016 go to post

cconsole.log, it is a server's main log, where logged start/stop and some crash errors. You have an error when communication was terminated from the server side, in this case, I may expect that process which worked on it was crashed unexpected, and it should be logged there.

Dmitry Maslennikov · Nov 22, 2016 go to post

JDBC doesn't have any directives in this case, but I think if you ask InterSystems via WRC, about this feature, they may  add it in new versions.

Dmitry Maslennikov · Nov 24, 2016 go to post

Mostly disagree with your opinion. Docker is a good way for microservices, and docker it is not just one container, in most cases, you should use a bunch of them, each as a different service. And in this case, good way to control all this service is docker-compose. You can split your application into some different parts, database, frontend, and some other services.

And I don't see any problems, in such way, when InterSystems inside one container, with application's database. And the power of docker is you can run multiple copies of the container, at once, when it will be needed. I see only one problem here, is separated global buffer, it means that it used not efficiently. Can you give an example different way with the different database server? I've tried some of the databases, in a container, and they work in the same way.

Each container with InterSystems inside, and one our service inside. And I don't see any troubles here, even in security. Your way it is a bad way, it is like add a new layer with docker, like container (Application) inside another container (Caché), too complicated.

Dmitry Maslennikov · Nov 25, 2016 go to post

You got this error because you tried to use ODBC connection, but you say that you have JDBC connection. You should understand that it is different, with different ways to connect.

If you really use JDBC, you can create the new connection to the Oracle database, with a help from this article in the documentation. And with a code something like this, you can retrieve needed data from that server.

 #dim %JDBCGateway As %Net.Remote.Java.JDBCGateway
  set conn=$system.SQLGateway.GetJDBCConnection("cache2samples")
  if conn'="" {
    set cmd = "SELECT top 10 id,ssn,name,age,dob FROM Sample.Person"
    set st = %JDBCGateway.prepareStatement(conn,cmd)
    set %JDBCGateway.StatementCache(conn) = st
    set query = %JDBCGateway.execQuery(st)
    set columns=%JDBCGateway.getColumnCount(st)
    write !
    set pos=0
    for i=1:1:columns {
      set name=%JDBCGateway.getColumnName(st,i)
      set size=%JDBCGateway.getColumnDisplaySize(st,i)
      set pos(i)=pos
      set pos=pos+size+1
      write name,?pos
    }
    while %JDBCGateway.next(st) {
      write !
      for i=1:1:columns {
        write ?pos(i),%JDBCGateway.getString(st,i) 
      }
    }
  }

First error says Expected expression primary, next lines some different errors: Syntax errorExpected COS command