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 をセットしています。
31485行 (同じ関数)
ipaddr の値を addr へセットしています。
変数 v の型 ast_variable は連結リスト構造です。
推測
カラムの順にリストの要素が追加されているのでは ?
カラムの順序が ipaddr , host の順だった場合、以下のように処理されます。
- ipaddr により、addr に ipaddr の値がセットされる
- 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 *” によりすべてのカラムの値を取得しています。
カラムの数だけ、以下を実行します。
- カラムの定義を取得
- カラムの値を取得
- リストに追加
このため、リストの要素はカラム順になります。
結論
- データベースからの値の読み出しは、各値を連結リストへセットする。
- 連結リストへのセットは、カラムの順で行う。
- 連結リストの値を構造体へセットする際に、for 文により、要素順に処理する。
カラムの順序が動作に影響します。
その他
カラムの順序を変更した際の動作が適切な動作かどうかはわかりません。
ただ、ignoreregexpire を true に設定しておけば、build_peer関数の最後の方で登録期限を過ぎているものは ip アドレス含む登録情報を破棄しています。
ので、ここでは (host=dynamic であっても) 破棄しなくてもよいように思いますが、どうなんでしょう。