2021年3月25日木曜日

sednaで複数の更新を一気に行うための下準備をsedna側クエリとpugixmlでやろうとしてる

ここ数日色々調べてできたところまでまとめてみた
「sednaで複数の更新を一気に行うための下準備をsedna側クエリとpugixmlでやろうとしてる」
フロントエンドからの要求に基づいて、複数行の更新をしようとしたときに、Sednaにはその機能が無いため、コントローラ側で実装することになるわけだ。
普通のDBに例えると、
「フロントエンドから、データベースのカラムを増やして、そこに既存のテキストをとりあえずインサートしたい」
という要求にこたえるための処理を書いている。
pugixmlが早いというので、それをXML処理に採用した。
sedna側のクエリで特定のタグはCDATAセクションに指定できることがわかったので、XML文を含むテキスト(sednaに渡す命令)全体をCDATAセクションで囲んだ。
これをしないと、pugiwikiはテキスト中のXML文をテキストとして処理せず、ノード扱いしてしまう。
これからの流れとしては、
xml処理はC++で書くため、Swigを使ってGolang用にラッパーを作り、golangから呼び出すようにする。


これで、ようやく、複数のアップデートをするための下準備ができた。
出てきた文字列をSednaでExecuteすればよい
実際はencodeint/xmlで出来てたんだけど、
これが遅いということなので、pugixmlを使ってC++で処理して、Swig使ったりしてGoで動かそうとしているところ
色々大変である・・・
ところでCDATAセクションをネストするときは内側の]]>を]]]]><![CDATA[>に変ええないといけないらしい。
知らんかった 上記を先ほどのソースで処理すると このようにpageの中でネストしていた部分がきれいに剥がれ落ちてくれ、、、???
あれ?変なところに改行入ってるな?
なんだろう?
これはさすがにバグですかね?
いずれにしろ、XMLの中にHTMLを入れるのは中にスクリプトやXMLのデータまで入っていたりすることも考慮しないといけないし、
そのままCDATAに括って入れるのはダメだろうな
ということで、ネストするのは/sedna/procs/procだけにして、
sednaのインサート文で入れる中身によって加工する必要がある。
プレーンなテキストを入れてもいい場合はそのままでいいが
HTMLを入れたいなら、一度全体を圧縮して、全体をBase64にしていれるべきだと思う。
結果、HTML内に埋め込まれたイメージなどはBase64したものがZIP圧縮されて再度Base64という余計なことになってしまうが
まぁ仕方ないよな?
ためしに、出力された余計な改行が入ったUPDATE用Sednaクエリーをse_termで実行したらやはりエラーになった。
pugixml側を直さないとダメだな
違った・・・
これの出力結果(入力するXMLはPROCの数を増やしてある)
つまり、改行を入れていたのは自分のプログラムなんだけど、
ループの回数がネストされたCDATAの数だけ増えてしまうようだ。
別の取得方法をしないとだめか?
いや、これはnext_siblingを取れば行けそうだ・・・


やっと色々納得できて、まともに出るようになった。

0 件のコメント: