Provided by: erlang-manpages_25.3.2.8+dfsg-1ubuntu4_all bug

NAME

       dets - A disk-based term storage.

DESCRIPTION

       This  module provides a term storage on file. The stored terms, in this module called objects, are tuples
       such that one element is defined to be the key. A Dets table is a collection of objects with the  key  at
       the same position stored on a file.

       This  module  is  used by the Mnesia application, and is provided "as is" for users who are interested in
       efficient storage of Erlang terms on disk only. Many applications only need to  store  some  terms  in  a
       file.  Mnesia adds transactions, queries, and distribution. The size of Dets files cannot exceed 2 GB. If
       larger tables are needed, table fragmentation in Mnesia can be used.

       Three types of Dets tables exist:

         * set. A table of this type has at most one object with a given key. If an object with  a  key  already
           present in the table is inserted, the existing object is overwritten by the new object.

         * bag. A table of this type has zero or more different objects with a given key.

         * duplicate_bag. A table of this type has zero or more possibly matching objects with a given key.

       Dets  tables  must  be opened before they can be updated or read, and when finished they must be properly
       closed. If a table is not properly closed,  Dets  automatically  repairs  the  table.  This  can  take  a
       substantial  time  if  the table is large. A Dets table is closed when the process which opened the table
       terminates. If many Erlang processes (users) open the same Dets table, they share the table. The table is
       properly  closed  when all users have either terminated or closed the table. Dets tables are not properly
       closed if the Erlang runtime system terminates abnormally.

   Note:
       A ^C command abnormally terminates an Erlang runtime system in a Unix environment with a break-handler.

       As all operations performed by Dets are disk operations, it is important to realize that a single look-up
       operation  involves  a  series  of  disk  seek and read operations. The Dets functions are therefore much
       slower than the corresponding ets(3erl) functions, although Dets exports a similar interface.

       Dets organizes data as a linear hash list and the hash list grows gracefully as  more  data  is  inserted
       into  the  table. Space management on the file is performed by what is called a buddy system. The current
       implementation keeps the entire buddy system in RAM,  which  implies  that  if  the  table  gets  heavily
       fragmented,  quite some memory can be used up. The only way to defragment a table is to close it and then
       open it again with option repair set to force.

       Notice that type ordered_set in Ets is not yet provided by Dets,  neither  is  the  limited  support  for
       concurrent  updates  that  makes a sequence of first and next calls safe to use on fixed ETS tables. Both
       these features may be provided by Dets in  a  future  release  of  Erlang/OTP.  Until  then,  the  Mnesia
       application  (or  some  user-implemented  method for locking) must be used to implement safe concurrency.
       Currently, no Erlang/OTP library has support for ordered disk-based term storage.

       All Dets functions return {error, Reason} if an error occurs (first/1 and  next/2  are  exceptions,  they
       exit  the  process with the error tuple). If badly formed arguments are specified, all functions exit the
       process with a badarg message.

DATA TYPES

       access() = read | read_write

       auto_save() = infinity | integer() >= 0

       bindings_cont()

              Opaque continuation used by match/1 and match/3.

       cont()

              Opaque continuation used by bchunk/2.

       keypos() = integer() >= 1

       match_spec() = ets:match_spec()

              Match specifications, see section  Match Specification in Erlang in  ERTS  User's  Guide  and  the
              ms_transform(3erl) module.

       no_slots() = default | integer() >= 0

       object() = tuple()

       object_cont()

              Opaque continuation used by match_object/1 and match_object/3.

       pattern() = atom() | tuple()

              For a description of patterns, see ets:match/2.

       select_cont()

              Opaque continuation used by select/1 and select/3.

       tab_name() = term()

       type() = bag | duplicate_bag | set

EXPORTS

       all() -> [tab_name()]

              Returns a list of the names of all open tables on this node.

       bchunk(Name, Continuation) ->
                 {Continuation2, Data} |
                 '$end_of_table' |
                 {error, Reason}

              Types:

                 Name = tab_name()
                 Continuation = start | cont()
                 Continuation2 = cont()
                 Data = binary() | tuple()
                 Reason = term()

              Returns  a  list of objects stored in a table. The exact representation of the returned objects is
              not public. The lists of data can be used for initializing a table by specifying value  bchunk  to
              option  format of function init_table/3 The Mnesia application uses this function for copying open
              tables.

              Unless the table is protected using safe_fixtable/2, calls to bchunk/2 do  possibly  not  work  as
              expected if concurrent updates are made to the table.

              The first time bchunk/2 is called, an initial continuation, the atom start, must be provided.

              bchunk/2  returns a tuple {Continuation2, Data}, where Data is a list of objects. Continuation2 is
              another continuation that is to be passed on to a subsequent call to bchunk/2. With  a  series  of
              calls to bchunk/2, all table objects can be extracted.

              bchunk/2  returns  '$end_of_table'  when  all objects are returned, or {error, Reason} if an error
              occurs.

       close(Name) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 Reason = term()

              Closes a table. Only processes that have opened a table are allowed to close it.

              All open tables must be closed before the system is stopped. If an attempt is made to open a table
              that is not properly closed, Dets automatically tries to repair it.

       delete(Name, Key) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 Key = Reason = term()

              Deletes all objects with key Key from table Name.

       delete_all_objects(Name) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 Reason = term()

              Deletes  all  objects  from  a  table  in  almost  constant  time. However, if the table if fixed,
              delete_all_objects(T) is equivalent to match_delete(T, '_').

       delete_object(Name, Object) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 Object = object()
                 Reason = term()

              Deletes all instances of a specified  object  from  a  table.  If  a  table  is  of  type  bag  or
              duplicate_bag, this function can be used to delete only some of the objects with a specified key.

       first(Name) -> Key | '$end_of_table'

              Types:

                 Name = tab_name()
                 Key = term()

              Returns  the  first  key  stored  in  table  Name according to the internal order of the table, or
              '$end_of_table' if the table is empty.

              Unless the table is protected using safe_fixtable/2, subsequent calls to next/2  do  possibly  not
              work as expected if concurrent updates are made to the table.

              If  an error occurs, the process is exited with an error tuple {error, Reason}. The error tuple is
              not returned, as it cannot be distinguished from a key.

              There are two reasons why first/1 and next/2 are not to be used: they are not efficient, and  they
              prevent  the use of key '$end_of_table', as this atom is used to indicate the end of the table. If
              possible, use functions match, match_object, and select for traversing tables.

       foldl(Function, Acc0, Name) -> Acc | {error, Reason}

       foldr(Function, Acc0, Name) -> Acc | {error, Reason}

              Types:

                 Name = tab_name()
                 Function = fun((Object :: object(), AccIn) -> AccOut)
                 Acc0 = Acc = AccIn = AccOut = Reason = term()

              Calls Function on successive elements of table Name together with an  extra  argument  AccIn.  The
              table  elements are traversed in unspecified order. Function must return a new accumulator that is
              passed to the next call. Acc0 is returned if the table is empty.

       from_ets(Name, EtsTab) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 EtsTab = ets:table()
                 Reason = term()

              Deletes all objects of table Name and then inserts all the objects of the ETS  table  EtsTab.  The
              objects are inserted in unspecified order. As ets:safe_fixtable/2 is called, the ETS table must be
              public or owned by the calling process.

       info(Name) -> InfoList | undefined

              Types:

                 Name = tab_name()
                 InfoList = [InfoTuple]
                 InfoTuple =
                     {file_size, integer() >= 0} |
                     {filename, file:name()} |
                     {keypos, keypos()} |
                     {size, integer() >= 0} |
                     {type, type()}

              Returns information about table Name as a list of tuples:

                * {file_size, integer() >= 0}} - The file size, in bytes.

                * {filename, file:name()} - The name of the file where objects are stored.

                * {keypos, keypos()} - The key position.

                * {size, integer() >= 0} - The number of objects stored in the table.

                * {type, type()} - The table type.

       info(Name, Item) -> Value | undefined

              Types:

                 Name = tab_name()
                 Item =
                     access | auto_save | bchunk_format | hash | file_size |
                     filename | keypos | memory | no_keys | no_objects | no_slots |
                     owner | ram_file | safe_fixed | safe_fixed_monotonic_time |
                     size | type
                 Value = term()

              Returns the information associated with Item for table Name. In  addition  to  the  {Item,  Value}
              pairs defined for info/1, the following items are allowed:

                * {access, access()} - The access mode.

                * {auto_save, auto_save()} - The autosave interval.

                * {bchunk_format,  binary()} - An opaque binary describing the format of the objects returned by
                  bchunk/2. The binary can be used as argument to is_compatible_chunk_format/2.

                * {hash, Hash} - Describes which BIF is used to calculate the hash values of the objects  stored
                  in the Dets table. Possible values of Hash:

                  * phash - Implies that the erlang:phash/2 BIF is used.

                  * phash2 - Implies that the erlang:phash2/1 BIF is used.

                * {memory,  integer()  >=  0}  - The file size, in bytes. The same value is associated with item
                  file_size.

                * {no_keys, integer >= 0()} - The number of different keys stored in the table.

                * {no_objects, integer >= 0()} - The number of objects stored in the table.

                * {no_slots, {Min, Used, Max}} - The number of slots of the table. Min is the minimum number  of
                  slots, Used is the number of currently used slots, and Max is the maximum number of slots.

                * {owner, pid()} - The pid of the process that handles requests to the Dets table.

                * {ram_file, boolean()} - Whether the table is kept in RAM.

                * {safe_fixed_monotonic_time,  SafeFixed}  -  If  the  table  is  fixed,  SafeFixed  is  a tuple
                  {FixedAtTime, [{Pid,RefCount}]}. FixedAtTime is the time when the table was first  fixed,  and
                  Pid  is the pid of the process that fixes the table RefCount times. There can be any number of
                  processes in the list. If the table is not fixed, SafeFixed is the atom false.

                  FixedAtTime corresponds to the result returned  by  erlang:monotonic_time/0  at  the  time  of
                  fixation. The use of safe_fixed_monotonic_time is  time warp safe.

                * {safe_fixed, SafeFixed} - The same as {safe_fixed_monotonic_time, SafeFixed} except the format
                  and value of FixedAtTime.

                  FixedAtTime corresponds to the result returned by erlang:timestamp/0 at the time of  fixation.
                  Notice  that  when  the  system uses single or multi time warp modes, this can produce strange
                  results. This is because the use of safe_fixed is not  time warp safe.  Time  warp  safe  code
                  must use safe_fixed_monotonic_time instead.

       init_table(Name, InitFun) -> ok | {error, Reason}

       init_table(Name, InitFun, Options) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 InitFun = fun((Arg) -> Res)
                 Arg = read | close
                 Res =
                     end_of_input |
                     {[object()], InitFun} |
                     {Data, InitFun} |
                     term()
                 Options = Option | [Option]
                 Option = {min_no_slots, no_slots()} | {format, term | bchunk}
                 Reason = term()
                 Data = binary() | tuple()

              Replaces  the  existing  objects  of table Name with objects created by calling the input function
              InitFun, see below. The reason for using this function rather than calling  insert/2  is  that  of
              efficiency. Notice that the input functions are called by the process that handles requests to the
              Dets table, not by the calling process.

              When called with argument read, function InitFun is assumed to return end_of_input when  there  is
              no  more  input,  or  {Objects,  Fun},  where  Objects is a list of objects and Fun is a new input
              function. Any other value Value is returned as an error {error,  {init_fun,  Value}}.  Each  input
              function is called exactly once, and if an error occurs, the last function is called with argument
              close, the reply of which is ignored.

              If the table type is set and more than one object exists with a given key, one of the  objects  is
              chosen.  This  is  not  necessarily  the last object with the given key in the sequence of objects
              returned by the input functions. Avoid duplicate keys, otherwise the  file  becomes  unnecessarily
              fragmented. This holds also for duplicated objects stored in tables of type bag.

              It  is important that the table has a sufficient number of slots for the objects. If not, the hash
              list starts to grow when init_table/2 returns, which significantly slows down access to the  table
              for  a  period  of time. The minimum number of slots is set by the open_file/2 option min_no_slots
              and returned by the info/2 item no_slots. See also option min_no_slots below.

              Argument Options is a list of {Key, Val} tuples, where the following values are allowed:

                * {min_no_slots, no_slots()} - Specifies the estimated number of different keys to be stored  in
                  the  table. The open_file/2 option with the same name is ignored, unless the table is created,
                  in which case performance can be enhanced by  supplying  an  estimate  when  initializing  the
                  table.

                * {format, Format} - Specifies the format of the objects returned by function InitFun. If Format
                  is term (the default), InitFun is assumed to return a list of tuples.  If  Format  is  bchunk,
                  InitFun  is  assumed  to  return  Data  as  returned by bchunk/2. This option overrides option
                  min_no_slots.

       insert(Name, Objects) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 Objects = object() | [object()]
                 Reason = term()

              Inserts one or more objects into the table Name. If there already exists  an  object  with  a  key
              matching  the  key  of some of the given objects and the table type is set, the old object will be
              replaced.

       insert_new(Name, Objects) -> boolean() | {error, Reason}

              Types:

                 Name = tab_name()
                 Objects = object() | [object()]
                 Reason = term()

              Inserts one or more objects into table Name. If there  already  exists  some  object  with  a  key
              matching  the key of any of the specified objects, the table is not updated and false is returned.
              Otherwise the objects are inserted and true returned.

       is_compatible_bchunk_format(Name, BchunkFormat) -> boolean()

              Types:

                 Name = tab_name()
                 BchunkFormat = binary()

              Returns true if it would be possible to initialize table  Name,  using  init_table/3  with  option
              {format,  bchunk},  with  objects  read with bchunk/2 from some table T, such that calling info(T,
              bchunk_format) returns BchunkFormat.

       is_dets_file(Filename) -> boolean() | {error, Reason}

              Types:

                 Filename = file:name()
                 Reason = term()

              Returns true if file Filename is a Dets table, otherwise false.

       lookup(Name, Key) -> Objects | {error, Reason}

              Types:

                 Name = tab_name()
                 Key = term()
                 Objects = [object()]
                 Reason = term()

              Returns a list of all objects with key Key stored in table Name, for example:

              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}]

              If the table type is set, the function returns either the empty list or a list with one object, as
              there  cannot be more than one object with a given key. If the table type is bag or duplicate_bag,
              the function returns a list of arbitrary length.

              Notice that the order of objects returned is  unspecified.  In  particular,  the  order  in  which
              objects were inserted is not reflected.

       match(Continuation) ->
                {[Match], Continuation2} |
                '$end_of_table' |
                {error, Reason}

              Types:

                 Continuation = Continuation2 = bindings_cont()
                 Match = [term()]
                 Reason = term()

              Matches  some  objects  stored  in a table and returns a non-empty list of the bindings matching a
              specified pattern in some unspecified order. The table, the pattern, and  the  number  of  objects
              that  are  matched  are all defined by Continuation, which has been returned by a previous call to
              match/1 or match/3.

              When all table objects are matched, '$end_of_table' is returned.

       match(Name, Pattern) -> [Match] | {error, Reason}

              Types:

                 Name = tab_name()
                 Pattern = pattern()
                 Match = [term()]
                 Reason = term()

              Returns for each object of table Name that matches Pattern a list of bindings in some  unspecified
              order.  For  a  description  of  patterns, see ets:match/2. If the keypos'th element of Pattern is
              unbound, all table objects are matched. If the keypos'th element is bound, only the  objects  with
              the correct key are matched.

       match(Name, Pattern, N) ->
                {[Match], Continuation} |
                '$end_of_table' |
                {error, Reason}

              Types:

                 Name = tab_name()
                 Pattern = pattern()
                 N = default | integer() >= 0
                 Continuation = bindings_cont()
                 Match = [term()]
                 Reason = term()

              Matches  some or all objects of table Name and returns a non-empty list of the bindings that match
              Pattern in some unspecified order. For a description of patterns, see ets:match/2.

              A tuple of the bindings and a continuation is returned, unless the table is empty, in  which  case
              '$end_of_table'  is  returned.  The  continuation  is  to be used when matching further objects by
              calling match/1.

              If the keypos'th element of Pattern is bound, all table objects  are  matched.  If  the  keypos'th
              element  is unbound, all table objects are matched, N objects at a time, until at least one object
              matches or the end of the table is reached. The default, indicated by giving N the value  default,
              is  to  let the number of objects vary depending on the sizes of the objects. All objects with the
              same key are always matched at the same time, which implies that more than N objects can sometimes
              be matched.

              The table is always to be protected using safe_fixtable/2 before calling match/3, otherwise errors
              can occur when calling match/1.

       match_delete(Name, Pattern) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 Pattern = pattern()
                 Reason = term()

              Deletes all objects that match Pattern from  table  Name.  For  a  description  of  patterns,  see
              ets:match/2.

              If the keypos'th element of Pattern is bound, only the objects with the correct key are matched.

       match_object(Continuation) ->
                       {Objects, Continuation2} |
                       '$end_of_table' |
                       {error, Reason}

              Types:

                 Continuation = Continuation2 = object_cont()
                 Objects = [object()]
                 Reason = term()

              Returns  a  non-empty  list  of  some objects stored in a table that match a given pattern in some
              unspecified order. The table, the pattern, and the number of objects  that  are  matched  are  all
              defined  by  Continuation,  which  has  been  returned  by  a  previous  call to match_object/1 or
              match_object/3.

              When all table objects are matched, '$end_of_table' is returned.

       match_object(Name, Pattern) -> Objects | {error, Reason}

              Types:

                 Name = tab_name()
                 Pattern = pattern()
                 Objects = [object()]
                 Reason = term()

              Returns a list of all objects of table Name that match Pattern in some unspecified  order.  For  a
              description of patterns, see ets:match/2.

              If  the  keypos'th  element of Pattern is unbound, all table objects are matched. If the keypos'th
              element of Pattern is bound, only the objects with the correct key are matched.

              Using the match_object functions for traversing all table objects is more efficient  than  calling
              first/1 and next/2 or slot/2.

       match_object(Name, Pattern, N) ->
                       {Objects, Continuation} |
                       '$end_of_table' |
                       {error, Reason}

              Types:

                 Name = tab_name()
                 Pattern = pattern()
                 N = default | integer() >= 0
                 Continuation = object_cont()
                 Objects = [object()]
                 Reason = term()

              Matches  some or all objects stored in table Name and returns a non-empty list of the objects that
              match Pattern in some unspecified order. For a description of patterns, see ets:match/2.

              A list of objects and a continuation is returned,  unless  the  table  is  empty,  in  which  case
              '$end_of_table'  is  returned.  The  continuation  is  to be used when matching further objects by
              calling match_object/1.

              If the keypos'th element of Pattern is bound, all table objects  are  matched.  If  the  keypos'th
              element  is unbound, all table objects are matched, N objects at a time, until at least one object
              matches or the end of the table is reached. The default, indicated by giving N the value  default,
              is  to  let the number of objects vary depending on the sizes of the objects. All matching objects
              with the same key are always returned in the same reply, which implies that more  than  N  objects
              can sometimes be returned.

              The table is always to be protected using safe_fixtable/2 before calling match_object/3, otherwise
              errors can occur when calling match_object/1.

       member(Name, Key) -> boolean() | {error, Reason}

              Types:

                 Name = tab_name()
                 Key = Reason = term()

              Works like lookup/2, but does not return the objects. Returns true if one or more  table  elements
              has key Key, otherwise false.

       next(Name, Key1) -> Key2 | '$end_of_table'

              Types:

                 Name = tab_name()
                 Key1 = Key2 = term()

              Returns  either the key following Key1 in table Name according to the internal order of the table,
              or '$end_of_table' if there is no next key.

              If an error occurs, the process is exited with an error tuple {error, Reason}.

              To find the first key in the table, use first/1.

       open_file(Filename) -> {ok, Reference} | {error, Reason}

              Types:

                 Filename = file:name()
                 Reference = reference()
                 Reason = term()

              Opens an existing table. If the table is  not  properly  closed,  it  is  repaired.  The  returned
              reference is to be used as the table name. This function is most useful for debugging purposes.

       open_file(Name, Args) -> {ok, Name} | {error, Reason}

              Types:

                 Name = tab_name()
                 Args = [OpenArg]
                 OpenArg =
                     {access, access()} |
                     {auto_save, auto_save()} |
                     {estimated_no_objects, integer() >= 0} |
                     {file, file:name()} |
                     {max_no_slots, no_slots()} |
                     {min_no_slots, no_slots()} |
                     {keypos, keypos()} |
                     {ram_file, boolean()} |
                     {repair, boolean() | force} |
                     {type, type()}
                 Reason = term()

              Opens a table. An empty Dets table is created if no file exists.

              The  atom  Name is the table name. The table name must be provided in all subsequent operations on
              the table. The name can be used by other processes as well,  and  many  processes  can  share  one
              table.

              If  two  processes  open  the  same table by giving the same name and arguments, the table has two
              users. If one user closes the table, it remains open until the second user closes it.

              Argument Args is a list of {Key, Val} tuples, where the following values are allowed:

                * {access, access()} - Existing tables can be opened in read-only mode. A table that  is  opened
                  in  read-only  mode is not subjected to the automatic file reparation algorithm if it is later
                  opened after a crash. Defaults to read_write.

                * {auto_save, auto_save()} - The autosave interval. If the interval  is  an  integer  Time,  the
                  table  is  flushed to disk whenever it is not accessed for Time milliseconds. A table that has
                  been flushed requires no reparation when reopened after an uncontrolled emulator halt. If  the
                  interval is the atom infinity, autosave is disabled. Defaults to 180000 (3 minutes).

                * {estimated_no_objects, no_slots()} - Equivalent to option min_no_slots.

                * {file, file:name()} - The name of the file to be opened. Defaults to the table name.

                * {max_no_slots,  no_slots()}  - The maximum number of slots to be used. Defaults to 32 M, which
                  is the maximal value. Notice that a higher value can increase the table fragmentation,  and  a
                  smaller value can decrease the fragmentation, at the expense of execution time.

                * {min_no_slots,  no_slots()}  -  Application  performance  can  be  enhanced  with this flag by
                  specifying, when the table is created, the estimated number of different keys to be stored  in
                  the table. Defaults to 256, which is the minimum value.

                * {keypos, keypos()} - The position of the element of each object to be used as key. Defaults to
                  1. The ability to explicitly state the key position is most convenient when we want  to  store
                  Erlang records in which the first position of the record is the name of the record type.

                * {ram_file,  boolean()}  - Whether the table is to be kept in RAM. Keeping the table in RAM can
                  sound like an anomaly, but can enhance the performance of  applications  that  open  a  table,
                  insert  a set of objects, and then close the table. When the table is closed, its contents are
                  written to the disk file. Defaults to false.

                * {repair, Value} - Value can be either a boolean() or the atom force. The flag specifies if the
                  Dets  server  is to invoke the automatic file reparation algorithm. Defaults to true. If false
                  is specified, no attempt is made to repair the file, and {error, {needs_repair, FileName}}  is
                  returned if the table must be repaired.

                  Value  force  means  that a reparation is made even if the table is properly closed. This is a
                  seldom needed option.

                  Option repair is ignored if the table is already open.

                * {type, type()} - The table type. Defaults to set.

       pid2name(Pid) -> {ok, Name} | undefined

              Types:

                 Pid = pid()
                 Name = tab_name()

              Returns the table name given the pid of a process that handles requests to a table,  or  undefined
              if there is no such table.

              This function is meant to be used for debugging only.

       repair_continuation(Continuation, MatchSpec) -> Continuation2

              Types:

                 Continuation = Continuation2 = select_cont()
                 MatchSpec = match_spec()

              This  function  can  be used to restore an opaque continuation returned by select/3 or select/1 if
              the continuation has passed through external term format (been sent between  nodes  or  stored  on
              disk).

              The  reason for this function is that continuation terms contain compiled match specifications and
              therefore are invalidated if converted to external term format.  Given  that  the  original  match
              specification  is kept intact, the continuation can be restored, meaning it can once again be used
              in subsequent select/1 calls even though it has been stored on disk or on another node.

              For more information and examples, see the ets(3erl) module.

          Note:
              This function is rarely needed in application code. It is used by application  Mnesia  to  provide
              distributed  select/3 and select/1 sequences. A normal application would either use Mnesia or keep
              the continuation from being converted to external format.

              The reason for  not  having  an  external  representation  of  compiled  match  specifications  is
              performance.  It  can  be  subject  to change in future releases, while this interface remains for
              backward compatibility.

       safe_fixtable(Name, Fix) -> ok

              Types:

                 Name = tab_name()
                 Fix = boolean()

              If Fix is true, table Name is fixed (once more) by the calling process,  otherwise  the  table  is
              released. The table is also released when a fixing process terminates.

              If  many  processes  fix  a table, the table remains fixed until all processes have released it or
              terminated. A reference counter is kept on a per process basis, and N consecutive fixes require  N
              releases to release the table.

              It is not guaranteed that calls to first/1, next/2, or select and match functions work as expected
              even if the table is fixed; the limited support for concurrency provided by the  ets(3erl)  module
              is  not  yet provided by Dets. Fixing a table currently only disables resizing of the hash list of
              the table.

              If objects have been added while the table was fixed, the hash list starts to grow when the  table
              is released, which significantly slows down access to the table for a period of time.

       select(Continuation) ->
                 {Selection, Continuation2} |
                 '$end_of_table' |
                 {error, Reason}

              Types:

                 Continuation = Continuation2 = select_cont()
                 Selection = [term()]
                 Reason = term()

              Applies  a  match  specification to some objects stored in a table and returns a non-empty list of
              the results. The table, the match specification, and the number of objects that  are  matched  are
              all defined by Continuation, which is returned by a previous call to select/1 or select/3.

              When all objects of the table have been matched, '$end_of_table' is returned.

       select(Name, MatchSpec) -> Selection | {error, Reason}

              Types:

                 Name = tab_name()
                 MatchSpec = match_spec()
                 Selection = [term()]
                 Reason = term()

              Returns  the  results  of  applying match specification MatchSpec to all or some objects stored in
              table Name. The order of the objects is not specified. For a description of match  specifications,
              see the ERTS User's Guide.

              If  the  keypos'th  element  of  MatchSpec  is  unbound, the match specification is applied to all
              objects of the table. If the keypos'th element is bound, the match specification is applied to the
              objects with the correct key(s) only.

              Using  the  select  functions for traversing all objects of a table is more efficient than calling
              first/1 and next/2 or slot/2.

       select(Name, MatchSpec, N) ->
                 {Selection, Continuation} |
                 '$end_of_table' |
                 {error, Reason}

              Types:

                 Name = tab_name()
                 MatchSpec = match_spec()
                 N = default | integer() >= 0
                 Continuation = select_cont()
                 Selection = [term()]
                 Reason = term()

              Returns the results of applying match specification MatchSpec to some or  all  objects  stored  in
              table  Name. The order of the objects is not specified. For a description of match specifications,
              see the ERTS User's Guide.

              A tuple of the results of applying the match specification and a continuation is returned,  unless
              the table is empty, in which case '$end_of_table' is returned. The continuation is to be used when
              matching more objects by calling select/1.

              If the keypos'th element of MatchSpec is bound, the match specification is applied to all  objects
              of  the table with the correct key(s). If the keypos'th element of MatchSpec is unbound, the match
              specification is applied to all objects of the table, N objects at a  time,  until  at  least  one
              object  matches  or  the end of the table is reached. The default, indicated by giving N the value
              default, is to let the number of objects vary depending on the sizes of the objects.  All  objects
              with  the same key are always handled at the same time, which implies that the match specification
              can be applied to more than N objects.

              The table is always to be protected  using  safe_fixtable/2  before  calling  select/3,  otherwise
              errors can occur when calling select/1.

       select_delete(Name, MatchSpec) -> N | {error, Reason}

              Types:

                 Name = tab_name()
                 MatchSpec = match_spec()
                 N = integer() >= 0
                 Reason = term()

              Deletes each object from table Name such that applying match specification MatchSpec to the object
              returns value true. For a description of match specifications, see the ERTS User's Guide.  Returns
              the number of deleted objects.

              If  the keypos'th element of MatchSpec is bound, the match specification is applied to the objects
              with the correct key(s) only.

       slot(Name, I) -> '$end_of_table' | Objects | {error, Reason}

              Types:

                 Name = tab_name()
                 I = integer() >= 0
                 Objects = [object()]
                 Reason = term()

              The objects of a table are distributed among slots, starting with slot 0 and ending with  slot  n.
              Returns the list of objects associated with slot I. If I > n, '$end_of_table' is returned.

       sync(Name) -> ok | {error, Reason}

              Types:

                 Name = tab_name()
                 Reason = term()

              Ensures  that all updates made to table Name are written to disk. This also applies to tables that
              have been opened with flag ram_file set to true. In this case, the contents of the  RAM  file  are
              flushed to disk.

              Notice that the space management data structures kept in RAM, the buddy system, is also written to
              the disk. This can take some time if the table is fragmented.

       table(Name) -> QueryHandle

       table(Name, Options) -> QueryHandle

              Types:

                 Name = tab_name()
                 Options = Option | [Option]
                 Option = {n_objects, Limit} | {traverse, TraverseMethod}
                 Limit = default | integer() >= 1
                 TraverseMethod = first_next | select | {select, match_spec()}
                 QueryHandle = qlc:query_handle()

              Returns a Query List Comprehension (QLC) query handle.  The  qlc(3erl)  module  provides  a  query
              language  aimed  mainly  for Mnesia, but ETS tables, Dets tables, and lists are also recognized by
              qlc as sources of data. Calling dets:table/1,2 is the means to make Dets table Name usable to qlc.

              When there are only simple restrictions on the key position, qlc uses dets:lookup/2 to look up the
              keys. When that is not possible, the whole table is traversed. Option traverse determines how this
              is done:

                * first_next - The table is traversed one key at a time by calling dets:first/1 and dets:next/2.

                * select - The table is traversed by calling dets:select/3 and dets:select/1.  Option  n_objects
                  determines  the  number  of  objects  returned  (the  third  argument  of select/3). The match
                  specification (the second argument of select/3) is assembled by 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()} - As for select, the table is traversed by calling dets:select/3 and
                  dets:select/1. The difference is that the match specification is specified explicitly. This is
                  how  to  state match specifications that cannot easily be expressed within the syntax provided
                  by qlc.

              The following example uses an explicit match specification to traverse the table:

              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}}]).

              An example with implicit match specification:

              2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

              The latter example is equivalent to the former, which can be verified using function qlc:info/1:

              3> qlc:info(QH1) =:= qlc:info(QH2).
              true

              qlc:info/1 returns information about a  query  handle.  In  this  case  identical  information  is
              returned for the two query handles.

       to_ets(Name, EtsTab) -> EtsTab | {error, Reason}

              Types:

                 Name = tab_name()
                 EtsTab = ets:table()
                 Reason = term()

              Inserts  the  objects  of  the  Dets  table Name into the ETS table EtsTab. The order in which the
              objects are inserted is not specified. The existing objects of  the  ETS  table  are  kept  unless
              overwritten.

       traverse(Name, Fun) -> Return | {error, Reason}

              Types:

                 Name = tab_name()
                 Fun = fun((Object) -> FunReturn)
                 Object = object()
                 FunReturn =
                     continue | {continue, Val} | {done, Value} | OtherValue
                 Return = [term()] | OtherValue
                 Val = Value = OtherValue = Reason = term()

              Applies  Fun  to each object stored in table Name in some unspecified order. Different actions are
              taken depending on the return value of Fun. The following Fun return values are allowed:

                continue:
                  Continue to perform the traversal. For example, the following function can be  used  to  print
                  the contents of a table:

                fun(X) -> io:format("~p~n", [X]), continue end.

                {continue, Val}:
                  Continue  the  traversal and accumulate Val. The following function is supplied to collect all
                  objects of a table in a list:

                fun(X) -> {continue, X} end.

                {done, Value}:
                  Terminate the traversal and return [Value | Acc].

              Any other value OtherValue returned by Fun terminates the traversal and is returned immediately.

       update_counter(Name, Key, Increment) -> Result

              Types:

                 Name = tab_name()
                 Key = term()
                 Increment = {Pos, Incr} | Incr
                 Pos = Incr = Result = integer()

              Updates the object with key Key stored in table Name of type set by adding Incr to the element  at
              the  Pos:th  position. The new counter value is returned. If no position is specified, the element
              directly following the key is updated.

              This functions provides a way of updating a counter, without having to look up an  object,  update
              the object by incrementing an element, and insert the resulting object into the table again.

SEE ALSO

       ets(3erl), mnesia(3erl), qlc(3erl)