Browse Source

doc: klish-plugin-db picture

Serj Kalichev 2 months ago
parent
commit
bd04cbe90f
3 changed files with 113 additions and 5 deletions
  1. 88 0
      docs/klish-plugin-db.drawio
  2. BIN
      docs/klish-plugin-db.png
  3. 25 5
      docs/klish3.ru.md

+ 88 - 0
docs/klish-plugin-db.drawio

@@ -0,0 +1,88 @@
+<mxfile host="Electron" modified="2024-02-26T15:35:47.727Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="acY9_RgwTHBwUnogUXwn" version="23.1.5" type="device">
+  <diagram name="Страница — 1" id="OUudB_qsvCB226KxlGIW">
+    <mxGraphModel dx="956" dy="605" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+      <root>
+        <mxCell id="0" />
+        <mxCell id="1" parent="0" />
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-1" value="" style="whiteSpace=wrap;html=1;align=center;dashed=1;fillStyle=auto;" vertex="1" parent="1">
+          <mxGeometry x="40" y="40" width="420" height="220" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-2" value="Слушающий сервер klishd" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+          <mxGeometry x="40" y="40" width="160" height="30" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-4" value="Внутреннее представление конфигурации команд kscheme" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="60" y="80" width="100" height="160" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-5" value="Промежуточное представление конфигурации команд ischeme" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="200" y="80" width="100" height="160" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-6" value="Плагин БД libxml2" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="340" y="80" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-7" value="Плагин БД libexpat" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="340" y="140.5" width="100" height="39" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-8" value="Плагин БД libroxml" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="340" y="200" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-10" value="" style="whiteSpace=wrap;html=1;align=center;dashed=1;fillStyle=auto;" vertex="1" parent="1">
+          <mxGeometry x="520" y="40" width="160" height="220" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-11" value="XML конфигурация команд" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+          <mxGeometry x="520" y="40" width="160" height="30" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-12" value="XML файл конфигурации 1" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="550" y="80" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-13" value="&lt;font style=&quot;font-size: 32px;&quot;&gt;...&lt;/font&gt;" style="whiteSpace=wrap;html=1;align=center;strokeColor=none;" vertex="1" parent="1">
+          <mxGeometry x="550" y="130" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-14" value="XML файл конфигурации N" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+          <mxGeometry x="550" y="200" width="100" height="40" as="geometry" />
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-15" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="lojdyQg56bxN2ZcsIYBC-6">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="520" y="100" as="sourcePoint" />
+            <mxPoint x="440" y="170" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-16" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="520" y="159.88" as="sourcePoint" />
+            <mxPoint x="440" y="159.88" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-17" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="520" y="219.88" as="sourcePoint" />
+            <mxPoint x="440" y="219.88" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-18" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="340" y="160" as="sourcePoint" />
+            <mxPoint x="300" y="159.88" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-19" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="340" y="220" as="sourcePoint" />
+            <mxPoint x="300" y="219.88" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-20" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="340" y="100" as="sourcePoint" />
+            <mxPoint x="300" y="99.88" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+        <mxCell id="lojdyQg56bxN2ZcsIYBC-21" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1">
+          <mxGeometry width="50" height="50" relative="1" as="geometry">
+            <mxPoint x="200" y="160" as="sourcePoint" />
+            <mxPoint x="160" y="159.88" as="targetPoint" />
+          </mxGeometry>
+        </mxCell>
+      </root>
+    </mxGraphModel>
+  </diagram>
+</mxfile>

BIN
docs/klish-plugin-db.png


+ 25 - 5
docs/klish3.ru.md

@@ -115,17 +115,37 @@ Klish имеет два типа плагинов. Плагины для заг
 
 ## Загрузка конфигурации команд
 
-В составе klish существуют следующие плагины dbs (DataBases) для загрузки
-конфигурации команд (схемы):
+![Загрузка конфигурации команд](/klish-plugin-db.png "Загрузка конфигурации команд")
+
+Внутренним представлением конфигурации команд в klish является kscheme. Kscheme -
+это набор C-структур, представляющих все дерево доступных пользователю команд,
+областей видимости, параметров и т.д. Именно по этим структурам производится
+вся внутренняя работа - поиск команд, автодополнение, формирование подсказок при
+взаимодействии с пользователем.
+
+В klish существует промежуточное представление конфигурации команд в виде
+С-структур, называемое ischeme. Это представление вцелом похоже на kscheme, но
+отличается от него тем, что все поля конфигурации предствлены в текстовом виде,
+все ссылки на другие объекты также являются текстовыми именами объектов, на
+которые ссылаются, а не указателями, как в kscheme. Существуют и другие отличия.
+Таким образом ischeme можно назвать "неоткомпилированной схемой", а kscheme -
+"откомпилированной". "Компиляция", т.е. преобразование ischeme в kscheme
+производится внутренними механизмами klish. Ischeme может быть вручную задано
+пользователем в виде C-структур и собрано в виде отдельного плагина базы данных.
+В этом случае другие плагины баз данных не понадобятся, вся конфигурацию уже
+готова к преобразованию в kscheme.
+
+В составе klish (см. dbs/) существуют следующие плагины баз данных для загрузки
+конфигурации команд, т.е. схемы:
 
 * expat - Использует библиотеку expat для загрузки конфигурации из XML.
 * libxml2 - Использует библиотеку libxml2 для загрузки конфигурации из XML.
 * roxml - Использует библиотеку roxml для загрузки конфигурации из XML.
 * ischeme - Использует встроенную в C-код конфигурацию (Internal Scheme).
 
-Существует внутреннее представление схемы, совпадающее с ischeme.
-Остальные плагины переводят внешние представление в ischeme, а klish
-обрабатывает ischeme внутренними механизмами.
+Все плагины баз данных переводят внешнюю конфигурацию, полученную например из
+XML файлов, в ischeme. В случае ischeme, дополнительный этап преобразования не
+требуется, т.к. ischeme уже готово.
 
 Установленные плагины dbs находятся в `/usr/lib` (если конфигурировать
 сборку с --prefix=/usr). Их имена `libklish-db-<имя>.so`, например