1 /*-
2  * Copyright (c) 2009, 2020 Oracle and/or its affiliates.  All rights reserved.
3  *
4  * See the file LICENSE for license information.
5  *
6  */
7 using System;
8 using System.Collections.Generic;
9 using System.Text;
10 
11 namespace BerkeleyDB {
12     /// <summary>
13     /// A class representing configuration parameters for
14     /// <see cref="QueueDatabase"/>
15     /// </summary>
16     public class QueueDatabaseConfig : DatabaseConfig {
17         /* Fields for DB->set_flags() */
18         /// <summary>
19         /// If true, modify the operation of <see cref="QueueDatabase.Consume"/>
20         /// to return key/data pairs in order. They always return
21         /// the key/data item from the head of the queue.
22         /// </summary>
23         /// <remarks>
24         /// <para>
25         /// The default behavior of queue databases is optimized for multiple
26         /// readers, and does not guarantee records to be retrieved in the
27         /// order they are added to the queue. Specifically, if a writing thread
28         /// adds multiple records to an empty queue, reading threads may skip
29         /// some of the initial records when the next
30         /// <see cref="QueueDatabase.Consume"/> call returns.
31         /// </para>
32         /// <para>
33         /// This setting modifies <see cref="QueueDatabase.Consume"/> to verify
34         /// that the record being returned is in fact the head of the queue.
35         /// This increases contention and reduces concurrency when there are
36         /// many reading threads.
37         /// </para>
38         /// </remarks>
39         public bool ConsumeInOrder;
40         internal new uint flags {
41             get {
42                 uint ret = base.flags;
43                 ret |= ConsumeInOrder ? Internal.DbConstants.DB_INORDER : 0;
44                 return ret;
45             }
46         }
47 
48         /// <summary>
49         /// The policy for how to handle database creation.
50         /// </summary>
51         /// <remarks>
52         /// If the database does not already exist and
53         /// <see cref="CreatePolicy.NEVER"/> is set,
54         /// <see cref="QueueDatabase.Open"/> fails.
55         /// </remarks>
56         public CreatePolicy Creation;
57         internal new uint openFlags {
58             get {
59                 uint flags = base.openFlags;
60                 flags |= (uint)Creation;
61                 return flags;
62             }
63         }
64 
65         /// <summary>
66         /// A function to call after the record number has been selected but
67         /// before the data has been stored into the database.
68         /// </summary>
69         /// <remarks>
70         /// <para>
71         /// When using <see cref="QueueDatabase.Append"/>, it may be useful to
72         /// modify the stored data based on the generated key. If a delegate is
73         /// specified, it is called after the record number has been
74         /// selected, but before the data has been stored.
75         /// </para>
76         /// </remarks>
77         public AppendRecordDelegate Append;
78 
79         private uint len;
80         /// <summary>
81         /// Specify the length of records in the database.
82         /// </summary>
83         /// <remarks>
84         /// <para>
85         /// The record length must be enough smaller than
86         /// <see cref="DatabaseConfig.PageSize"/> that at least one record plus
87         /// the database page's metadata information can fit on each database
88         /// page.
89         /// </para>
90         /// <para>
91         /// Any records added to the database that are less than Length bytes
92         /// long are automatically padded (see <see cref="PadByte"/> for more
93         /// information).
94         /// </para>
95         /// <para>
96         /// Any attempt to insert records into the database that are greater
97         /// than Length bytes long causes the call to fail immediately and
98         /// return an error.
99         /// </para>
100         /// <para>
101         /// If the database already exists, this setting is ignored.
102         /// </para>
103         /// </remarks>
104         public uint Length {
105             get { return len; }
106             set { len = value; }
107         }
108 
109         internal bool padIsSet;
110         private int pad;
111         /// <summary>
112         /// The padding character for short, fixed-length records.
113         /// </summary>
114         /// <remarks>
115         /// <para>
116         /// If no pad character is specified, space characters (ASCII
117         /// 0x20) are used for padding.
118         /// </para>
119         /// <para>
120         /// If the database already exists, this setting is ignored.
121         /// </para>
122         /// </remarks>
123         public int PadByte {
124             get { return pad; }
125             set {
126                 padIsSet = true;
127                 pad = value;
128             }
129         }
130 
131         internal bool extentIsSet;
132         private uint extentSz;
133         /// <summary>
134         /// The size of the extents used to hold pages in a
135         /// <see cref="QueueDatabase"/>, specified as a number of pages.
136         /// </summary>
137         /// <remarks>
138         /// <para>
139         /// Each extent is created as a separate physical file. If no extent
140         /// size is set, the default behavior is to create only a single
141         /// underlying database file.
142         /// </para>
143         /// <para>
144         /// For information on tuning the extent size, see Selecting a extent
145         /// size in the Programmer's Reference Guide.
146         /// </para>
147         /// <para>
148         /// If the database already exists, this setting is ignored.
149         /// </para>
150         /// </remarks>
151         public uint ExtentSize {
152             get { return extentSz; }
153             set {
154                 extentIsSet = true;
155                 extentSz = value;
156             }
157         }
158 
159         /// <summary>
160         /// Instantiate a new QueueDatabaseConfig object
161         /// </summary>
QueueDatabaseConfig()162         public QueueDatabaseConfig() {
163             ConsumeInOrder = false;
164             Append = null;
165             padIsSet = false;
166             extentIsSet = false;
167             Creation = CreatePolicy.NEVER;
168         }
169     }
170 }