SQL4 сам устанавливает HTTP-соединение. Входными данными является XML-текст (с тем послаблением, что если xml-элемент не имеет вложенных элементов, то он может не иметь знака слэш перед закрывающей угловой скобкой), выходными данными является XML-текст. Клиент извлекает картинку из базы данных по ее URL и отдельно от XML-данных.
Получив входные данные, СУБД выполняет следующие действия:
ввод в СУБД | DDL | введено |
<formdata> <x data1="Larry" data2="oid_in_traffic"> </formdata> |
create table formdata ( id num primary key, sal varchar, san num4, sp num2, ral varchar, ran num4, rp num2, ru varchar, rs varchar, g varchar, su varchar ); create table x ( id num primary key, srv num references formdata, data1 varchar, data2 blob ); |
insert into formdata values (1, asker.org, 111.111.111.111, 80, distination.org, 222.222.222.222, 80, tomson, car-celler, BrowserName ); insert into x values (10, 1, Larry, file_content); |
Успешность записи xml-деревьев в базу данных зависит от того, соответствует ли схема базы вводимому дереву (при несоответствии некоторые xml-под-деревья игнорируются). В спорных случаях привести в соответствие можно с помощью детерминации в xml-дереве. В примерах ниже предполагается, что все первичные ключи снабжены последовательностями, значения из которых вводятся в эти ключи по умолчанию.
ввод в СУБД | DDL | введено |
<formdata> <a data=12.3> <b data=23.4> <b data=34.5> <b data=45.6> </a> </formdata> |
create table a ( id num primary key, srv num references formdata, data float ); create table b ( id num primary key, ref num references a(id), data float ); |
insert into formdata values (1); insert into a values (10, 1, 12.3); insert into b values (101, 10, 23.4); insert into b values (102, 10, 34.5); insert into b values (103, 10, 45.6); -- секция "b" является множеством |
<formdata> <a data=12.3> <b data=23.4> <b data=34.5> <b data=45.6> </a> </formdata> |
create table a ( id num primary key, srv num references formdata, data float ); create table b ( id num primary key, ref1 num references a(id), ref2 num references a(id), data float ); |
insert into formdata values (1); insert into a values (10, 1, 12.3); |
<formdata> <a/ref1 data=12.3> <b data=23.4> <b data=34.5> <b data=45.6> </a> </formdata> |
create table a ( id num primary key, srv num references formdata, data float ); create table b ( id num primary key, ref1 num references a(id), ref2 num references a(id), data float ); |
insert into formdata values (1); insert into a values (10, 1, 12.3); insert into b values (101, 10, null, 23.4); insert into b values (102, 10, null, 34.5); insert into b values (103, 10, null, 45.6); |
<formdata> <a data=12.3> <b data=23.4> </a> </formdata> |
create table a ( id num primary key, srv num references formdata, ref num references b(id), data float ); create table b ( id num primary key, data float ); |
insert into formdata values (1); insert into a values (10, 1, 100, 12.3); insert into b values (100, 23.4); -- секция "b" является эстафетой |
<formdata> <a data=12.3> <b data=23.4> </a> </formdata> |
create table a ( id num primary key, srv num references formdata, ref1 num references b(id), ref2 num references b(id), data float ); create table b ( id num primary key, data float ); |
insert into formdata values (1); insert into a values (10, 1, null, null, 12.3); |
<formdata> <a data=12.3> <b/ref1 data=23.4> </a> </formdata> |
create table a ( id num primary key, srv num references formdata, ref1 num references b(id), ref2 num references b(id), data float ); create table b ( id num primary key, data float ); |
insert into formdata values (1); insert into a values (10, 1, 100, null, 12.3); insert into b values (100, 23.4); |
<formdata> <a data=12.3> <b data=23.4> <b data=34.5> <b data=45.6> </a> </formdata> |
create table a ( id num primary key, srv num references formdata, ref num references b(id), data float ); create table b ( id num primary key, data float ); |
insert into formdata values (1); insert into a values (10, 1, null, 12.3); -- секция "b" не введена (все теги вместе!), -- т.к. схема базы не содержит -- ни множества, ни списка для нее |
<formdata> <a data=12.3> <b data=23.4> <b data=34.5> <b data=45.6> </a> </formdata> |
create table a ( id num primary key, srv num references formdata, ref num references b(id), data float ); create table b ( id num primary key, ref num references b(id), data float ); |
insert into formdata values (1); insert into a values (10, 1, 101, 12.3); insert into b values (101, 102, 23.4); insert into b values (102, 103, 34.5); insert into b values (103, null, 45.6); -- секция "b" является списком |
Для предотвращения вывода некоторых таблиц и полей перед их именами нужно поставить знак "#".
a[data10.1].#b.c[#data] ; |
<a id=1 data=10.1> <c id=100 /> <c id=101 /> <c id=200 /> <c id=201 /> <c id=200 /> </a> |
a[data10.1].#b.c#[id] ; |
<a id=1 data=10.1> <c id=100 /> <c id=101 /> <c id=200 /> <c id=201 /> <c id=200 /> </a> |
Если звено является списком, то вывод его элементов (записей) можно упорядочить по возрастанию или убыванию значений некоторых полей. Для этого перед именами этих полей нужно поставить целое число и знак "§" (будем называть это число фактором, factor. Фактор не может быть равен нулю). Поля будут использованы для сортировки в той последовательности, в какой возрастают модули их факторов. Положительный фактор означает сортировку по возрастанию, отрицательный - по убыванию. Таким образом TML-выражение
a.b.c ; |
<a id=1 data=12.3> <b id=10 data=23.4> <c id=100 data=56.7/> <c id=101 data=67.8/> </b> <b id=20 data=34.5> <c id=200 data=78.9/> <c id=201 data=89.1/> </b> <b id=30 data=45.6> <c id=200 data=91.2/> </b> </a> |
a.b[-1§data].c[-1§data] ; |
<a id=1 data=12.3> <b id=30 data=45.6> <c id=200 data=91.2/> </b> <b id=20 data=34.5> <c id=201 data=89.1/> <c id=200 data=78.9/> </b> <b id=10 data=23.4> <c id=101 data=67.8/> <c id=100 data=56.7/> </b> </a> |
Можно запросить не все неотсортированные записи, а только начинающиеся с какой-то определенной записи, для которой нам известны значения всех ее полей. Для этого перед именами всех полей нужно поставить знак "§", а после них знак "=" и значение поля. Таким образом TML-выражение
Можно запросить не все отсортированные записи, а только начинающиеся с какой-то определенной записи - для этого надо одновременно применить сортировку и стартировку. Таким образом TML-выражение
Значением поля базы данных может быть картинка, но по TML-запросу как значение поля отправляется не она, а ее URL для отдельного HTTP-запроса браузера. В HTML4 браузер сможет использовать этот атрибут (поле) только если его имя есть "src" и он находится в теге (таблице) "IMG". В HTML5 браузер может использовать его в атрибуте "src" любого тега, если последний имеет свойство "display: img".
x ; |
<x id="10" data1="Larry" data2="http://distination.org/?file_id=6382503452"> |
Вывести можно произвольный текст
'<?xml-stylesheet type="text/xsl" href="a.xsl"?>' ; |
<?xml-stylesheet type="text/xsl" href="a.xsl"?> |
'text' ; |
text |
'<anytag>' ; |
<anytag> |
'</anytag>' ; |
</anytag> |
a[data10.1].b.c ; |
<a id=1 data=10.1> <b id=10 data=23.4> <c id=100 data=56.7/> <c id=101 data=67.8/> </b> <b id=20 data=34.5> <c id=200 data=78.9/> <c id=201 data=89.1/> </b> <b id=30 data=45.6> <c id=200 data=91.2/> </b> </a> |
Данные отправляются тому адресату, который в момент отправки указан в полях ral и ru таблицы sys. При старте триггера таблицы 'formdata' эти значения указывают на браузер, приславший запрос, но их в любой момент можно изменить (таким образом база данных сама может сделать запрос в другие базы данных для формирования ответа браузеру).
Для того, чтобы задублировать дерево в базе данных, нужно отправить его самому себе - для этого ran=0.