Thingworx新建Thing的数据库表变化
为了在Thingworx的基础上建立统一的可视化平台,并且对软件产品具有自主控制权,不依赖于Thingworx软件(防止因Thingworx的升级、Bug导致的自主扩展功能受制),所以最近在研究Thingworx软件操作数据库的过程。这个过程将对自主开发的可视化平台的设计决策树产生一定影响,目前无法预料最终的用途,暂时预计将同步具有OUTPUT的Service,作为可视化图表的数据来源。
方法:
方法很简单,首先pgdump把数据库导出成sql,加入到git或者svn版本控制中。然后在Thingworx中对各类对象进行操作,操作后再次导出sql并覆盖上一次导出文件,通过git或svn观察文件的变化。
1、新建Thing
我新建了一个Database的Thing,并建立了一个Service。
有三张表发生了变化,分别是model_index,thing_model,user_model_properties。
model_index记录的是Thing的名称类别等基本信息,从名字也可以看出,是在Things列表和查询中作为索引记录使用的。
thing_model中是Thing中所有的信息,包括其配置信息(比如Database需要配置jdbc连接信息)和服务信息,所有的数据以JSON格式展现,存在一行数据中。
user_model_properties中存的是Thing的自然信息,即Information页的内容,但是建了两个Thing,数据却在一行,暂时不明白其规则。
再来分析一下具体内容
Thing名字是ThingName,所以model_index有了一条新数据
entity_name:ThingName
entity_type:2401 (还不知道这个值从哪来)
last_modified_time:2018-03-08 09:09:08.955 类别是时间戳
entity_id:ThingName#Thing
还有几个值我没有填,所以数据库中没有显示,但是很容易理解,由于暂时不涉及接下来做的事,所以暂时不做研究。
注意description这个字段并不是Documentation中填的内容。
今天还发现system_ownership也发生了变化,会记录每一次IP发生变化时的登录信息,和要做的事暂时没有关系。
thing_model记录了Thing的所有信息
className:指向了实际操作了类,应该是ThingTemplate的实现类(ThingTemplate相当于类或接口,实际上是一个类)。DataBase类别的Thing指向了com.thingworx.things.database.DatabaseSystem
configurationChanges:是记录变化的json数据,不知道这部分数据是不是仅用作于审计,是否有系统业务意义有待考证。
documentationContent:在info页面的备注存在该字段下
designTimePermissions:看字段和时间和授权同时有关联,"{"Read":[],"Delete":[],"Create":[],"Metadata":[],"Update":[]}",不知道具体的数组数据里是怎么影响系统功能的。
ThingShape:包括了Service定义等内容
"{
"propertyDefinitions": {
},
"subscriptions": {
},
"eventDefinitions": {
},
"serviceImplementations": {
"ThingService": {
"name": "ThingService",
"description": "",
"handlerName": "Script",
"configurationTables": {
"Script": {
"isMultiRow": false,
"name": "Script",
"description": "Script",
"rows": [
{
"code": "var result='Hello World'"
}
],
"ordinal": 0,
"dataShape": {
"fieldDefinitions": {
"code": {
"name": "code",
"aspects": {
},
"description": "code",
"baseType": "STRING",
"ordinal": 0
}
}
}
}
}
},
"SysUserService": {
"name": "SysUserService",
"description": "",
"handlerName": "SQLQuery",
"configurationTables": {
"Query": {
"isMultiRow": false,
"name": "Query",
"description": "SQLQuery",
"rows": [
{
"maxItems": 500.0,
"timeout": 60.0,
"sql": "select * from sys_user"
}
],
"ordinal": 0,
"dataShape": {
"fieldDefinitions": {
"maxItems": {
"name": "maxItems",
"aspects": {
},
"description": "maxItems",
"baseType": "NUMBER",
"ordinal": 0
},
"timeout": {
"name": "timeout",
"aspects": {
},
"description": "timeout",
"baseType": "NUMBER",
"ordinal": 0
},
"sql": {
"name": "sql",
"aspects": {
},
"description": "sql",
"baseType": "STRING",
"ordinal": 0
}
}
}
}
}
}
},
"serviceMappings": {
},
"serviceDefinitions": {
"ThingService": {
"isAllowOverride": false,
"isOpen": false,
"sourceType": "Unknown",
"parameterDefinitions": {
},
"name": "ThingService",
"aspects": {
"isAsync": false
},
"isLocalOnly": false,
"description": "",
"isPrivate": false,
"sourceName": "",
"category": "",
"resultType": {
"name": "result",
"aspects": {
},
"description": "",
"baseType": "STRING",
"ordinal": 0
}
},
"SysUserService": {
"isAllowOverride": false,
"isOpen": false,
"sourceType": "Unknown",
"parameterDefinitions": {
},
"name": "SysUserService",
"aspects": {
"isAsync": false
},
"isLocalOnly": false,
"description": "",
"isPrivate": false,
"sourceName": "",
"category": "",
"resultType": {
"name": "result",
"aspects": {
},
"description": "",
"baseType": "INFOTABLE",
"ordinal": 0
}
}
}
}"
configurationTables:这里包括了对Database抽象类里关于数据库连接的实现,对应Thing下的Configuration。
{ "ConnectionInfo": { "isMultiRow": false, "name": "ConnectionInfo", "description": "JDBC Settings", "rows": [ { "connectionValidationString": "SELECT NOW()", "password": "vjK5R/V7oLTlC4xca7EDCQ==", "jDBCConnectionURL": "jdbc:postgresql://localhost:5432/iot", "userName": "postgres", "jDBCDriverClass": "org.postgresql.Driver", "maxConnections": 5.0 } ], "ordinal": 0, "dataShape": { "fieldDefinitions": { "connectionValidationString": { "name": "connectionValidationString", "aspects": { "defaultValue": "SELECT NOW()" }, "description": "Connection test string/query", "baseType": "STRING", "ordinal": 2 }, "password": { "name": "password", "aspects": { "friendlyName": "Database Password" }, "description": "Database password", "baseType": "PASSWORD", "ordinal": 5 }, "jDBCConnectionURL": { "name": "jDBCConnectionURL", "aspects": { "defaultValue": "jdbc:mydb:/server:port/database?param=value", "friendlyName": "JDBC Connection String" }, "description": "JDBC Connection URL", "baseType": "STRING", "ordinal": 1 }, "userName": { "name": "userName", "aspects": { "friendlyName": "Database User Name" }, "description": "Database user name", "baseType": "STRING", "ordinal": 4 }, "jDBCDriverClass": { "name": "jDBCDriverClass", "aspects": { "defaultValue": "com.yourdatabase.yourDriver", "friendlyName": "JDBC Driver Class Name" }, "description": "JDBC Driver Class Name", "baseType": "STRING", "ordinal": 0 }, "maxConnections": { "name": "maxConnections", "aspects": { "defaultValue": 5.0, "friendlyName": "Maxium Number of Connections" }, "description": "Maximum number of connections in the pool", "baseType": "NUMBER", "ordinal": 3 } } } }, "ConnectionMonitoring": { "isMultiRow": false, "name": "ConnectionMonitoring", "description": "Connection Monitoring Settings", "rows": [ { "retryDelay": 2000.0, "connectionMonitorRate": 30000.0, "numberOfRetries": 1.0, "enableMonitor": false } ], "ordinal": 0, "dataShape": { "fieldDefinitions": { "retryDelay": { "name": "retryDelay", "aspects": { "defaultValue": 2000.0, "friendlyName": "Retry Delay (milliseconds)" }, "description": "Retry delay in milliseconds", "baseType": "NUMBER", "ordinal": 3 }, "connectionMonitorRate": { "name": "connectionMonitorRate", "aspects": { "defaultValue": 30000.0, "friendlyName": "Monitor Rate (seconds)" }, "description": "Monitor rate in milliseconds", "baseType": "NUMBER", "ordinal": 1 }, "numberOfRetries": { "name": "numberOfRetries", "aspects": { "defaultValue": 1.0, "friendlyName": "Number of Retries" }, "description": "Number of retries", "baseType": "NUMBER", "ordinal": 2 }, "enableMonitor": { "name": "enableMonitor", "aspects": { "defaultValue": false, "friendlyName": "Enable Monitoring" }, "description": "Enable connection monitoring", "baseType": "BOOLEAN", "ordinal": 0 } } } }, "ColumnAliases": { "isMultiRow": true, "name": "ColumnAliases", "description": "Field/Column Name Aliases", "rows": [], "ordinal": 1, "dataShape": { "fieldDefinitions": { "fieldName": { "name": "fieldName", "aspects": { "friendlyName": "Thingworx Field Name" }, "description": "Thingworx field name", "baseType": "STRING", "ordinal": 1 }, "columnName": { "name": "columnName", "aspects": { "friendlyName": "Database Column Name" }, "description": "Database column name", "baseType": "STRING", "ordinal": 0 } } } } }

浙公网安备 33010602011771号