diff --git a/lib/sql/models/sql_table.p b/lib/sql/models/sql_table.p index 3f433c4..221bd8c 100644 --- a/lib/sql/models/sql_table.p +++ b/lib/sql/models/sql_table.p @@ -989,7 +989,8 @@ pfClass ## now, auto_now — текущие дата время (если не задано значение поля) ## curtime, auto_curtime — текущее время (если не задано значение поля) ## curdate, auto_curdate — текущая дата (если не задано значение поля) -## json — сереиализует значение в json +## json, json_null — сереиализует значение в json, если значение пустое, то null +## json_not_null — сереиализует значение в json, если значение пустое, то '{}' ## null — если не задано значение, то возвращает null ## uint_null — преобразуем зачение в целое без знака, если не задано значение, то возвращаем null ## uid, auto_uid — уникальный идентификатор (math:uuid) @@ -1150,8 +1151,12 @@ pfClass $result[^if(def $aValue){'^if($aValue is date){^aValue.sql-string[time]}{^taint[$aValue]}'}{NULL}] } - ^case[json]{ - $result[^if(def $aValue || $aValue is hash){'^taint[^json:string[$aValue]]'}{NULL}] + ^case[json;json_null]{ + $result[^if(def $aValue || $aValue is hash){'^taint[^json:string[$aValue;$.one-line(true)]]'}{NULL}] + } + + ^case[json_not_null]{ + $result[^if(def $aValue || $aValue is hash){'^taint[^json:string[$aValue;$.one-line(true)]]'}{'{}'}] } ^case[uid;auto_uid;uuid;uuid_auto]{ diff --git a/ut/sql/sql_table/common_test.p b/ut/sql/sql_table/common_test.p index 974869f..7ce90a5 100644 --- a/ut/sql/sql_table/common_test.p +++ b/ut/sql/sql_table/common_test.p @@ -134,3 +134,25 @@ pfTestCase ^self.assertRaises[assert.fail]{ ^sut.sqlFieldName[unexistant] } + +@test_sql_json_processors[] + ^self.sut.addFields[ + $.j1[$.processor[json]] + $.j2[$.processor[json_null]] + $.j3[$.processor[json_not_null]] + ] + + ^self.assertEq[^self.sut.fieldValue[j1;];NULL] + ^self.assertEq[^self.sut.fieldValue[j1;value];'"value"'] + ^self.assertEq[^self.sut.fieldValue[j1;^hash::create[]];'{}'] + ^self.assertEq[^self.sut.fieldValue[j1;$.k1[v1] $.k2[v2]];'{ "k1":"v1", "k2":"v2" }'] + + ^self.assertEq[^self.sut.fieldValue[j2;];NULL] + ^self.assertEq[^self.sut.fieldValue[j2;value];'"value"'] + ^self.assertEq[^self.sut.fieldValue[j2;^hash::create[]];'{}'] + ^self.assertEq[^self.sut.fieldValue[j2;$.k1[v1] $.k2[v2]];'{ "k1":"v1", "k2":"v2" }'] + + ^self.assertEq[^self.sut.fieldValue[j3;];'{}'] + ^self.assertEq[^self.sut.fieldValue[j3;value];'"value"'] + ^self.assertEq[^self.sut.fieldValue[j3;^hash::create[]];'{}'] + ^self.assertEq[^self.sut.fieldValue[j3;$.k1[v1] $.k2[v2]];'{ "k1":"v1", "k2":"v2" }']