檢視原始碼 snmp_index (snmp v5.18)

SNMP 索引的抽象資料型別

模組 snmp_index 實作了用於 SNMP 表格的 SNMP 索引結構的抽象資料型別 (ADT)。它以 ordered_set 資料型別的 ets 表格實作,這表示所有操作都是 O(log n)。在表格中,鍵值是一個 ASN.1 OBJECT IDENTIFIER。

此索引用於將 SNMP 排序的實作與表格的實際實作分離。SNMP 排序,即 GET NEXT 的實作,是在此模組中實作的。

例如,假設有一個 SNMP 表格,在 Erlang 中最好以每個 SNMP 表格列一個程序的方式實作。進一步假設 SNMP 表格中的 INDEX 是一個 OCTET STRING。索引結構將如下建立:

snmp_index:new(string)

對於我們建立的每個新程序,我們會在 snmp_index 結構中插入一個項目。

new_process(Name, SnmpIndex) ->
  Pid = start_process(),
  NewSnmpIndex =
    snmp_index:insert(SnmpIndex, Name, Pid),
  <...>

有了這個結構,我們現在可以將例如 GET NEXT 請求中的 OBJECT IDENTIFIER 對應到正確的程序。

get_next_pid(Oid, SnmpIndex) ->
  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
  Pid.

警告

警告

所有更新索引的 API 函式都會回傳一個 NewIndex 項。這是為了與先前使用純 Erlang 編寫的 B+ 樹作為索引的實作向後相容。NewIndex 回傳值現在可以忽略。現在的回傳值是 ets 表格不變的表格識別碼。

使用 ets 表格的實作引入了與舊實作的語義不相容性。在那些使用純 Erlang 項的舊實作中,索引像任何其他 Erlang 項一樣進行垃圾回收,並且在丟棄時不必刪除。ets 表格僅在建立它的程序明確刪除它或建立程序終止時才被刪除。

現在新增了一個新的介面 delete/1,以處理程序想要丟棄索引表格的情況(即建立一個全新的表格)。任何使用暫時性 snmp 索引的應用程式都必須修改以處理此情況。

由於 snmp 適配通常會將索引保留在整個系統的生命週期中,因此這很少會是問題。

摘要

型別

此型別表示 snmp 索引結構。

此型別與 key_types/0 型別相關。如果 key_types/0 是單一原子,則對應的 key/0 也是單一型別,但如果 key_types/0 是一個元組,則 key/0 必須是相同大小的元組。

此型別用於建立索引結構,而 key/0 型別用於從結構中插入和刪除項目。

函式

刪除完整的索引結構(即持有索引的 ets 表格)。在此呼叫之後,索引將無法再被參照。請參閱上方的 警告說明

從索引結構中刪除鍵值及其值。回傳新的結構。

取得具有鍵值 KeyOid 的項目。可以從 SNMP 檢測函式中使用。

取得索引結構中的最後一個項目。

取得索引結構中,在 KeyOid 之後,SNMP 詞彙順序中的下一個項目。KeyOid 不必參照索引中現有的項目。

將新的鍵值組插入到索引結構中。如果已存在具有相同鍵值的項目,則新的 Value 會覆蓋舊的值。

Key 轉換為 OBJECT IDENTIFIER。

建立一個新的匿名 snmp 索引結構。

建立一個新的具名 snmp 索引結構。

型別

-opaque index()

此型別表示 snmp 索引結構。

-type key() :: key_spec() | tuple().

此型別與 key_types/0 型別相關。如果 key_types/0 是單一原子,則對應的 key/0 也是單一型別,但如果 key_types/0 是一個元組,則 key/0 必須是相同大小的元組。

在上面的範例中,有效的 keys 可以是 {"hi", "mom"}{"no", "thanks"},而 "hi"{"hi", 42}{"hello", "there"} 將會是無效的。

無法在 erlang 型別語言中適當地描述此型別,這就是為什麼上面使用 tuple/0 的原因。正確的定義如下所示:

key() = key_spec() | {key_spec(), key_spec(), ...}

-type key_spec() :: string() | integer().
-type key_types() :: type_spec() | tuple().

此型別用於建立索引結構,而 key/0 型別用於從結構中插入和刪除項目。

如果 INDEX 列的型別是 INTEGER 或衍生自 INTEGER,則對應的型別應為 integer。如果它是可變長度的型別(例如 OBJECT IDENTIFIER、OCTET STRING),則對應的型別應為 string。最後,如果型別是可變長度,但具有固定大小限制(例如 IpAddress),則對應的型別應為 fix_string

無法在 erlang 型別語言中適當地描述此型別,這就是為什麼上面使用 tuple/0 的原因。正確的定義如下所示:

key_types = type_spec() | {type_spec(), type_spec(), ...}

-type type_spec() :: fix_string | string | integer.

函式

-spec delete(Index) -> true when Index :: index().

刪除完整的索引結構(即持有索引的 ets 表格)。在此呼叫之後,索引將無法再被參照。請參閱上方的 警告說明

-spec delete(Index, Key) -> NewIndex when Index :: index(), Key :: key(), NewIndex :: index().

從索引結構中刪除鍵值及其值。回傳新的結構。

-spec get(Index, KeyOid) -> {ok, {KeyOid, Value}} | undefined
             when Index :: index(), KeyOid :: snmp:oid(), Value :: term().

取得具有鍵值 KeyOid 的項目。可以從 SNMP 檢測函式中使用。

-spec get_last(Index) -> {ok, {KeyOid, Value}} | undefined
                  when Index :: index(), KeyOid :: snmp:oid(), Value :: term().

取得索引結構中的最後一個項目。

連結到此函式

get_next(Index, KeyOid)

檢視原始碼
-spec get_next(Index, KeyOid) -> {ok, {NextKeyOid, Value}} | undefined
                  when Index :: index(), KeyOid :: snmp:oid(), NextKeyOid :: snmp:oid(), Value :: term().

取得索引結構中,在 KeyOid 之後,SNMP 詞彙順序中的下一個項目。KeyOid 不必參照索引中現有的項目。

連結到此函式

insert(Index, Key, Value)

檢視原始碼
-spec insert(Index, Key, Value) -> NewIndex
                when Index :: index(), Key :: key(), Value :: term(), NewIndex :: index().

將新的鍵值組插入到索引結構中。如果已存在具有相同鍵值的項目,則新的 Value 會覆蓋舊的值。

連結到此函式

key_to_oid(Index, Key)

檢視原始碼
-spec key_to_oid(Index, Key) -> KeyOid when Index :: index(), Key :: key(), KeyOid :: snmp:oid().

Key 轉換為 OBJECT IDENTIFIER。

-spec new(KeyTypes) -> Index when KeyTypes :: key_types(), Index :: index().

建立一個新的匿名 snmp 索引結構。

連結到此函式

new(KeyTypes, Name)

檢視原始碼 (自 OTP 27.0 起)
-spec new(KeyTypes, Name) -> Index when KeyTypes :: key_types(), Name :: atom(), Index :: index().

建立一個新的具名 snmp 索引結構。