snmp_index
snmp_index
模块
snmp_index
模块摘要
用于SNMP索引的抽象数据类型
描述
该模块snmp_index
为SNMP表执行SNMP索引结构的抽象数据类型(ADT)。它是作为ordered_set数据类型的ets表实现的,这意味着所有的操作都是O(log n)。在表中,密钥是ASN.1 OBJECT IDENTIFIER。
此索引用于将SNMP顺序的实现与表的实际实现分开。该模块实现了SNMP排序,即GET Next的实现。
例如,假设有一个SNMP表,它最好在Erlang中作为每个SNMP表行的一个进程来实现。进一步假设SNMP表中的索引是一个八进制字符串。索引结构将按以下方式创建:
snmp_index:new(string)
对于我们创建的每一个新进程,我们都会在snmp_index
结构:
new_process(Name, SnmpIndex) ->
Pid = start_process(),
NewSnmpIndex =
snmp_index:insert(SnmpIndex, Name, Pid),
<...>
通过这种结构,我们现在可以将对象标识符映射到正确的进程,例如GET Next请求:
get_next_pid(Oid, SnmpIndex) ->
{ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
Pid.
公共数据类型
以下功能使用下列数据类型:
index()
oid() = [byte()]
key_types = type_spec() | {type_spec(), type_spec(), ...}
type_spec() = fix_string | string | integer
key() = key_spec() | {key_spec(), key_spec(), ...}
key_spec() = string() | integer()
大index()
类型表示SNMP索引结构。
大oid()
类型用于表示ASN.1对象标识符。
大key_types()
类型在创建索引结构时使用,并且key()
类型在从结构中插入和删除项时使用。
大key_types()
类型定义表的SNMP索引列的类型。如果表只有一个索引列,则这种类型应该是一个原子,但是如果表有多个索引列,则应该是一个带有原子的元组。
如果INDEX列的类型为INTEGER,或者从INTEGER派生,则相应的类型应为integer
。如果它是可变长度类型(例如OBJECT IDENTIFIER,OCTET STRING),则相应的类型应该是string
。最后,如果类型是可变长度的,但是具有固定的大小限制(例如IpAddress),则相应的类型应该是fix_string
。
例如,如果SNMP表有两个INDEX列,第一个是大小为2的OCTET STRING,第二个是OBJECT IDENTIFER,则相应的key_types
参数是{fix_string, string}
。
大key()
类型与key_types()
类型。如果key_types()
是单个原子,对应的key()
也是单一类型,但如果key_types()
是一个元组,key
必须是同样大小的元组。
在上面的例子中,有效的keys
可{"hi", "mom"}
及{"no", "thanks"}
,然而"hi"
,{"hi", 42}
并且{"hello", "there"}
将是无效的。
警告
更新索引的所有api函数都返回NewIndex
术语。这是为了向后兼容以前的实现,该实现使用了纯用Erlang编写的B+树作为索引。大NewIndex
现在可以忽略返回值。返回值现在是ETS表的不变表标识符。
使用ETS表的实现引入了与旧实现的语义不兼容。在那些旧的实现中,使用纯Erlang术语,索引和其他Erlang术语一样被垃圾收集,在丢弃时不必删除。只有在创建ETS表的进程显式删除它或创建过程终止时,ETS表才会被删除。
delete/1
现在添加了一个新界面来处理当进程想要丢弃索引表(即构建一个全新的)时的情况。任何使用瞬态snmp索引的应用程序都必须进行修改以处理此问题。
由于SNMP适配器通常在整个系统生存期内保持索引,所以这很少是一个问题。
出口
delete(Index) -> true
类型
删除一个完整的索引结构(即持有索引的ets表)。这次调用后,索引不能再被引用。见warning note
上面。
delete(Index, Key) -> NewIndex
类型
从索引结构中删除键及其值。返回一个新结构。
get(Index, KeyOid) -> {ok, {KeyOid, Value}} | undefined
类型
获取带键的项。KeyOid
可以在SNMP工具函数中使用。
get_last(Index) -> {ok, {KeyOid, Value}} | undefined
类型
获取索引结构中的最后一项。
get_next(Index, KeyOid) -> {ok, {NextKeyOid, Value}} | undefined
类型
获取snmp词典排序中的下一个项。KeyOid
在索引结构中。KeyOid
不需要引用索引中的现有项。
insert(Index, Key, Value) -> NewIndex
类型
将新的键值元组插入索引结构中。如果具有相同键的项已经存在,则Value
覆盖旧值。
key_to_oid(Index, Key) -> KeyOid
类型
皈依Key
对象标识符。
new(KeyTypes) -> Index
类型
创建新的SNMP索引结构。大key_types()
类型在上述描述。