LoginSignup
2
0

More than 3 years have passed since last update.

Asterisk Realtime Database のカラムの順序について

Last updated at Posted at 2020-10-21

NOTE: Column order is important!! If you place “ipaddr” before “host” (in the case of dynamic), you will never load the public IP address of your sip device, as it will be overwritten when “host” is encountered.

カラムの順序が重要。「host」の前に「ipaddr」を配置すると(dynamicの場合)、「host」に遭遇すると上書きされるため、sipデバイスのパブリックIPアドレスをロードすることはありません。

と書いてあります。古い情報のような気もしますが、カラムの順序を変更し試してみると確かにこのような動作をします。

カラムの順序で動作が変わることが不思議だったため、コードを調べました。

※ カラムの順序を変更した際の動作が、適切な動作かどうかはわかりません

前提など

Asterisk Realtime について

以下のバージョンのソースコードを調べました。

データベースから読みだした host , ipaddr の使用箇所

chan_sip.c , build_peer 関数
データベース、または、設定ファイルに書かれているアカウント情報を構造体にセットしています。

31223行 (同じ関数)
host の値が dynamic だった場合、addr に null をセットしています。
image.png

31485行 (同じ関数)
ipaddr の値を addr へセットしています。
image.png

これらは for 文内に記述されています。
image.png

変数 v の型 ast_variable は連結リスト構造です。
image.png

推測

カラムの順にリストの要素が追加されているのでは ?
カラムの順序が ipaddr , host の順だった場合、以下のように処理されます。

  1. ipaddr により、addr に ipaddr の値がセットされる
  2. host により、addr に null がセットされる

データベースからの読み出し

データベースから読み出しする箇所を調べてみます。

呼び出し階層

realtime_peer
→ realtime_peer_by_name
→ ast_load_realtime
→ ast_load_realtime_fields
→ ast_load_realtime_all_fields
→ find_engine
→ eng->realtime_func (関数ポインタであり、ODBC を使用している場合、realtime_odbc のはず)
→ realtime_odbc

realtime_odbc 関数

SQL の作成。”SELECT *” によりすべてのカラムの値を取得しています。
image.png

カラム数を取得しています。
image.png

カラムの数だけ、以下を実行します。

  • カラムの定義を取得
  • カラムの値を取得
  • リストに追加

このため、リストの要素はカラム順になります。

image-20201006-044522.png

結論

  1. データベースからの値の読み出しは、各値を連結リストへセットする。
  2. 連結リストへのセットは、カラムの順で行う。
  3. 連結リストの値を構造体へセットする際に、for 文により、要素順に処理する。

カラムの順序が動作に影響します。

その他

カラムの順序を変更した際の動作が適切な動作かどうかはわかりません。

ただ、ignoreregexpire を true に設定しておけば、build_peer関数の最後の方で登録期限を過ぎているものは ip アドレス含む登録情報を破棄しています。

ので、ここでは (host=dynamic であっても) 破棄しなくてもよいように思いますが、どうなんでしょう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0