blob: b2863c62c7bd1f85df26dc376388582483b825a0 [file] [log] [blame]
/**
*
* Copyright (c) 2021 Silicon Labs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* This module provides queries for ZCL static entities
* inside a single session. Things like:
* all visible clusters, etc.
*
* @module DB API: zcl database access
*/
const dbApi = require('./db-api.js')
const dbMapping = require('./db-mapping.js')
const dbEnum = require('../../src-shared/db-enum.js')
/**
* Returns the cluster available to this session by the code.
*
* @param {*} db
* @param {*} sessionId
* @param {*} code
* @param {*} mfgCode
* @returns all the cluster objects for a given session.
*/
async function selectSessionClusterByCode(db, sessionId, code, mfgCode) {
let args = [sessionId, code]
if (!(mfgCode == 0 || mfgCode == null)) args.push(mfgCode)
return dbApi
.dbGet(
db,
`
SELECT
C.CLUSTER_ID,
C.PACKAGE_REF,
C.CODE,
C.MANUFACTURER_CODE,
C.NAME,
C.DESCRIPTION,
C.DEFINE,
C.DOMAIN_NAME,
C.IS_SINGLETON,
C.REVISION,
C.API_MATURITY
FROM
CLUSTER AS C
INNER JOIN
SESSION_PACKAGE AS SP
ON
C.PACKAGE_REF = SP.PACKAGE_REF
INNER JOIN
SESSION_PARTITION
ON
SESSION_PARTITION.SESSION_PARTITION_ID = SP.SESSION_PARTITION_REF
WHERE
SESSION_PARTITION.SESSION_REF = ? AND C.CODE = ? AND ${
mfgCode == 0 || mfgCode == null
? 'C.MANUFACTURER_CODE IS NULL'
: 'C.MANUFACTURER_CODE = ?'
}
`,
args
)
.then(dbMapping.map.cluster)
}
/**
* Returns all the clusters visible for a given session.
*
* @param {*} db
* @param {*} sessionId
* @returns all the cluster objects for a given session.
*/
async function selectAllSessionClusters(db, sessionId) {
return dbApi
.dbAll(
db,
`
SELECT
C.CLUSTER_ID,
C.PACKAGE_REF,
C.CODE,
C.MANUFACTURER_CODE,
C.NAME,
C.DESCRIPTION,
C.DEFINE,
C.DOMAIN_NAME,
C.IS_SINGLETON,
C.REVISION
FROM
CLUSTER AS C
INNER JOIN
SESSION_PACKAGE AS SP
ON
C.PACKAGE_REF = SP.PACKAGE_REF
INNER JOIN
SESSION_PARTITION
ON
SESSION_PARTITION.SESSION_PARTITION_ID = SP.SESSION_PARTITION_REF
WHERE
SESSION_PARTITION.SESSION_REF = ?
`,
[sessionId]
)
.then((rows) => rows.map(dbMapping.map.cluster))
}
/**
* Returns the attribute available to this session by the code.
*
* @param {*} db
* @param {*} sessionId
* @param {*} clusterCode
* @param {*} side
* @param {*} attributeCode
* @param {*} mfgCode
* @returns the session attribute
*/
async function selectSessionAttributeByCode(
db,
sessionId,
clusterCode,
side,
attributeCode,
mfgCode
) {
return dbApi
.dbGet(
db,
`
SELECT
ATTRIBUTE.ATTRIBUTE_ID,
ATTRIBUTE.CLUSTER_REF,
ATTRIBUTE.CODE,
ATTRIBUTE.MANUFACTURER_CODE,
ATTRIBUTE.NAME,
ATTRIBUTE.TYPE,
ATTRIBUTE.SIDE,
ATTRIBUTE.DEFINE,
ATTRIBUTE.MIN,
ATTRIBUTE.MAX,
ATTRIBUTE.REPORT_MIN_INTERVAL,
ATTRIBUTE.REPORT_MAX_INTERVAL,
ATTRIBUTE.REPORTABLE_CHANGE,
ATTRIBUTE.REPORTABLE_CHANGE_LENGTH,
ATTRIBUTE.IS_WRITABLE,
ATTRIBUTE.IS_READABLE,
ATTRIBUTE.DEFAULT_VALUE,
ATTRIBUTE.IS_OPTIONAL,
ATTRIBUTE.REPORTING_POLICY,
ATTRIBUTE.IS_NULLABLE,
ATTRIBUTE.IS_SCENE_REQUIRED,
ATTRIBUTE.ARRAY_TYPE,
ATTRIBUTE.MUST_USE_TIMED_WRITE,
ATTRIBUTE.IS_CHANGE_OMITTED,
ATTRIBUTE.PERSISTENCE
FROM
ATTRIBUTE, CLUSTER, SESSION_PACKAGE
INNER JOIN
SESSION_PARTITION
ON
SESSION_PACKAGE.SESSION_PARTITION_REF= SESSION_PARTITION.SESSION_PARTITION_ID
WHERE
SESSION_PARTITION.SESSION_REF = ? AND
ATTRIBUTE.PACKAGE_REF = SESSION_PACKAGE.PACKAGE_REF AND ATTRIBUTE.CODE = ? AND
((ATTRIBUTE.CLUSTER_REF = CLUSTER.CLUSTER_ID AND CLUSTER.CODE = ?) OR
(ATTRIBUTE.CLUSTER_REF IS NULL)) AND ATTRIBUTE.SIDE = ?
`,
[sessionId, attributeCode, clusterCode, side]
)
.then(dbMapping.map.attribute)
}
/**
* Returns the command available to this session by the code.
*
* @param {*} db
* @param {*} sessionId
* @param {*} clusterCode
* @param {*} commandCode
* @param {*} source
* @returns the session attribute
*/
async function selectSessionCommandByCode(
db,
sessionId,
clusterCode,
commandCode,
source
) {
return dbApi
.dbGet(
db,
`
SELECT
CMD.COMMAND_ID,
CMD.CLUSTER_REF,
CMD.PACKAGE_REF,
CMD.CODE,
CMD.MANUFACTURER_CODE,
CMD.NAME,
CMD.DESCRIPTION,
CMD.SOURCE,
CMD.IS_OPTIONAL,
CMD.MUST_USE_TIMED_INVOKE,
CMD.IS_FABRIC_SCOPED,
CMD.RESPONSE_REF,
CMD.IS_LARGE_MESSAGE
FROM
COMMAND AS CMD
INNER JOIN
CLUSTER AS C
ON
CMD.CLUSTER_REF = C.CLUSTER_ID
INNER JOIN
SESSION_PACKAGE AS SP
ON
C.PACKAGE_REF = SP.PACKAGE_REF
INNER JOIN
SESSION_PARTITION
ON
SESSION_PARTITION.SESSION_PARTITION_ID = SP.SESSION_PARTITION_REF
WHERE
SESSION_PARTITION.SESSION_REF = ? AND C.CODE = ? AND CMD.CODE = ? AND CMD.SOURCE = ?
`,
[sessionId, clusterCode, commandCode, source]
)
.then(dbMapping.map.command)
}
exports.selectAllSessionClusters = selectAllSessionClusters
exports.selectSessionClusterByCode = selectSessionClusterByCode
exports.selectSessionAttributeByCode = selectSessionAttributeByCode
exports.selectSessionCommandByCode = selectSessionCommandByCode