dets
dets
模块
dets
模块摘要
基于磁盘的术语存储。
描述
该模块提供了文件中的术语存储。存储在这个模块中的称为对象的项
是元组,这样一个元素被定义为关键字。Dets 表
是存储在文件中的具有相同位置的键的对象的集合。
该模块由Mnesia应用程序使用,并且仅对那些对仅在磁盘上有效存储Erlang术语感兴趣的用户“按原样”提供。许多应用程序只需要在文件中存储一些术语。Mnesia添加交易,查询和分配。Dets文件的大小不能超过2 GB。如果需要更大的表格,可以使用Mnesia中的表格碎片。
有三种类型的DETS表:
set
.这种类型的表最多有一个具有给定键的对象。如果插入了具有表中已存在键的对象,则新对象将覆盖现有对象。
bag
这种类型的表具有零个或多个具有给定键的不同对象。
- duplicate_bag。这种类型的表有零个或多个可能匹配的对象与给定的key.Dets表必须在它们可以被更新或读取之前被打开,并且在完成时它们必须被正确地关闭。如果桌子没有正确关闭,Dets会自动修复桌子。如果桌子很大,这可能需要相当长的时间。当打开表的进程终止时,Dets表关闭。如果许多Erlang进程(用户)打开相同的Dets表,它们共享该表。当所有用户终止或关闭表格时,该表格已正确关闭。如果Erlang运行时系统异常终止,则调用表没有正确关闭^C命令在Unix环境中异常终止Erlang运行时系统并带有分解处理程序。由于所有由Dets执行的操作都是磁盘操作,因此必须意识到单个查找操作涉及一系列磁盘查找和读取操作。因此,Dets函数比相应的ets(3)函数慢得多,尽管Dets导出类似的接口.Dets将数据组织为线性哈希列表,随着更多数据被插入到表中,哈希列表正常增长。文件上的空间管理由所谓的伙伴系统执行。当前的实现将整个伙伴系统保留在RAM中,这意味着如果表格变得碎片化,那么相当多的内存可能会用完。对表格进行碎片整理的唯一方法是关闭它,然后用选项再次打开它repair设置为force。注意ordered_set在Ets 中输入的信息尚未由Dets 提供,对并发更新的有限支持也不会使得在固定ETS表上使用安全的序列first和next调用。这些功能都可能由Dets在未来的Erlang / OTP版本中提供。在此之前,必须使用Mnesia应用程序(或某种用户实现的用于锁定的方法)来实现安全并发。目前,没有Erlang / OTP库支持有序的基于磁盘的术语storage.All Dets函数{error, Reason}在发生错误时返回(first/1并且next/2是例外,它们以错误元组退出进程)。如果指定格式错误的参数,则所有函数都会使用badarg消息退出进程。数据类型access() = read | read_write auto_save() = infinity | integer() >= 0 bindings_cont()不透明连续使用match/1和match/3。cont()不透明延续使用bchunk/2。keypos() = integer() >= 1 match_spec() = ets:match_spec()匹配规格,参见Match Specification in ErlangERTS用户指南和ms_transform(3)模块。和no_slots() = default | integer() >= 0 object() = tuple() object_cont()使用的不透明延续。有关模式的说明,请参阅。和使用的不透明延续。Exportsall() - > [ ]返回此节点上所有打开表的名称列表.bchunk(Name,Continuation) - > {Continuation2,Data} | '$ end_of_table'| {error,Reason} TypesReturns存储在表中的对象列表。返回对象的确切表示不是公开的。数据列表可以用于通过指定函数选项的值来初始化表match_object/1match_object/3pattern() = atom() | tuple()ets:match/2select_cont()select/1select/3tab_name() = term() type() = bag | duplicate_bag | settab_name()bchunkformatinit_table/3Mnesia应用程序使用该函数来复制开放表格。除非表格被保护使用safe_fixtable/2,否则如果对表格进行bchunk/2并发更新,调用可能无法按预期工作。首次bchunk/2调用时,初始延续,原子start必须是提供。bchunk/2返回一个元组{Continuation2, Data},其中Data是对象列表。Continuation2是另一个将继续传递给后续呼叫的延续bchunk/2。通过一系列调用bchunk/2,可以提取所有表格对象。所有对象bchunk/2返回'$end_of_table'时返回,或{error, Reason}如果发生错误。close(Name) - > ok | {错误,原因}类型关闭一个表。只允许打开表的进程关闭它。在系统停止之前,所有打开的表必须关闭。如果试图打开没有正确关闭的表格,Dets会自动尝试修复它。删除(Name,Key) - > ok | {error,Reason} TypesDelete使用Key表中的所有对象Name.delete_all_objects(Name) - > ok | {error,Reason} Types在几乎不变的时间内从表中删除一个表中的所有对象。但是,如果表固定,delete_all_objects(T)则等同于match_delete(T, '_').delete_object(Name,Object) - > ok | {error,Reason} TypesDeleted从表中指定对象的所有实例。如果一个表是类型的bag或duplicate_bag,这个函数可以用来删除只有一些指定key.first(Name) - > Key |的对象 '$ end_of_table'Types Name根据表的内部顺序返回存储在表中的第一个键,或者'$end_of_table'表为空。除非使用保护表,否则safe_fixtable/2随后的调用next/2可能无法按预期工作,如果对table.If一个错误发生,该进程退出一个错误元组{error, Reason}。错误元组不会被返回,因为它无法与密钥区分。有两个原因可以使用first/1和next/2不使用:它们效率不高,并且它们阻止使用密钥'$end_of_table',因为此原子用于指示结束的表格。如果可能的话,使用的功能match,match_object以及select用于遍历tables.foldl(Function,Acc0,Name) - > Acc | {error,Reason} foldr(Function,Acc0,Name) - > Acc | {error,Reason} TypesCalls Function表的连续元素Name和一个额外的参数AccIn。表格元素以未指定的顺序遍历。Function必须返回传递给下一个呼叫的新累加器。Acc0如果表为空,则返回.from_ets(Name,EtsTab) - > ok | {error,Reason} TypesDeletes表的所有对象,Name然后插入ETS表的所有对象EtsTab。对象以未指定的顺序插入。如ets:safe_fixtable/2所称,ETS表必须是公共的或由调用的process.info(Name) - > InfoList |拥有 undefinedTypes返回关于表的信息Name作为元组列表:
- {file_size, integer() >= 0}}-文件大小,以字节为单位。
{filename, file:name()}
-存储对象的文件的名称。
{keypos,
keypos()
}
-关键位置。
- {size, integer() >= 0}-表中存储的对象数目。
{type,type()}
-表类型。
INFO%28 Name,Item%29->值未定义
类型
返回与Item
表关联的信息Name
。除了{Item, Value}
定义的对之外info/1
,还允许下列项目:
{access,
access()
}
-进入模式。
{auto_save,
auto_save()
}
-自动音程间隔
{bchunk_format, binary()}
-一个不透明的二进制文件,描述bchunk/2
.二进制可以用作is_compatible_chunk_format/2
...
{hash, Hash}
-描述用于计算存储在Dets表中的对象的散列值的BIF。可能值Hash
*
- `phash` - Implies that the `erlang:phash/2` BIF is used.
- `phash2` - Implies that the `erlang:phash2/1` BIF is used.
- {memory, integer() >= 0} - 文件大小,以字节为单位。项目相关的值与file_size相同。
- {no_keys, integer >= 0()}-表中存储的不同键的数目。
- {no_objects, integer >= 0()}-表中存储的对象数目。
{no_slots, {Min, Used, Max}}
- 表格的插槽数量。Min
是最小插槽数量,Used
是当前使用的插槽数量,Max
是最大插槽数量。
{owner, pid()}
-处理对Dets表的请求的进程的PID。
{ram_file, boolean()}
-表是否保存在RAM中。
- {safe_fixed_monotonic_time,SafeFixed} - 如果表格是固定的,SafeFixed是一个元组{FixedAtTime,[{Pid,RefCount}]}。 FixedAtTime是表格第一次修复的时间,而Pid是修复表RefCount时间的进程的pid。 列表中可以有任意数量的进程。 如果表格不固定,SafeFixed则为假。FixedAtTime对应于固定时由erlang:monotonic_time / 0返回的结果。 safe_fixed_monotonic_time的使用是时间安全的。
{safe_fixed, SafeFixed}
-与{safe_fixed_monotonic_time, SafeFixed}
的格式和价值除外FixedAtTime
...
FixedAtTime
对应于erlang:timestamp/0
固定时返回的结果。注意,当系统使用单个或多个时time warp modes
,这可能会产生奇怪的结果。这是因为使用safe_fixed
不是time warp safe
。时间扭曲安全代码必须改用safe_fixed_monotonic_time
。
init_table(Name, InitFun) -> ok | {error, Reason}
init_table(Name, InitFun, Options) -> ok | {error, Reason}
类型
Name
使用通过调用输入函数创建的对象替换表的现有对象InitFun
,请参见下文。使用这个函数而不是调用的原因insert/2
是效率。请注意,输入函数由处理对Dets表的请求的进程调用,而不是由调用进程调用。
当使用参数读取进行调用时,函数InitFun被假定在没有更多输入时返回end_of_input,或{Objects,Fun},其中Objects是对象列表,Fun是新输入函数。 任何其他值将作为错误返回{error,{init_fun,Value}}。 每个输入函数只被调用一次,如果发生错误,最后一个函数将被调用,参数close将被忽略。
如果表类型是set
多个对象并且存在一个给定的键,则选择其中一个对象。这不一定是输入函数返回的对象序列中给定键的最后一个对象。避免重复密钥,否则文件变得不必要的分段。这也适用于存储在类型表中的重复对象bag
。
表中有足够数量的物体槽是非常重要的。 如果不是,init_table / 2返回时哈希列表开始增长,这会显着减慢对表的访问一段时间。 插槽的最小数量由open_file / 2选项min_no_slots设置,并由info / 2项目no_slots返回。 另请参阅下面的选项min_no_slots。
参数Options
是{Key, Val}
元组列表,其中允许使用以下值:
{min_no_slots, no_slots()}
- 指定要存储在表中的不同键的估计数量。open_file/2
除非创建表,否则将忽略具有相同名称的选项,在这种情况下,可以通过在初始化表时提供估计来增强性能。
- {format,Format} - 指定函数InitFun返回的对象的格式。 如果Format是term(默认),则假定InitFun返回一个元组列表。 如果格式为bchunk,则认为InitFun返回由bchunk / 2返回的数据。 此选项将覆盖选项min_no_slots。
insert(Name, Objects) -> ok | {error, Reason}
类型
在表格中插入一个或多个对象Name
。如果已经存在一个对象,其中某个键的键与某些给定对象的键匹配,并且表类型为set
,则旧对象将被替换。
insert_new(Name, Objects) -> boolean() | {error, Reason}
类型
将一个或多个对象插入到表名中。 如果已经存在某个对象的键与任何指定对象的键匹配,则表不会更新,并返回false。 否则,插入对象并返回true。
is_compatible_bchunk_format(Name, BchunkFormat) -> boolean()
类型
如果可以初始化表名,使用带选项{format,bchunk}的init_table / 3,以及从某个表T读取bchunk / 2的对象,以便调用info(T,bchunk_format)返回BchunkFormat,则返回true。
is_dets_file(Filename) -> boolean() | {error, Reason}
类型
如果文件Filename是一个Dets表,则返回true,否则返回false。
lookup(Name, Key) -> Objects | {error, Reason}
类型
返回存储在表名中的关键Key的所有对象的列表,例如:
2> dets:open_file(abc, [{type, bag}]).
{ok,abc}
3> dets:insert(abc, {1,2,3}).
ok
4> dets:insert(abc, {1,3,4}).
ok
5> dets:lookup(abc, 1).
[{1,2,3},{1,3,4}]
如果表类型是set
,则函数返回空列表或带有一个对象的列表,因为不能有多个具有给定键的对象。如果表类型为bag
或duplicate_bag
,则函数返回任意长度的列表。
请注意,返回对象的顺序未指定。特别是,插入对象的顺序没有反映出来。
match(Continuation) ->
{匹配、连续2}
'$end_of_table' |
{错误,原因]
类型
匹配存储在表中的一些对象,并以某种未指定的顺序返回与指定模式匹配的绑定的非空列表。表格,模式和匹配的对象数量全部Continuation
由以前调用返回的match/1
或者定义match/3
。
当所有表对象都匹配时,'$end_of_table'
会被返回。
match(Name, Pattern) -> Match | {error, Reason}
类型
表的每个对象的返回与模式匹配的名称以某种未指定顺序的绑定列表。 有关模式的说明,请参阅ets:match / 2。 如果Pattern的keypos'元素未绑定,则所有表格对象都匹配。 如果keypos的元素被绑定,则只有具有正确键的对象被匹配。
match(Name, Pattern, N) ->
{匹配,继续}
'$end_of_table' |
{错误,原因]
类型
匹配表名的部分或全部对象,并以某种未指定的顺序返回与Pattern匹配的绑定的非空列表。 有关模式的说明,请参阅ets:match / 2。
除非表是空的,返回绑定和延续的元组,在这种情况下'$end_of_table'
返回。通过调用来匹配更多对象时,将继续使用match/1
。
如果Pattern
绑定keypos的第一个元素,则所有表对象都匹配。如果keypos的第一个元素未被绑定,则所有表对象一次匹配N
对象,直到至少有一个对象匹配或到达表的末尾。默认值,通过给出N
值default
来表示,让对象的数量根据对象的大小而变化。具有相同键的所有对象总是同时匹配,这意味着有时可以匹配多于N
个对象。
在调用match / 3之前,该表总是使用safe_fixtable / 2进行保护,否则在调用match / 1时可能会发生错误。
match_delete(Name, Pattern) -> ok | {error, Reason}
类型
从表名中删除所有匹配模式的对象。 有关模式的说明,请参阅ets:match / 2。
如果Pattern
绑定keypos的第一个元素,则只匹配具有正确键的对象。
match_object(Continuation) ->
{对象,连续2}
'$end_of_table' |
{错误,原因]
类型
以某种未指定的顺序返回存储在表中存储的某些对象的非空列表,该列表匹配给定模式。 表格,模式以及匹配的对象数量全部由Continuation定义,这是通过先前调用match_object / 1或match_object / 3返回的。
当所有表对象都匹配时,'$end_of_table'
会被返回。
match_object(Name, Pattern) -> Objects | {error, Reason}
类型
返回以某种未指定顺序Name
匹配的所有表格对象的列表Pattern
。有关模式的说明,请参阅ets:match/2
。
如果keypos的第一个元素Pattern
是未绑定的,则所有表格对象都匹配。如果Pattern
绑定keypos的第一个元素,则只匹配具有正确键的对象。
使用match_object函数遍历所有表对象比调用first / 1和next / 2或slot / 2更有效。
match_object(Name, Pattern, N) ->
{对象,继续}
'$end_of_table' |
{错误,原因]
类型
匹配存储在表中的一些或全部对象,Name
并返回非Pattern
特定顺序中匹配对象的非空列表。有关模式的说明,请参阅ets:match/2
。
除非表格为空,否则返回对象列表和延续,在这种情况下'$end_of_table'
返回。通过调用来匹配更多对象时,将继续使用match_object/1
。
如果Pattern
绑定keypos的第一个元素,则所有表对象都匹配。如果keypos的第一个元素未被绑定,则所有表对象一次匹配N
对象,直到至少有一个对象匹配或到达表的末尾。默认值,通过给出N
值default
来表示,让对象的数量根据对象的大小而变化。具有相同键的所有匹配对象总是在同一个回复中返回,这意味着有时可以返回多于N
个对象。
在调用match_object / 3之前,该表总是使用safe_fixtable / 2进行保护,否则在调用match_object / 1时可能会发生错误。
member(Name, Key) -> boolean() | {error, Reason}
类型
像查找/ 2一样工作,但不返回对象。 如果一个或多个表格元素具有Key键,则返回true,否则返回false。
next(Name, Key1) -> Key2 | '$end_of_table'
类型
根据Key1
表Name
的内部顺序或者'$end_of_table'
没有下一个键,返回表中后面的键。
如果发生错误,该进程将退出并显示错误元组{error, Reason}
。
要找到表格中的第一个键,请使用first/1
。
open_file(Filename) -> {ok, Reference} | {error, Reason}
类型
打开一个现有的表格。如果表格没有正确关闭,它会被修复。返回的引用将用作表名。该功能对于调试目的非常有用。
open_file(Name, Args) -> {ok, Name} | {error, Reason}
类型
打开一个表。如果没有文件存在,则创建一个空的Dets表。
原子Name
是表名。表名必须在表上的所有后续操作中提供。其他进程也可以使用这个名称,许多进程可以共享一个表。
如果两个进程通过提供相同的名称和参数打开同一个表,则该表有两个用户。如果一个用户关闭了表,则该表一直处于打开状态,直到第二个用户关闭为止。
论辩Args
是{Key, Val}
元组,其中允许以下值:
{access,
access()
}
-现有表可以以只读模式打开。在只读模式下打开的表如果在崩溃后被打开,则不受自动文件修复算法的约束。默认为read_write
...
{auto_save,auto_save()}
- 自动保存间隔。如果间隔是一个整数Time
,那么只要数Time
毫秒内未访问该表,该表就会刷新到磁盘。在不受控制的模拟器暂停后重新打开时,已经刷新的表格不需要进行修复。如果间隔是原子infinity
,则禁用自动保存。默认为180000(3分钟)。
{estimated_no_objects,
no_slots()
}
-相当于期权min_no_slots
...
{file, file:name()}
-要打开的文件的名称。默认为表名。
{max_no_slots,
no_slots()
}
-使用的最大插槽数。默认为32M,这是最大值。请注意,较高的值会增加表的碎片,而较小的值会以牺牲执行时间为代价减少碎片。
{min_no_slots,
no_slots()
}
-使用此标志可以通过指定表创建时存储在表中的不同密钥的估计数来提高应用程序性能。默认值为256,这是最小值。
{keypos,
keypos()
}
-每个被用作键的物体的元素的位置。默认为1。当我们想要存储Erlang记录时,显式声明键位置的能力是最方便的,其中记录的第一个位置是记录类型的名称。
{ram_file, boolean()}
-表是否保存在记录和档案管理系统中。将表保存在RAM中听起来像是异常,但可以提高打开表、插入一组对象、然后关闭表的应用程序的性能。当表关闭时,其内容将写入磁盘文件。默认为false
...
{repair, Value}
-Value
可以是boolean()
原子或原子force
。该标志指定Dets服务器是否要调用自动文件修复算法。默认为true
。如果false
指定,则不尝试修复该文件,{error, {needs_repair, FileName}}
如果必须修复该表,则返回该文件。值force
意味着即使表格已正确关闭,也会进行修复。这是一个很少需要的选项。如果表格已经打开,选项将被忽略repair
。
{type,type()}
-表类型。默认为set
...
pid2name(Pid) -> {ok, Name} | undefined
类型
返回给定处理对表的请求的进程的pid的表名,或者如果没有这样的表,则返回undefined
此函数仅用于调试。
repair_continuation(Continuation, MatchSpec) -> Continuation2
类型
这个函数可以用来恢复select/3
或者select/1
如果延续已经通过外部术语格式(已经在节点之间发送或存储在磁盘上)返回的不透明延续。
此功能的原因是继续条款包含已编译的匹配规格,因此如果转换为外部条款格式则无效。考虑到原始匹配规范保持不变,继续可以恢复,这意味着select/1
即使已经存储在磁盘或另一个节点上,它也可以再次用于后续调用。
有关更多信息和示例,请参见ets(3)
模块。
注
此函数在应用程序代码中很少需要。它被应用mnesia用于提供分布式。select/3
和select/1
序列。正常的应用程序要么使用Mnesia,要么阻止继续转换为外部格式。
没有编译的匹配规范的外部表示形式的原因是性能。它可能会在将来的版本中被更改,而这个接口仍然是为了向后兼容性。
safe_fixtable(Name, Fix) -> ok
类型
如果Fix
是true
,表Name
被调用进程固定(再一次),否则表被释放。该表还会在修复过程终止时发布。
如果许多进程修复一个表,那么该表将保持固定,直到所有进程已经释放它或终止。参考计数器保持在每个进程的基础上,并且连续N次修复需要N个版本才能释放该表。
不保证即使表格是固定的,对first / 1,next / 2或select和match函数的调用也能按预期工作; 由ets(3)模块提供的对并发的有限支持尚未由Dets提供。 目前修复表只会禁用表的哈希列表的大小调整。
如果在表被修复时添加了对象,则哈希列表在表释放时开始增长,这将大大降低对表的访问时间。
select(Continuation) ->
{选择、连续2}
'$end_of_table' |
{错误,原因]
类型
将匹配规范应用于存储在表中的一些对象,并返回结果的非空列表。表格,匹配规格以及匹配的对象数量都是Continuation
由以前的调用返回的select/1
或者定义的select/3
。
当表中的所有对象都匹配时,'$end_of_table'
会被返回。
select(Name, MatchSpec) -> Selection | {error, Reason}
类型
返回将匹配规范MatchSpec
应用于存储在表中的全部或部分对象的结果Name
。没有指定对象的顺序。有关匹配规范的说明,请参阅ERTS User's Guide
。
如果keypos的第一个元素MatchSpec
是未绑定的,则将匹配规范应用于表的所有对象。如果keypos的元素被绑定,则匹配规范仅适用于具有正确密钥的对象。
使用select
用于遍历表中所有对象的函数比调用first/1
和next/2
或slot/2
...
select(Name, MatchSpec, N) ->
{选择、延续}
'$end_of_table' |
{错误,原因]
类型
返回应用匹配规范的结果。MatchSpec
存储在表中的部分或所有对象。Name
未指定对象的顺序。有关匹配规范的说明,请参阅ERTS User's Guide
...
应用匹配规范和延续的结果的元组被返回,除非表是空的,在这种情况下'$end_of_table'被
返回。通过调用来匹配更多的对象时,将继续使用select/1
。
如果keypos的第一个元素MatchSpec
是绑定的,则使用正确的键将匹配规范应用于表的所有对象。如果keypos的第一个元素MatchSpec
是未绑定的,则匹配规范将一次应用于表中的所有对象,即N
至少一个对象匹配或达到表末尾。默认值,通过给出N
值default
来表示,让对象的数量根据对象的大小而变化。所有具有相同键的对象总是同时处理,这意味着匹配规范可以应用于多于N
个对象。
在调用select / 3之前,该表总是使用safe_fixtable / 2进行保护,否则在调用select / 1时可能会发生错误
select_delete(Name, MatchSpec) -> N | {error, Reason}
类型
从表中删除每个对象,Name
以便将匹配规范MatchSpec
应用于对象返回值true
。有关匹配规范的说明,请参阅ERTS User's Guide
。返回已删除对象的数量。
如果MatchSpec的keypos'元素被绑定,则匹配规范仅适用于具有正确密钥的对象。
slot(Name, I) -> '$end_of_table' | Objects | {error, Reason}
类型
表格的对象分布在插槽之间,从插槽0开始到插槽n结束。 返回与插槽I关联的对象列表。如果I> n,则返回'$ end_of_table'。
sync(Name) -> ok | {error, Reason}
类型
确保对表Name
进行的所有更新都写入磁盘。这也适用于已将标志ram_file
设置为的已打开的表格true
。在这种情况下,RAM文件的内容被刷新到磁盘。
请注意,存储在伙伴系统RAM中的空间管理数据结构也写入磁盘。如果表格被分割,这可能需要一些时间。
table(Name) -> QueryHandle
table(Name, Options) -> QueryHandle
类型
返回查询列表理解(QLC)查询句柄。该qlc(3)
模块提供主要针对Mnesia的查询语言,但是ETS表格,Dets表格和列表也可qlc
作为数据源识别。调用dets:table/1,2
是使Dets表Name
可用的手段qlc
。
当只有在关键位置简单的限制,qlc
使用dets:lookup/2
查找键。如果这是不可能的,整个表都会被遍历。选项traverse
决定了如何完成:
first_next
-通过调用dets:first/1
和dets:next/2
...
select
- 通过调用dets:select/3
和遍历表dets:select/1
。选项n_objects
决定返回的对象数(第三个参数select/3
)。匹配规范(第二个参数select/3
)由qlc
以下组装:
- Simple filters are translated into equivalent match specifications.
- More complicated filters must be applied to all objects returned by `select/3` given a match specification that matches all objects.
{select,match_spec()}
- 至于select
,表是通过调用dets:select/3
和dets:select/1
。区别在于匹配规范是明确指定的。这是如何声明不能在所提供的语法内容易表达的匹配规范qlc
。
下面的示例使用显式匹配规范遍历表:
1> dets:open_file(t, []),
ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
MS = ets:fun2ms(fun{X,Y}) when (X > 1) or (X < 5) -> {Y} end),
QH1 = dets:table(t, [{traverse, {select, MS}}]).
隐式匹配规范的示例:
2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).
后一个例子等价于前者,可以使用函数进行验证。qlc:info/1
*
3> qlc:info(QH1) =:= qlc:info(QH2).
true
qlc:info/1
返回有关查询句柄的信息。在这种情况下,将返回两个查询句柄的相同信息。
to_ets(Name, EtsTab) -> EtsTab | {error, Reason}
类型
将Dets表名称的对象插入到ETS表EtsTab中。 未指定插入对象的顺序。 ETS表格的现有对象将保留,除非被覆盖。
traverse(Name, Fun) -> Return | {error, Reason}
类型
Fun
以Name
某种未指定的顺序应用于存储在表中的每个对象。根据返回值采取不同的操作Fun
。以下Fun
返回值是允许的:
continue
继续执行遍历。例如,以下函数可用于打印表格的内容:
fun(X) -> io:format("~p~n", [X]), continue end.
{continue, Val}
继续遍历并累积Val
。提供以下函数来收集列表中的所有对象:
fun(X) -> {continue, X} end.
{done, Value}
终止遍历并返回[Value | Acc]
...
由Fun返回的任何其他值OtherValue会终止遍历并立即返回。
update_counter(名称,键,递增) - >结果
类型
通过将Incr添加到Pos:th位置上的元素来设置类型名称中存储的键Key来更新对象。 新的计数器值被返回。 如果没有指定位置,则直接跟随该键的元素将被更新。
此函数提供了一种更新计数器的方法,无需查找对象、通过递增元素更新对象,并将结果对象再次插入表中。
另见
ets(3)
,mnesia(3)
,qlc(3)