檢視原始碼 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 索引結構。
此型別與 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(), ...}
此型別用於建立索引結構,而 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 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().
取得索引結構中的最後一個項目。
-spec get_next(Index, KeyOid) -> {ok, {NextKeyOid, Value}} | undefined when Index :: index(), KeyOid :: snmp:oid(), NextKeyOid :: snmp:oid(), Value :: term().
取得索引結構中,在 KeyOid
之後,SNMP 詞彙順序中的下一個項目。KeyOid
不必參照索引中現有的項目。
-spec insert(Index, Key, Value) -> NewIndex when Index :: index(), Key :: key(), Value :: term(), NewIndex :: index().
將新的鍵值組插入到索引結構中。如果已存在具有相同鍵值的項目,則新的 Value
會覆蓋舊的值。
將 Key
轉換為 OBJECT IDENTIFIER。
建立一個新的匿名 snmp 索引結構。
建立一個新的具名 snmp 索引結構。