在线文档教程
Erlang 20

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()类型在上述描述。