dets(3)



dets(3erl)                 Erlang Module Definition                 dets(3erl)

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 fragmenta-
       tion 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 substan-
       tial 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 ta-
       ble. 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  impor-
       tant  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 ex-
       ports 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 im-
       plementation  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,  nei-
       ther  is  the  limited  support for concurrent updates that makes a se-
       quence 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 Er-
       lang/OTP. Until then, the Mnesia application (or some  user-implemented
       method  for  locking)  must be used to implement safe concurrency. Cur-
       rently, 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 represen-
              tation 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  al-
              lowed 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. How-
              ever, 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 in-
              ternal 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  se-
              lect 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:tab()
                 Reason = term()

              Deletes  all  objects of table Name and then inserts all the ob-
              jects of the ETS table EtsTab. The objects are inserted  in  un-
              specified 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 fol-
              lowing 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. Possi-
                  ble 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  num-
                  ber  of  currently used slots, and Max is the maximum number
                  of slots.

                * {owner, pid()} - The pid of the  process  that  handles  re-
                  quests 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  er-
                  lang: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_mono-
                  tonic_time,  SafeFixed} except the format and value of Fixe-
                  dAtTime.

                  FixedAtTime  corresponds  to  the  result  returned  by  er-
                  lang: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 ef-
              ficiency. 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 argu-
              ment 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  fol-
              lowing 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  sup-
                  plying an estimate when initializing the table.

                * {format,  Format}  - Specifies the format of the objects re-
                  turned 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 al-
              ready 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  re-
              turned. 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 dupli-
              cate_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 re-
              flected.

       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 un-
              specified order. The table, the pattern, and the number  of  ob-
              jects  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 ele-
              ment 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  unspeci-
              fied 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 ob-
              jects are matched, N objects at a time, until at least  one  ob-
              ject  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 im-
              plies 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 de-
              fined 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 ob-
              jects 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 ob-
              jects 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 unspec-
              ified order. For a description of patterns, see ets:match/2.

              A list of objects and a continuation is returned, unless the ta-
              ble 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 ob-
              jects are matched, N objects at a time, until at least  one  ob-
              ject  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 re-
              turned.

              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 ta-
              ble.

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

              Argument  Args is a list of {Key, Val} tuples, where the follow-
              ing 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 in-
                  terval 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. De-
                  faults 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.  No-
                  tice  that  a higher value can increase the table fragmenta-
                  tion, 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 ob-
                  ject  to  be  used as key. Defaults to 1. The ability to ex-
                  plicitly 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  ta-
                  ble, 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  in-
                  voke  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  ta-
                  ble 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  re-
              turned  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 se-
              lect/1 sequences. A normal application would either  use  Mnesia
              or  keep  the continuation from being converted to external for-
              mat.

              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  re-
              leased 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 signifi-
              cantly 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  ob-
              jects  is  not  specified. For a description of match specifica-
              tions, 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 ob-
              jects is not specified. For a description  of  match  specifica-
              tions, 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 speci-
              fication 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 al-
              ways 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  se-
              lect/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 speci-
              fication 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 Mne-
              sia, 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 possi-
              ble, 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 ob-
                  jects 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 speci-
                    fications.

                  * 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 tra-
                  versed by calling dets:select/3 and dets:select/1. The  dif-
                  ference is that the match specification is specified explic-
                  itly. 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  han-
              dles.

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

              Types:

                 Name = tab_name()
                 EtsTab = ets:tab()
                 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 spec-
              ified.  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 unspeci-
              fied  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  follow-
                  ing 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 tra-
              versal 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 ele-
              ment 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)

Ericsson AB                       stdlib 3.13                       dets(3erl)

Man(1) output converted with man2html
list of all man pages