diff --git a/packages/filterparser/src/filterTool.ts b/packages/filterparser/src/filterTool.ts index 552f37bfe..3eb9ef466 100644 --- a/packages/filterparser/src/filterTool.ts +++ b/packages/filterparser/src/filterTool.ts @@ -1,4 +1,4 @@ -import { isTypeDateTime } from 'dbgate-tools'; +import { arrayToHexString, isTypeDateTime } from 'dbgate-tools'; import moment from 'moment'; export type FilterMultipleValuesMode = 'is' | 'is_not' | 'contains' | 'begins' | 'ends'; @@ -9,6 +9,10 @@ export function getFilterValueExpression(value, dataType?) { if (value === true) return 'TRUE'; if (value === false) return 'FALSE'; if (value.$oid) return `ObjectId("${value.$oid}")`; + if (value.type == 'Buffer' && Array.isArray(value.data)) { + return '0x' + arrayToHexString(value.data); + } + return `="${value}"`; } diff --git a/packages/filterparser/src/parseFilter.ts b/packages/filterparser/src/parseFilter.ts index 65c2b988f..8a3755b4b 100644 --- a/packages/filterparser/src/parseFilter.ts +++ b/packages/filterparser/src/parseFilter.ts @@ -5,6 +5,7 @@ import { Condition } from 'dbgate-sqltree'; import { interpretEscapes, token, word, whitespace } from './common'; import { mongoParser } from './mongoParser'; import { datetimeParser } from './datetimeParser'; +import { hexStringToArray } from 'dbgate-tools'; const binaryCondition = operator => value => ({ conditionType: 'binary', @@ -104,6 +105,14 @@ const createParser = (filterType: FilterType) => { .map(Number) .desc('number'), + hexstring: () => + token(P.regexp(/0x(([0-9a-fA-F][0-9a-fA-F])+)/, 1)) + .map(x => ({ + type: 'Buffer', + data: hexStringToArray(x), + })) + .desc('hex string'), + noQuotedString: () => P.regexp(/[^\s^,^'^"]+/).desc('string unquoted'), sql: () => @@ -113,6 +122,7 @@ const createParser = (filterType: FilterType) => { value: r => P.alt(...allowedValues.map(x => r[x])), valueTestEq: r => r.value.map(binaryCondition('=')), + hexTestEq: r => r.hexstring.map(binaryCondition('=')), valueTestStr: r => r.value.map(likeCondition('like', '%#VALUE#%')), comma: () => word(','), @@ -158,7 +168,7 @@ const createParser = (filterType: FilterType) => { allowedElements.push('le', 'ge', 'lt', 'gt'); } if (filterType == 'string') { - allowedElements.push('empty', 'notEmpty'); + allowedElements.push('empty', 'notEmpty', 'hexTestEq'); } if (filterType == 'eval' || filterType == 'string') { allowedElements.push('startsWith', 'endsWith', 'contains', 'startsWithNot', 'endsWithNot', 'containsNot');