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
}
}
}
}
}
Thingworx新建Thing的数据库表变化的更多相关文章
- 老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化
开发环境: .net / C# (.net core理论上也可以) 数据库:MS SQL Server 2005 以上 (我用的sqlserver2012) 功能:SqlDependency提供了一种 ...
- 使用SqlDependency监听MSSQL数据库表变化通知
SqlDependency提供了这样一种机制,当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...
- JAVA整合FlinkCDC 监控数据库表变化
版本至少jdk8 maven <!-- https://mvnrepository.com/artifact/com.alibaba.ververica/flink-connector-mysq ...
- SqlDependency C#代码监听数据库表的变化
SqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...
- 新建oracle数据库表空间及删除表空间和用户
进入oracle的命令控制台,按具体情况执行以下命令: sqlplus 默认数据库普通用户登录sqlplus / as sysdba 默认数据库管理员登录sqlplus username/passwo ...
- 新建oracle数据库表空间
1.新建表空间,注意是数据表空间,不是临时表空间 create tablespace CARD logging datafile 'C:\app\tablespace\CARD.DBF' //注 ...
- 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)
一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...
- 数据库表空间收缩之pg_squeeze,pg_repack
数据库表空间收缩之pg_squeeze,pg_repack 目录 数据库表空间收缩之pg_squeeze,pg_repack pg_squeeze1.2 原理 优点 安装 使用 pgstattuple ...
- 对于多个数据库表对应一个Model问题的思考
最近做项目遇到一个场景,就是客户要求为其下属的每一个分支机构建一个表存储相关数据,而这些表的结构都是一样的,只是分属于不同的机构.这个问题抽象一下就是多个数据库表对应一个Model(或者叫实体类).有 ...
随机推荐
- ZBrush中如何将一个模型应用在不同的图层
我们经常会使用ZBrush®中的插入笔刷来实现快速建模,或者使用Insert笔刷创建人物四肢,那么在使用这些笔刷时,它默认是和所接触模型同在一个Subtool,如果您需要不同的材质或者雕刻手法,那么就 ...
- 创建一个dynamics CRM workflow (三) - Creating Configuration Entity for Custom Workflow
上个帖子中, 我们创建了个发email的workflow. 但是我们邮件当中的tax 值是 hard code, 这在开发当中是不容许的. 那今天我们来把这个build in workflow用 in ...
- MongoDB 学习笔记(七):主从复制与副本集
一.主从复制 1.主从复制是一个简单的数据库同步备份的集群技术,如下图:要明确的知道主服务器与从服务器,且从服务器要明确的知道主服务器的存在. 2.在MongoDB中在启动数据库服务时,可以用mast ...
- echarts示例
将做过的echarts图表通过示例形式展示,便于以后使用,基于vue ,echarts,leancloud实现 github源码地址:https://github.com/707293891/echa ...
- 记一次vip视频破解过程(爱奇艺 芒果 腾讯 优酷 )
1. 在爱奇艺或者优酷中拿到视频的url地址.此时拿到的是加密地址(也可以直接在牛巴巴里面搜名字然后开f12跟踪路由) 2.进入牛巴巴vip视频解析网站.粘贴拿到的url.点击解析 3.f12在net ...
- 16种C语言编译警告(Warning)类型的解决方法
当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息.警告信息可能意味着程序中隐含的大错误,也可能确实没有问题.对于警告的正确处理方式应该是:尽可能地消除之.对于编译程序给出的每个警告 ...
- 【JavaScript框架封装】JavaScript中的文本字符串的转义和反转义的实现
如果是想把本地的一个字符串串存到服务器,再次取出来的还是文本的话,就需要这个文本字符串的转义: /** * 对一个字符串的转义 * @param str * @return {*} */ functi ...
- XSS Chanllenges 6-10
Stage #6 测试代码</xss> 存在过滤,并且也没有其他输入点,尝试构建" onmousemove="alert(document.domain),并查看源代码 ...
- [tyvj 1071] LCIS
题目描述 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了. 小沐沐说,对于两个串A,B,如果它们 ...
- 参数化取值策略Random
1.Random+Each iteration,跟顺序读取的结果唯一不同的就是这里是随机读取,取值是每次迭代取值 2.Random+Each occurrence,随机取值更新方式 3.R ...