<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>rpmdb/db3.c Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.2.17 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>rpmdb/db3.c</h1><a href="db3_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">/*@-type@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> 00006 <span class="comment">/*@unchecked@*/</span> <a name="l00007"></a><a class="code" href="db3_8c.html#a0">00007</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a0">_debug</a> = 1; <span class="comment">/* XXX if < 0 debugging, > 0 unusual error returns */</span> 00008 00009 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span> 00010 00011 <span class="preprocessor">#if defined(HAVE_FTOK) && defined(HAVE_SYS_IPC_H)</span> 00012 <span class="preprocessor"></span><span class="preprocessor">#include <sys/ipc.h></span> 00013 <span class="preprocessor">#endif</span> 00014 <span class="preprocessor"></span> 00015 <span class="preprocessor">#if defined(__LCLINT__)</span> 00016 <span class="preprocessor"></span><span class="comment">/*@-redef@*/</span> <span class="comment">/* FIX: rpmio/rpmio.c also declares */</span> 00017 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> u_int32_t; 00018 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> u_int16_t; 00019 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> u_int8_t; 00020 <span class="comment">/*@-incondefs@*/</span> <span class="comment">/* LCLint 3.0.0.15 */</span> 00021 <span class="keyword">typedef</span> <span class="keywordtype">int</span> int32_t; 00022 <span class="comment">/*@=incondefs@*/</span> 00023 <span class="comment">/*@=redef@*/</span> 00024 <span class="preprocessor">#endif</span> 00025 <span class="preprocessor"></span> 00026 <span class="preprocessor">#include <db3/db.h></span> 00027 00028 <span class="preprocessor">#include <<a class="code" href="rpmlib_8h.html">rpmlib.h</a>></span> 00029 <span class="preprocessor">#include <<a class="code" href="rpmmacro_8h.html">rpmmacro.h</a>></span> 00030 <span class="preprocessor">#include <<a class="code" href="rpmurl_8h.html">rpmurl.h</a>></span> <span class="comment">/* XXX urlPath proto */</span> 00031 00032 <span class="preprocessor">#include "<a class="code" href="rpmdb_8h.html">rpmdb.h</a>"</span> 00033 00034 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span> 00035 00036 <span class="comment">/*@access rpmdb@*/</span> 00037 <span class="comment">/*@access dbiIndex@*/</span> 00038 <span class="comment">/*@access dbiIndexSet@*/</span> 00039 00043 <span class="comment">/*@-fielduse@*/</span> <a name="l00044"></a><a class="code" href="structdbiHStats__s.html">00044</a> <span class="keyword">struct </span><a class="code" href="structdbiHStats__s.html">dbiHStats_s</a> { <a name="l00045"></a><a class="code" href="structdbiHStats__s.html#m0">00045</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m0">hash_magic</a>; <a name="l00046"></a><a class="code" href="structdbiHStats__s.html#m1">00046</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m1">hash_version</a>; <a name="l00047"></a><a class="code" href="structdbiHStats__s.html#m2">00047</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m2">hash_nkeys</a>; <a name="l00048"></a><a class="code" href="structdbiHStats__s.html#m3">00048</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m3">hash_ndata</a>; <a name="l00049"></a><a class="code" href="structdbiHStats__s.html#m4">00049</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m4">hash_pagesize</a>; <a name="l00050"></a><a class="code" href="structdbiHStats__s.html#m5">00050</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m5">hash_nelem</a>; <a name="l00051"></a><a class="code" href="structdbiHStats__s.html#m6">00051</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m6">hash_ffactor</a>; <a name="l00052"></a><a class="code" href="structdbiHStats__s.html#m7">00052</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m7">hash_buckets</a>; <a name="l00053"></a><a class="code" href="structdbiHStats__s.html#m8">00053</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m8">hash_free</a>; <a name="l00054"></a><a class="code" href="structdbiHStats__s.html#m9">00054</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m9">hash_bfree</a>; <a name="l00055"></a><a class="code" href="structdbiHStats__s.html#m10">00055</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m10">hash_bigpages</a>; <a name="l00056"></a><a class="code" href="structdbiHStats__s.html#m11">00056</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m11">hash_big_bfree</a>; <a name="l00057"></a><a class="code" href="structdbiHStats__s.html#m12">00057</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m12">hash_overflows</a>; <a name="l00058"></a><a class="code" href="structdbiHStats__s.html#m13">00058</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m13">hash_ovfl_free</a>; <a name="l00059"></a><a class="code" href="structdbiHStats__s.html#m14">00059</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m14">hash_dup</a>; <a name="l00060"></a><a class="code" href="structdbiHStats__s.html#m15">00060</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiHStats__s.html#m15">hash_dup_free</a>; 00061 }; 00062 <a name="l00066"></a><a class="code" href="structdbiBStats__s.html">00066</a> <span class="keyword">struct </span><a class="code" href="structdbiBStats__s.html">dbiBStats_s</a> { <a name="l00067"></a><a class="code" href="structdbiBStats__s.html#m0">00067</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m0">bt_magic</a>; <a name="l00068"></a><a class="code" href="structdbiBStats__s.html#m1">00068</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m1">bt_version</a>; <a name="l00069"></a><a class="code" href="structdbiBStats__s.html#m2">00069</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m2">bt_nkeys</a>; <a name="l00070"></a><a class="code" href="structdbiBStats__s.html#m3">00070</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m3">bt_ndata</a>; <a name="l00071"></a><a class="code" href="structdbiBStats__s.html#m4">00071</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m4">bt_pagesize</a>; <a name="l00072"></a><a class="code" href="structdbiBStats__s.html#m5">00072</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m5">bt_minkey</a>; <a name="l00073"></a><a class="code" href="structdbiBStats__s.html#m6">00073</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m6">bt_re_len</a>; <a name="l00074"></a><a class="code" href="structdbiBStats__s.html#m7">00074</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m7">bt_re_pad</a>; <a name="l00075"></a><a class="code" href="structdbiBStats__s.html#m8">00075</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m8">bt_levels</a>; <a name="l00076"></a><a class="code" href="structdbiBStats__s.html#m9">00076</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m9">bt_int_pg</a>; <a name="l00077"></a><a class="code" href="structdbiBStats__s.html#m10">00077</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m10">bt_leaf_pg</a>; <a name="l00078"></a><a class="code" href="structdbiBStats__s.html#m11">00078</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m11">bt_dup_pg</a>; <a name="l00079"></a><a class="code" href="structdbiBStats__s.html#m12">00079</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m12">bt_over_pg</a>; <a name="l00080"></a><a class="code" href="structdbiBStats__s.html#m13">00080</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m13">bt_free</a>; <a name="l00081"></a><a class="code" href="structdbiBStats__s.html#m14">00081</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m14">bt_int_pgfree</a>; <a name="l00082"></a><a class="code" href="structdbiBStats__s.html#m15">00082</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m15">bt_leaf_pgfree</a>; <a name="l00083"></a><a class="code" href="structdbiBStats__s.html#m16">00083</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m16">bt_dup_pgfree</a>; <a name="l00084"></a><a class="code" href="structdbiBStats__s.html#m17">00084</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structdbiBStats__s.html#m17">bt_over_pgfree</a>; 00085 }; 00086 <span class="comment">/*@=fielduse@*/</span> 00087 00088 <span class="comment">/*@-globuse -mustmod @*/</span> <span class="comment">/* FIX: rpmError not annotated yet. */</span> <a name="l00089"></a><a class="code" href="db3_8c.html#a2">00089</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a2">cvtdberr</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="keyword">const</span> <span class="keywordtype">char</span> * msg, <span class="keywordtype">int</span> error, <span class="keywordtype">int</span> printit) 00090 <span class="comment">/*@globals fileSystem @*/</span> 00091 <span class="comment">/*@modifies fileSystem @*/</span> 00092 { 00093 <span class="keywordtype">int</span> rc = 0; 00094 00095 rc = error; 00096 00097 <span class="keywordflow">if</span> (printit && rc) { 00098 <span class="comment">/*@-moduncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> 00099 <span class="keywordflow">if</span> (msg) 00100 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a69">RPMERR_DBERR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"db%d error(%d) from %s: %s\n"</span>), 00101 dbi-><a class="code" href="struct__dbiIndex.html#m15">dbi_api</a>, rc, msg, db_strerror(error)); 00102 <span class="keywordflow">else</span> 00103 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a69">RPMERR_DBERR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"db%d error(%d): %s\n"</span>), 00104 dbi-><a class="code" href="struct__dbiIndex.html#m15">dbi_api</a>, rc, db_strerror(error)); 00105 <span class="comment">/*@=moduncon@*/</span> 00106 } 00107 00108 <span class="keywordflow">return</span> rc; 00109 } 00110 <span class="comment">/*@=globuse =mustmod @*/</span> 00111 <a name="l00112"></a><a class="code" href="db3_8c.html#a3">00112</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a3">db_fini</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="keyword">const</span> <span class="keywordtype">char</span> * dbhome, 00113 <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * dbfile, 00114 <span class="comment">/*@unused@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * dbsubfile) 00115 <span class="comment">/*@globals fileSystem @*/</span> 00116 <span class="comment">/*@modifies fileSystem @*/</span> 00117 { 00118 <a class="code" href="structrpmdb__s.html">rpmdb</a> <a class="code" href="structrpmdb__s.html">rpmdb</a> = dbi-><a class="code" href="struct__dbiIndex.html#m66">dbi_rpmdb</a>; 00119 <a class="code" href="rpmdb_8h.html#a1">DB_ENV</a> * dbenv = rpmdb-><a class="code" href="structrpmdb__s.html#m16">db_dbenv</a>; 00120 <span class="keywordtype">int</span> rc; 00121 00122 <span class="keywordflow">if</span> (dbenv == NULL) 00123 <span class="keywordflow">return</span> 0; 00124 00125 rc = dbenv->close(dbenv, 0); 00126 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->close"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00127 00128 <span class="keywordflow">if</span> (dbfile) 00129 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"closed db environment %s/%s\n"</span>), 00130 dbhome, dbfile); 00131 00132 <span class="keywordflow">if</span> (rpmdb-><a class="code" href="structrpmdb__s.html#m7">db_remove_env</a> || dbi-><a class="code" href="struct__dbiIndex.html#m17">dbi_tear_down</a>) { 00133 <span class="keywordtype">int</span> xx; 00134 00135 <span class="comment">/*@-moduncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> 00136 xx = db_env_create(&dbenv, 0); 00137 <span class="comment">/*@=moduncon@*/</span> 00138 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db_env_create"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00139 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR != 0) || (DB_VERSION_MAJOR == 4)</span> 00140 <span class="preprocessor"></span> xx = dbenv->remove(dbenv, dbhome, 0); 00141 <span class="preprocessor">#else</span> 00142 <span class="preprocessor"></span> xx = dbenv->remove(dbenv, dbhome, NULL, 0); 00143 <span class="preprocessor">#endif</span> 00144 <span class="preprocessor"></span> xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->remove"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00145 00146 <span class="keywordflow">if</span> (dbfile) 00147 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"removed db environment %s/%s\n"</span>), 00148 dbhome, dbfile); 00149 00150 } 00151 <span class="keywordflow">return</span> rc; 00152 } 00153 <a name="l00154"></a><a class="code" href="db3_8c.html#a4">00154</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a4">db3_fsync_disable</a>(<span class="comment">/*@unused@*/</span> <span class="keywordtype">int</span> fd) 00155 <span class="comment">/*@*/</span> 00156 { 00157 <span class="keywordflow">return</span> 0; 00158 } 00159 00160 <span class="comment">/*@-moduncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> <a name="l00161"></a><a class="code" href="db3_8c.html#a5">00161</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a5">db_init</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="keyword">const</span> <span class="keywordtype">char</span> * dbhome, 00162 <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * dbfile, 00163 <span class="comment">/*@unused@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * dbsubfile, 00164 <span class="comment">/*@out@*/</span> <a class="code" href="rpmdb_8h.html#a1">DB_ENV</a> ** dbenvp) 00165 <span class="comment">/*@globals rpmGlobalMacroContext,</span> 00166 <span class="comment"> fileSystem @*/</span> 00167 <span class="comment">/*@modifies dbi, *dbenvp, fileSystem @*/</span> 00168 { 00169 <a class="code" href="structrpmdb__s.html">rpmdb</a> <a class="code" href="structrpmdb__s.html">rpmdb</a> = dbi-><a class="code" href="struct__dbiIndex.html#m66">dbi_rpmdb</a>; 00170 <a class="code" href="rpmdb_8h.html#a1">DB_ENV</a> *dbenv = NULL; 00171 <span class="keywordtype">int</span> eflags; 00172 <span class="keywordtype">int</span> rc; 00173 00174 <span class="keywordflow">if</span> (dbenvp == NULL) 00175 <span class="keywordflow">return</span> 1; 00176 00177 <span class="comment">/* XXX HACK */</span> 00178 <span class="comment">/*@-assignexpose@*/</span> 00179 <span class="keywordflow">if</span> (rpmdb-><a class="code" href="structrpmdb__s.html#m11">db_errfile</a> == NULL) 00180 rpmdb-><a class="code" href="structrpmdb__s.html#m11">db_errfile</a> = stderr; 00181 <span class="comment">/*@=assignexpose@*/</span> 00182 00183 eflags = (dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> | dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a>); 00184 <span class="keywordflow">if</span> (eflags & DB_JOINENV) eflags &= DB_JOINENV; 00185 00186 <span class="keywordflow">if</span> (dbfile) 00187 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"opening db environment %s/%s %s\n"</span>), 00188 dbhome, dbfile, <a class="code" href="group__db3.html#a4">prDbiOpenFlags</a>(eflags, 1)); 00189 00190 <span class="comment">/* XXX Can't do RPC w/o host. */</span> 00191 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m28">dbi_host</a> == NULL) 00192 dbi-><a class="code" href="struct__dbiIndex.html#m5">dbi_ecflags</a> &= ~DB_CLIENT; 00193 00194 <span class="comment">/* XXX Set a default shm_key. */</span> 00195 <span class="keywordflow">if</span> ((dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> & DB_SYSTEM_MEM) && dbi-><a class="code" href="struct__dbiIndex.html#m14">dbi_shmkey</a> == 0) { 00196 <span class="preprocessor">#if defined(HAVE_FTOK)</span> 00197 <span class="preprocessor"></span> dbi-><a class="code" href="struct__dbiIndex.html#m14">dbi_shmkey</a> = ftok(dbhome, 0); 00198 <span class="preprocessor">#else</span> 00199 <span class="preprocessor"></span> dbi-><a class="code" href="struct__dbiIndex.html#m14">dbi_shmkey</a> = 0x44631380; 00200 <span class="preprocessor">#endif</span> 00201 <span class="preprocessor"></span> } 00202 00203 rc = db_env_create(&dbenv, dbi-><a class="code" href="struct__dbiIndex.html#m5">dbi_ecflags</a>); 00204 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db_env_create"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00205 <span class="keywordflow">if</span> (rc) 00206 <span class="keywordflow">goto</span> errxit; 00207 00208 <span class="keywordflow">if</span> (dbenv == NULL) 00209 <span class="keywordflow">return</span> 1; 00210 00211 { <span class="keywordtype">int</span> xx; 00212 <span class="comment">/*@-noeffectuncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> 00213 dbenv->set_errcall(dbenv, rpmdb-><a class="code" href="structrpmdb__s.html#m10">db_errcall</a>); 00214 dbenv->set_errfile(dbenv, rpmdb-><a class="code" href="structrpmdb__s.html#m11">db_errfile</a>); 00215 dbenv->set_errpfx(dbenv, rpmdb-><a class="code" href="structrpmdb__s.html#m6">db_errpfx</a>); 00216 <span class="comment">/* dbenv->set_paniccall(???) */</span> 00217 <span class="comment">/*@=noeffectuncon@*/</span> 00218 xx = dbenv->set_verbose(dbenv, DB_VERB_CHKPOINT, 00219 (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a> & DB_VERB_CHKPOINT)); 00220 xx = dbenv->set_verbose(dbenv, DB_VERB_DEADLOCK, 00221 (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a> & DB_VERB_DEADLOCK)); 00222 xx = dbenv->set_verbose(dbenv, DB_VERB_RECOVERY, 00223 (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a> & DB_VERB_RECOVERY)); 00224 xx = dbenv->set_verbose(dbenv, DB_VERB_WAITSFOR, 00225 (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a> & DB_VERB_WAITSFOR)); 00226 <span class="comment">/* dbenv->set_lg_max(???) */</span> 00227 <span class="comment">/* dbenv->set_lk_conflicts(???) */</span> 00228 <span class="comment">/* dbenv->set_lk_detect(???) */</span> 00229 <span class="comment">/* dbenv->set_lk_max(???) */</span> 00230 xx = dbenv->set_mp_mmapsize(dbenv, dbi-><a class="code" href="struct__dbiIndex.html#m38">dbi_mp_mmapsize</a>); 00231 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->set_mp_mmapsize"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00232 xx = dbenv->set_cachesize(dbenv, 0, dbi-><a class="code" href="struct__dbiIndex.html#m39">dbi_mp_size</a>, 0); 00233 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->set_cachesize"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00234 <span class="comment">/* dbenv->set_tx_max(???) */</span> 00235 <span class="comment">/* dbenv->set_tx_recover(???) */</span> 00236 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m22">dbi_no_fsync</a>) { 00237 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR != 0) || (DB_VERSION_MAJOR == 4)</span> 00238 <span class="preprocessor"></span> xx = db_env_set_func_fsync(<a class="code" href="db3_8c.html#a4">db3_fsync_disable</a>); 00239 <span class="preprocessor">#else</span> 00240 <span class="preprocessor"></span> xx = dbenv->set_func_fsync(dbenv, <a class="code" href="db3_8c.html#a4">db3_fsync_disable</a>); 00241 <span class="preprocessor">#endif</span> 00242 <span class="preprocessor"></span> xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db_env_set_func_fsync"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00243 } 00244 00245 <span class="comment">/* XXX 3.3.4 change. */</span> 00246 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 3) || (DB_VERSION_MAJOR == 4)</span> 00247 <span class="preprocessor"></span> <span class="keywordflow">if</span> ((dbi-><a class="code" href="struct__dbiIndex.html#m5">dbi_ecflags</a> & DB_CLIENT) && dbi-><a class="code" href="struct__dbiIndex.html#m28">dbi_host</a>) { 00248 xx = dbenv->set_rpc_server(dbenv, NULL, dbi-><a class="code" href="struct__dbiIndex.html#m28">dbi_host</a>, 00249 dbi-><a class="code" href="struct__dbiIndex.html#m29">dbi_cl_timeout</a>, dbi-><a class="code" href="struct__dbiIndex.html#m30">dbi_sv_timeout</a>, 0); 00250 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->set_server"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00251 } 00252 <span class="preprocessor">#else</span> 00253 <span class="preprocessor"></span> <span class="keywordflow">if</span> ((dbi-><a class="code" href="struct__dbiIndex.html#m5">dbi_ecflags</a> & DB_CLIENT) && dbi-><a class="code" href="struct__dbiIndex.html#m28">dbi_host</a>) { 00254 xx = dbenv->set_server(dbenv, dbi-><a class="code" href="struct__dbiIndex.html#m28">dbi_host</a>, 00255 dbi-><a class="code" href="struct__dbiIndex.html#m29">dbi_cl_timeout</a>, dbi-><a class="code" href="struct__dbiIndex.html#m30">dbi_sv_timeout</a>, 0); 00256 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->set_server"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00257 } 00258 <span class="preprocessor">#endif</span> 00259 <span class="preprocessor"></span> <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m14">dbi_shmkey</a>) { 00260 xx = dbenv->set_shm_key(dbenv, dbi-><a class="code" href="struct__dbiIndex.html#m14">dbi_shmkey</a>); 00261 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->set_shm_key"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00262 } 00263 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m4">dbi_tmpdir</a>) { 00264 <span class="keyword">const</span> <span class="keywordtype">char</span> * root; 00265 <span class="keyword">const</span> <span class="keywordtype">char</span> * tmpdir; 00266 00267 root = (dbi-><a class="code" href="struct__dbiIndex.html#m0">dbi_root</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m0">dbi_root</a> : rpmdb-><a class="code" href="structrpmdb__s.html#m0">db_root</a>); 00268 <span class="keywordflow">if</span> ((root[0] == <span class="charliteral">'/'</span> && root[1] == <span class="charliteral">'\0'</span>) || rpmdb-><a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a>) 00269 root = NULL; 00270 <span class="comment">/*@-mods@*/</span> 00271 tmpdir = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(root, dbi-><a class="code" href="struct__dbiIndex.html#m4">dbi_tmpdir</a>, NULL); 00272 <span class="comment">/*@=mods@*/</span> 00273 xx = dbenv->set_tmp_dir(dbenv, tmpdir); 00274 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->set_tmp_dir"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00275 tmpdir = <a class="code" href="poptint_8h.html#a14">_free</a>(tmpdir); 00276 } 00277 } 00278 00279 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR != 0) || (DB_VERSION_MAJOR == 4)</span> 00280 <span class="preprocessor"></span> rc = dbenv->open(dbenv, dbhome, eflags, dbi-><a class="code" href="struct__dbiIndex.html#m13">dbi_perms</a>); 00281 <span class="preprocessor">#else</span> 00282 <span class="preprocessor"></span> rc = dbenv->open(dbenv, dbhome, NULL, eflags, dbi-><a class="code" href="struct__dbiIndex.html#m13">dbi_perms</a>); 00283 <span class="preprocessor">#endif</span> 00284 <span class="preprocessor"></span> rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->open"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00285 <span class="keywordflow">if</span> (rc) 00286 <span class="keywordflow">goto</span> errxit; 00287 00288 *dbenvp = dbenv; 00289 00290 <span class="keywordflow">return</span> 0; 00291 00292 errxit: 00293 <span class="keywordflow">if</span> (dbenv) { 00294 <span class="keywordtype">int</span> xx; 00295 xx = dbenv->close(dbenv, 0); 00296 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->close"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00297 } 00298 <span class="keywordflow">return</span> rc; 00299 } 00300 <span class="comment">/*@=moduncon@*/</span> 00301 <a name="l00302"></a><a class="code" href="db3_8c.html#a6">00302</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a6">db3sync</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00303 <span class="comment">/*@globals fileSystem @*/</span> 00304 <span class="comment">/*@modifies fileSystem @*/</span> 00305 { 00306 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a>; 00307 <span class="keywordtype">int</span> rc = 0; 00308 <span class="keywordtype">int</span> _printit; 00309 00310 <span class="keywordflow">if</span> (db != NULL) 00311 rc = db->sync(db, flags); 00312 <span class="comment">/* XXX DB_INCOMPLETE is returned occaisionally with multiple access. */</span> 00313 _printit = (rc == DB_INCOMPLETE ? 0 : <a class="code" href="db3_8c.html#a0">_debug</a>); 00314 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->sync"</span>, rc, _printit); 00315 <span class="keywordflow">return</span> rc; 00316 } 00317 <a name="l00318"></a><a class="code" href="db3_8c.html#a7">00318</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a7">db3c_del</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, u_int32_t flags) 00319 <span class="comment">/*@globals fileSystem @*/</span> 00320 <span class="comment">/*@modifies fileSystem @*/</span> 00321 { 00322 <span class="keywordtype">int</span> rc; 00323 00324 rc = dbcursor->c_del(dbcursor, flags); 00325 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbcursor->c_del"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00326 <span class="keywordflow">return</span> rc; 00327 } 00328 <a name="l00329"></a><a class="code" href="db3_8c.html#a8">00329</a> <span class="comment">/*@unused@*/</span> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a8">db3c_dup</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, <a class="code" href="rpmdb_8h.html#a2">DBC</a> ** dbcp, 00330 u_int32_t flags) 00331 <span class="comment">/*@globals fileSystem @*/</span> 00332 <span class="comment">/*@modifies *dbcp, fileSystem @*/</span> 00333 { 00334 <span class="keywordtype">int</span> rc; 00335 00336 <span class="keywordflow">if</span> (dbcp) *dbcp = NULL; 00337 rc = dbcursor->c_dup(dbcursor, dbcp, flags); 00338 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbcursor->c_dup"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00339 <span class="comment">/*@-nullstate @*/</span> <span class="comment">/* FIX: *dbcp can be NULL */</span> 00340 <span class="keywordflow">return</span> rc; 00341 <span class="comment">/*@=nullstate @*/</span> 00342 } 00343 <a name="l00344"></a><a class="code" href="db3_8c.html#a9">00344</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a9">db3c_get</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, 00345 DBT * key, DBT * data, u_int32_t flags) 00346 <span class="comment">/*@globals fileSystem @*/</span> 00347 <span class="comment">/*@modifies fileSystem @*/</span> 00348 { 00349 <span class="keywordtype">int</span> _printit; 00350 <span class="keywordtype">int</span> rc; 00351 <span class="keywordtype">int</span> rmw; 00352 00353 <span class="preprocessor">#ifdef NOTYET</span> 00354 <span class="preprocessor"></span> <span class="keywordflow">if</span> ((dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> & DB_INIT_CDB) && !(dbi-><a class="code" href="struct__dbiIndex.html#m9">dbi_oflags</a> & DB_RDONLY)) 00355 rmw = DB_RMW; 00356 <span class="keywordflow">else</span> 00357 <span class="preprocessor">#endif</span> 00358 <span class="preprocessor"></span> rmw = 0; 00359 00360 rc = dbcursor->c_get(dbcursor, key, data, rmw | flags); 00361 00362 <span class="comment">/* XXX DB_NOTFOUND can be returned */</span> 00363 _printit = (rc == DB_NOTFOUND ? 0 : <a class="code" href="db3_8c.html#a0">_debug</a>); 00364 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbcursor->c_get"</span>, rc, _printit); 00365 <span class="keywordflow">return</span> rc; 00366 } 00367 <a name="l00368"></a><a class="code" href="db3_8c.html#a10">00368</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a10">db3c_put</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, 00369 DBT * key, DBT * data, u_int32_t flags) 00370 <span class="comment">/*@globals fileSystem @*/</span> 00371 <span class="comment">/*@modifies fileSystem @*/</span> 00372 { 00373 <span class="keywordtype">int</span> rc; 00374 00375 rc = dbcursor->c_put(dbcursor, key, data, flags); 00376 00377 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbcursor->c_put"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00378 <span class="keywordflow">return</span> rc; 00379 } 00380 <a name="l00381"></a><a class="code" href="db3_8c.html#a11">00381</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a11">db3c_close</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor) 00382 <span class="comment">/*@globals fileSystem @*/</span> 00383 <span class="comment">/*@modifies fileSystem @*/</span> 00384 { 00385 <span class="keywordtype">int</span> rc; 00386 00387 <span class="keywordflow">if</span> (dbcursor == NULL) <span class="keywordflow">return</span> -2; 00388 00389 rc = dbcursor->c_close(dbcursor); 00390 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbcursor->c_close"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00391 <span class="keywordflow">return</span> rc; 00392 } 00393 <a name="l00394"></a><a class="code" href="db3_8c.html#a12">00394</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a12">db3c_open</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="comment">/*@null@*/</span> <span class="comment">/*@out@*/</span> <a class="code" href="rpmdb_8h.html#a2">DBC</a> ** dbcp, 00395 <span class="keywordtype">int</span> dbiflags) 00396 <span class="comment">/*@globals fileSystem @*/</span> 00397 <span class="comment">/*@modifies *dbcp, fileSystem @*/</span> 00398 { 00399 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a>; 00400 DB_TXN * txnid = NULL; 00401 <span class="keywordtype">int</span> flags; 00402 <span class="keywordtype">int</span> rc; 00403 00404 <span class="keywordflow">if</span> (db == NULL) <span class="keywordflow">return</span> -2; 00405 <span class="keywordflow">if</span> ((dbiflags & <a class="code" href="rpmdb_8h.html#a5">DBI_WRITECURSOR</a>) && 00406 (dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> & DB_INIT_CDB) && !(dbi-><a class="code" href="struct__dbiIndex.html#m9">dbi_oflags</a> & DB_RDONLY)) 00407 { 00408 flags = DB_WRITECURSOR; 00409 } <span class="keywordflow">else</span> 00410 flags = 0; 00411 <span class="keywordflow">if</span> (dbcp) *dbcp = NULL; 00412 rc = db->cursor(db, txnid, dbcp, flags); 00413 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db3c_open"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00414 00415 <span class="keywordflow">return</span> rc; 00416 } 00417 <a name="l00418"></a><a class="code" href="db3_8c.html#a13">00418</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a13">db3cclose</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, 00419 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00420 <span class="comment">/*@globals fileSystem @*/</span> 00421 <span class="comment">/*@modifies dbi, fileSystem @*/</span> 00422 { 00423 <span class="keywordtype">int</span> rc = 0; 00424 00425 <span class="comment">/* XXX per-iterator cursors */</span> 00426 <span class="keywordflow">if</span> (flags & <a class="code" href="rpmdb_8h.html#a6">DBI_ITERATOR</a>) 00427 <span class="keywordflow">return</span> <a class="code" href="db3_8c.html#a11">db3c_close</a>(dbi, dbcursor); 00428 00429 <span class="keywordflow">if</span> (!dbi-><a class="code" href="struct__dbiIndex.html#m18">dbi_use_cursors</a>) 00430 <span class="keywordflow">return</span> 0; 00431 00432 <span class="comment">/*@-branchstate@*/</span> 00433 <span class="keywordflow">if</span> (dbcursor == NULL) 00434 dbcursor = dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a>; 00435 <span class="comment">/*@=branchstate@*/</span> 00436 <span class="keywordflow">if</span> (dbcursor) { 00437 <span class="comment">/*@-branchstate@*/</span> 00438 <span class="keywordflow">if</span> (dbcursor == dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a>) 00439 dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a> = NULL; 00440 <span class="comment">/*@=branchstate@*/</span> 00441 rc = <a class="code" href="db3_8c.html#a11">db3c_close</a>(dbi, dbcursor); 00442 } 00443 <span class="comment">/*@-usereleased -compdef@*/</span> <span class="keywordflow">return</span> rc; <span class="comment">/*@=usereleased =compdef@*/</span> 00444 } 00445 <a name="l00446"></a><a class="code" href="db3_8c.html#a14">00446</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a14">db3copen</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, 00447 <span class="comment">/*@null@*/</span> <span class="comment">/*@out@*/</span> <a class="code" href="rpmdb_8h.html#a2">DBC</a> ** dbcp, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00448 <span class="comment">/*@globals fileSystem @*/</span> 00449 <span class="comment">/*@modifies dbi, *dbcp, fileSystem @*/</span> 00450 { 00451 <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor; 00452 <span class="keywordtype">int</span> rc = 0; 00453 00454 <span class="comment">/* XXX per-iterator cursors */</span> 00455 <span class="keywordflow">if</span> (flags & <a class="code" href="rpmdb_8h.html#a6">DBI_ITERATOR</a>) 00456 <span class="keywordflow">return</span> <a class="code" href="db3_8c.html#a12">db3c_open</a>(dbi, dbcp, flags); 00457 00458 <span class="keywordflow">if</span> (!dbi-><a class="code" href="struct__dbiIndex.html#m18">dbi_use_cursors</a>) { 00459 <span class="keywordflow">if</span> (dbcp) *dbcp = NULL; 00460 <span class="keywordflow">return</span> 0; 00461 } 00462 00463 <span class="keywordflow">if</span> ((dbcursor = dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a>) == NULL) { 00464 <span class="keywordflow">if</span> ((rc = <a class="code" href="db3_8c.html#a12">db3c_open</a>(dbi, &dbcursor, flags)) == 0) 00465 dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a> = dbcursor; 00466 } 00467 00468 <span class="keywordflow">if</span> (dbcp) 00469 <span class="comment">/*@-onlytrans@*/</span> *dbcp = dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a>; <span class="comment">/*@=onlytrans@*/</span> 00470 00471 <span class="keywordflow">return</span> rc; 00472 } 00473 <a name="l00474"></a><a class="code" href="db3_8c.html#a15">00474</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a15">db3cput</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, 00475 <span class="keyword">const</span> <span class="keywordtype">void</span> * keyp, size_t keylen, 00476 <span class="keyword">const</span> <span class="keywordtype">void</span> * datap, size_t datalen, 00477 <span class="comment">/*@unused@*/</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00478 <span class="comment">/*@globals fileSystem @*/</span> 00479 <span class="comment">/*@modifies fileSystem @*/</span> 00480 { 00481 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a>; 00482 DB_TXN * txnid = NULL; 00483 DBT key, data; 00484 <span class="keywordtype">int</span> rc; 00485 00486 memset(&key, 0, <span class="keyword">sizeof</span>(key)); 00487 memset(&data, 0, <span class="keyword">sizeof</span>(data)); 00488 key.data = (<span class="keywordtype">void</span> *)keyp; 00489 key.size = keylen; 00490 data.data = (<span class="keywordtype">void</span> *)datap; 00491 data.size = datalen; 00492 00493 <span class="keywordflow">if</span> (dbcursor == NULL) { 00494 <span class="keywordflow">if</span> (db == NULL) <span class="keywordflow">return</span> -2; 00495 rc = db->put(db, txnid, &key, &data, 0); 00496 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->put"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00497 } <span class="keywordflow">else</span> { 00498 00499 rc = <a class="code" href="db3_8c.html#a10">db3c_put</a>(dbi, dbcursor, &key, &data, DB_KEYLAST); 00500 00501 } 00502 00503 <span class="keywordflow">return</span> rc; 00504 } 00505 <a name="l00506"></a><a class="code" href="db3_8c.html#a16">00506</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a16">db3cdel</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, 00507 <span class="keyword">const</span> <span class="keywordtype">void</span> * keyp, size_t keylen, 00508 <span class="comment">/*@unused@*/</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00509 <span class="comment">/*@globals fileSystem @*/</span> 00510 <span class="comment">/*@modifies fileSystem @*/</span> 00511 { 00512 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a>; 00513 DB_TXN * txnid = NULL; 00514 DBT key, data; 00515 <span class="keywordtype">int</span> rc; 00516 00517 memset(&key, 0, <span class="keyword">sizeof</span>(key)); 00518 memset(&data, 0, <span class="keyword">sizeof</span>(data)); 00519 00520 key.data = (<span class="keywordtype">void</span> *)keyp; 00521 key.size = keylen; 00522 00523 <span class="keywordflow">if</span> (dbcursor == NULL) { 00524 <span class="keywordflow">if</span> (db == NULL) <span class="keywordflow">return</span> -2; 00525 rc = db->del(db, txnid, &key, 0); 00526 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->del"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00527 } <span class="keywordflow">else</span> { 00528 00529 rc = <a class="code" href="db3_8c.html#a9">db3c_get</a>(dbi, dbcursor, &key, &data, DB_SET); 00530 00531 <span class="keywordflow">if</span> (rc == 0) { 00532 <span class="comment">/* XXX TODO: loop over duplicates */</span> 00533 rc = <a class="code" href="db3_8c.html#a7">db3c_del</a>(dbi, dbcursor, 0); 00534 } 00535 00536 } 00537 00538 <span class="keywordflow">return</span> rc; 00539 } 00540 <a name="l00541"></a><a class="code" href="db3_8c.html#a17">00541</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a17">db3cget</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, 00542 <span class="comment">/*@null@*/</span> <span class="keywordtype">void</span> ** keyp, <span class="comment">/*@null@*/</span> size_t * keylen, 00543 <span class="comment">/*@null@*/</span> <span class="keywordtype">void</span> ** datap, <span class="comment">/*@null@*/</span> size_t * datalen, 00544 <span class="comment">/*@unused@*/</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00545 <span class="comment">/*@globals fileSystem @*/</span> 00546 <span class="comment">/*@modifies *keyp, *keylen, *datap, *datalen, fileSystem @*/</span> 00547 { 00548 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a>; 00549 DB_TXN * txnid = NULL; 00550 DBT key, data; 00551 <span class="keywordtype">int</span> rc; 00552 00553 memset(&key, 0, <span class="keyword">sizeof</span>(key)); 00554 memset(&data, 0, <span class="keyword">sizeof</span>(data)); 00555 <span class="comment">/*@-unqualifiedtrans@*/</span> 00556 <span class="keywordflow">if</span> (keyp) key.data = *keyp; 00557 <span class="keywordflow">if</span> (keylen) key.size = *keylen; 00558 <span class="keywordflow">if</span> (datap) data.data = *datap; 00559 <span class="keywordflow">if</span> (datalen) data.size = *datalen; 00560 <span class="comment">/*@=unqualifiedtrans@*/</span> 00561 00562 <span class="keywordflow">if</span> (dbcursor == NULL) { 00563 <span class="keywordtype">int</span> _printit; 00564 <span class="comment">/*@-compmempass@*/</span> 00565 <span class="keywordflow">if</span> (db == NULL) <span class="keywordflow">return</span> -2; 00566 <span class="comment">/*@=compmempass@*/</span> 00567 rc = db->get(db, txnid, &key, &data, 0); 00568 <span class="comment">/* XXX DB_NOTFOUND can be returned */</span> 00569 _printit = (rc == DB_NOTFOUND ? 0 : <a class="code" href="db3_8c.html#a0">_debug</a>); 00570 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->get"</span>, rc, _printit); 00571 } <span class="keywordflow">else</span> { 00572 00573 <span class="comment">/* XXX db3 does DB_FIRST on uninitialized cursor */</span> 00574 rc = <a class="code" href="db3_8c.html#a9">db3c_get</a>(dbi, dbcursor, &key, &data, 00575 key.data == NULL ? DB_NEXT : DB_SET); 00576 00577 } 00578 00579 <span class="keywordflow">if</span> (rc == 0) { 00580 <span class="comment">/*@-onlytrans@*/</span> 00581 <span class="keywordflow">if</span> (keyp) *keyp = key.data; 00582 <span class="keywordflow">if</span> (keylen) *keylen = key.size; 00583 <span class="keywordflow">if</span> (datap) *datap = data.data; 00584 <span class="keywordflow">if</span> (datalen) *datalen = data.size; 00585 <span class="comment">/*@=onlytrans@*/</span> 00586 } 00587 00588 <span class="comment">/*@-compmempass -nullstate@*/</span> 00589 <span class="keywordflow">return</span> rc; 00590 <span class="comment">/*@=compmempass =nullstate@*/</span> 00591 } 00592 <a name="l00593"></a><a class="code" href="db3_8c.html#a18">00593</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a18">db3ccount</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor, 00594 <span class="comment">/*@null@*/</span> <span class="comment">/*@out@*/</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> * countp, 00595 <span class="comment">/*@unused@*/</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00596 <span class="comment">/*@globals fileSystem @*/</span> 00597 <span class="comment">/*@modifies *countp, fileSystem @*/</span> 00598 { 00599 db_recno_t count = 0; 00600 <span class="keywordtype">int</span> rc = 0; 00601 00602 flags = 0; 00603 rc = dbcursor->c_count(dbcursor, &count, flags); 00604 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbcursor->c_count"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00605 <span class="keywordflow">if</span> (rc) <span class="keywordflow">return</span> rc; 00606 <span class="keywordflow">if</span> (countp) *countp = count; 00607 00608 <span class="keywordflow">return</span> rc; 00609 } 00610 <a name="l00611"></a><a class="code" href="db3_8c.html#a19">00611</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a19">db3byteswapped</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi) <span class="comment">/*@*/</span> 00612 { 00613 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a>; 00614 <span class="keywordtype">int</span> rc = 0; 00615 00616 <span class="keywordflow">if</span> (db != NULL) { 00617 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 3 && DB_VERSION_PATCH == 11) \</span> 00618 <span class="preprocessor"> || (DB_VERSION_MAJOR == 4)</span> 00619 <span class="preprocessor"></span> <span class="keywordtype">int</span> isswapped = 0; 00620 rc = db->get_byteswapped(db, &isswapped); 00621 <span class="keywordflow">if</span> (rc == 0) 00622 rc = isswapped; 00623 <span class="preprocessor">#else</span> 00624 <span class="preprocessor"></span> rc = db->get_byteswapped(db); 00625 <span class="preprocessor">#endif</span> 00626 <span class="preprocessor"></span> } 00627 00628 <span class="keywordflow">return</span> rc; 00629 } 00630 <a name="l00631"></a><a class="code" href="db3_8c.html#a20">00631</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a20">db3stat</a>(<a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00632 <span class="comment">/*@globals fileSystem @*/</span> 00633 <span class="comment">/*@modifies dbi, fileSystem @*/</span> 00634 { 00635 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a>; 00636 <span class="keywordtype">int</span> rc = 0; 00637 00638 <span class="keywordflow">if</span> (db == NULL) <span class="keywordflow">return</span> -2; 00639 <span class="preprocessor">#if defined(DB_FAST_STAT)</span> 00640 <span class="preprocessor"></span> <span class="keywordflow">if</span> (flags) 00641 flags = DB_FAST_STAT; 00642 <span class="keywordflow">else</span> 00643 <span class="preprocessor">#endif</span> 00644 <span class="preprocessor"></span> flags = 0; 00645 dbi-><a class="code" href="struct__dbiIndex.html#m72">dbi_stats</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(dbi-><a class="code" href="struct__dbiIndex.html#m72">dbi_stats</a>); 00646 <span class="comment">/* XXX 3.3.4 change. */</span> 00647 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 3) || (DB_VERSION_MAJOR == 4)</span> 00648 <span class="preprocessor"></span> rc = db->stat(db, &dbi-><a class="code" href="struct__dbiIndex.html#m72">dbi_stats</a>, flags); 00649 <span class="preprocessor">#else</span> 00650 <span class="preprocessor"></span> rc = db->stat(db, &dbi-><a class="code" href="struct__dbiIndex.html#m72">dbi_stats</a>, NULL, flags); 00651 <span class="preprocessor">#endif</span> 00652 <span class="preprocessor"></span> rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->stat"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00653 <span class="keywordflow">return</span> rc; 00654 } 00655 00656 <span class="comment">/*@-moduncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> <a name="l00657"></a><a class="code" href="db3_8c.html#a21">00657</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a21">db3close</a>(<span class="comment">/*@only@*/</span> <a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi, <span class="comment">/*@unused@*/</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags) 00658 <span class="comment">/*@globals rpmGlobalMacroContext,</span> 00659 <span class="comment"> fileSystem @*/</span> 00660 <span class="comment">/*@modifies dbi, fileSystem @*/</span> 00661 { 00662 <a class="code" href="structrpmdb__s.html">rpmdb</a> <a class="code" href="structrpmdb__s.html">rpmdb</a> = dbi-><a class="code" href="struct__dbiIndex.html#m66">dbi_rpmdb</a>; 00663 <span class="keyword">const</span> <span class="keywordtype">char</span> * urlfn = NULL; 00664 <span class="keyword">const</span> <span class="keywordtype">char</span> * root; 00665 <span class="keyword">const</span> <span class="keywordtype">char</span> * home; 00666 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbhome; 00667 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbfile; 00668 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbsubfile; 00669 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a>; 00670 <span class="keywordtype">int</span> rc = 0, xx; 00671 00672 flags = 0; <span class="comment">/* XXX unused */</span> 00673 00674 <span class="comment">/*</span> 00675 <span class="comment"> * Get the prefix/root component and directory path.</span> 00676 <span class="comment"> */</span> 00677 root = (dbi-><a class="code" href="struct__dbiIndex.html#m0">dbi_root</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m0">dbi_root</a> : rpmdb-><a class="code" href="structrpmdb__s.html#m0">db_root</a>); 00678 <span class="keywordflow">if</span> ((root[0] == <span class="charliteral">'/'</span> && root[1] == <span class="charliteral">'\0'</span>) || rpmdb-><a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a>) 00679 root = NULL; 00680 home = (dbi-><a class="code" href="struct__dbiIndex.html#m1">dbi_home</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m1">dbi_home</a> : rpmdb-><a class="code" href="structrpmdb__s.html#m1">db_home</a>); 00681 00682 <span class="comment">/*</span> 00683 <span class="comment"> * Either the root or directory components may be a URL. Concatenate,</span> 00684 <span class="comment"> * convert the URL to a path, and add the name of the file.</span> 00685 <span class="comment"> */</span> 00686 <span class="comment">/*@-mods@*/</span> 00687 urlfn = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(root, home, NULL); 00688 <span class="comment">/*@=mods@*/</span> 00689 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(urlfn, &dbhome); 00690 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m25">dbi_temporary</a>) { 00691 dbfile = NULL; 00692 dbsubfile = NULL; 00693 } <span class="keywordflow">else</span> { 00694 <span class="preprocessor">#ifdef HACK </span><span class="comment">/* XXX necessary to support dbsubfile */</span> 00695 dbfile = (dbi-><a class="code" href="struct__dbiIndex.html#m2">dbi_file</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m2">dbi_file</a> : db3basename); 00696 dbsubfile = (dbi-><a class="code" href="struct__dbiIndex.html#m3">dbi_subfile</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m3">dbi_subfile</a> : <a class="code" href="tagName_8c.html#a0">tagName</a>(dbi-><a class="code" href="struct__dbiIndex.html#m67">dbi_rpmtag</a>)); 00697 <span class="preprocessor">#else</span> 00698 <span class="preprocessor"></span> dbfile = (dbi-><a class="code" href="struct__dbiIndex.html#m2">dbi_file</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m2">dbi_file</a> : <a class="code" href="tagName_8c.html#a0">tagName</a>(dbi-><a class="code" href="struct__dbiIndex.html#m67">dbi_rpmtag</a>)); 00699 dbsubfile = NULL; 00700 <span class="preprocessor">#endif</span> 00701 <span class="preprocessor"></span> } 00702 00703 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a>) 00704 rc = <a class="code" href="db3_8c.html#a13">db3cclose</a>(dbi, NULL, 0); 00705 00706 <span class="keywordflow">if</span> (db) { 00707 rc = db->close(db, 0); 00708 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->close"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00709 db = dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a> = NULL; 00710 00711 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"closed db index %s/%s\n"</span>), 00712 dbhome, (dbfile ? dbfile : <a class="code" href="tagName_8c.html#a0">tagName</a>(dbi-><a class="code" href="struct__dbiIndex.html#m67">dbi_rpmtag</a>))); 00713 00714 } 00715 00716 <span class="keywordflow">if</span> (rpmdb-><a class="code" href="structrpmdb__s.html#m16">db_dbenv</a> != NULL && dbi-><a class="code" href="struct__dbiIndex.html#m19">dbi_use_dbenv</a>) { 00717 <span class="keywordflow">if</span> (rpmdb-><a class="code" href="structrpmdb__s.html#m15">db_opens</a> == 1) { 00718 <span class="comment">/*@-nullstate@*/</span> 00719 xx = <a class="code" href="db3_8c.html#a3">db_fini</a>(dbi, (dbhome ? dbhome : <span class="stringliteral">""</span>), dbfile, dbsubfile); 00720 <span class="comment">/*@=nullstate@*/</span> 00721 rpmdb-><a class="code" href="structrpmdb__s.html#m16">db_dbenv</a> = NULL; 00722 } 00723 rpmdb-><a class="code" href="structrpmdb__s.html#m15">db_opens</a>--; 00724 } 00725 00726 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m16">dbi_verify_on_close</a> && !dbi-><a class="code" href="struct__dbiIndex.html#m25">dbi_temporary</a>) { 00727 <a class="code" href="rpmdb_8h.html#a1">DB_ENV</a> * dbenv = NULL; 00728 00729 <span class="comment">/*@-moduncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> 00730 rc = db_env_create(&dbenv, 0); 00731 <span class="comment">/*@=moduncon@*/</span> 00732 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db_env_create"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00733 <span class="keywordflow">if</span> (rc || dbenv == NULL) <span class="keywordflow">goto</span> exit; 00734 00735 <span class="comment">/*@-noeffectuncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> 00736 dbenv->set_errcall(dbenv, rpmdb-><a class="code" href="structrpmdb__s.html#m10">db_errcall</a>); 00737 dbenv->set_errfile(dbenv, rpmdb-><a class="code" href="structrpmdb__s.html#m11">db_errfile</a>); 00738 dbenv->set_errpfx(dbenv, rpmdb-><a class="code" href="structrpmdb__s.html#m6">db_errpfx</a>); 00739 <span class="comment">/* dbenv->set_paniccall(???) */</span> 00740 <span class="comment">/*@=noeffectuncon@*/</span> 00741 xx = dbenv->set_verbose(dbenv, DB_VERB_CHKPOINT, 00742 (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a> & DB_VERB_CHKPOINT)); 00743 xx = dbenv->set_verbose(dbenv, DB_VERB_DEADLOCK, 00744 (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a> & DB_VERB_DEADLOCK)); 00745 xx = dbenv->set_verbose(dbenv, DB_VERB_RECOVERY, 00746 (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a> & DB_VERB_RECOVERY)); 00747 xx = dbenv->set_verbose(dbenv, DB_VERB_WAITSFOR, 00748 (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a> & DB_VERB_WAITSFOR)); 00749 00750 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m4">dbi_tmpdir</a>) { 00751 <span class="comment">/*@-mods@*/</span> 00752 <span class="keyword">const</span> <span class="keywordtype">char</span> * tmpdir = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(root, dbi-><a class="code" href="struct__dbiIndex.html#m4">dbi_tmpdir</a>, NULL); 00753 <span class="comment">/*@=mods@*/</span> 00754 rc = dbenv->set_tmp_dir(dbenv, tmpdir); 00755 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->set_tmp_dir"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00756 tmpdir = <a class="code" href="poptint_8h.html#a14">_free</a>(tmpdir); 00757 <span class="keywordflow">if</span> (rc) <span class="keywordflow">goto</span> exit; 00758 } 00759 00760 rc = dbenv->open(dbenv, dbhome, 00761 DB_CREATE | DB_INIT_MPOOL | DB_PRIVATE | DB_USE_ENVIRON, 0); 00762 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->open"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00763 <span class="keywordflow">if</span> (rc) <span class="keywordflow">goto</span> exit; 00764 00765 <span class="comment">/*@-moduncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> 00766 rc = db_create(&db, dbenv, 0); 00767 <span class="comment">/*@=moduncon@*/</span> 00768 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db_create"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00769 00770 <span class="keywordflow">if</span> (db != NULL) { 00771 <span class="comment">/*@-mods@*/</span> 00772 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbf = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(dbhome, <span class="stringliteral">"/"</span>, dbfile, NULL); 00773 <span class="comment">/*@=mods@*/</span> 00774 00775 rc = db->verify(db, dbf, NULL, NULL, flags); 00776 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->verify"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 00777 00778 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"verified db index %s/%s\n"</span>), 00779 (dbhome ? dbhome : <span class="stringliteral">""</span>), 00780 (dbfile ? dbfile : <a class="code" href="tagName_8c.html#a0">tagName</a>(dbi-><a class="code" href="struct__dbiIndex.html#m67">dbi_rpmtag</a>))); 00781 00782 xx = db->close(db, 0); 00783 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->close"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00784 db = NULL; 00785 <span class="keywordflow">if</span> (rc == 0 && xx) rc = xx; 00786 00787 dbf = <a class="code" href="poptint_8h.html#a14">_free</a>(dbf); 00788 } 00789 xx = dbenv->close(dbenv, 0); 00790 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"dbenv->close"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 00791 <span class="keywordflow">if</span> (rc == 0 && xx) rc = xx; 00792 } 00793 00794 exit: 00795 dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a> = NULL; 00796 00797 urlfn = <a class="code" href="poptint_8h.html#a14">_free</a>(urlfn); 00798 00799 dbi = <a class="code" href="group__db3.html#a3">db3Free</a>(dbi); 00800 00801 <span class="keywordflow">return</span> rc; 00802 } 00803 <span class="comment">/*@=moduncon@*/</span> 00804 <a name="l00805"></a><a class="code" href="db3_8c.html#a22">00805</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="db3_8c.html#a22">db3open</a>(<span class="comment">/*@keep@*/</span> <a class="code" href="structrpmdb__s.html">rpmdb</a> <a class="code" href="structrpmdb__s.html">rpmdb</a>, <span class="keywordtype">int</span> rpmtag, <a class="code" href="struct__dbiIndex.html">dbiIndex</a> * dbip) 00806 <span class="comment">/*@globals rpmGlobalMacroContext,</span> 00807 <span class="comment"> fileSystem @*/</span> 00808 <span class="comment">/*@modifies *dbip, fileSystem @*/</span> 00809 { 00810 <span class="comment">/*@-nestedextern@*/</span> 00811 <span class="keyword">extern</span> <span class="keyword">struct </span><a class="code" href="struct__dbiVec.html">_dbiVec</a> db3vec; 00812 <span class="comment">/*@=nestedextern@*/</span> 00813 <span class="keyword">const</span> <span class="keywordtype">char</span> * urlfn = NULL; 00814 <span class="keyword">const</span> <span class="keywordtype">char</span> * root; 00815 <span class="keyword">const</span> <span class="keywordtype">char</span> * home; 00816 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbhome; 00817 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbfile; 00818 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbsubfile; 00819 <a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi = NULL; 00820 <span class="keywordtype">int</span> rc = 0; 00821 <span class="keywordtype">int</span> xx; 00822 00823 <a class="code" href="rpmdb_8h.html#a0">DB</a> * db = NULL; 00824 <a class="code" href="rpmdb_8h.html#a1">DB_ENV</a> * dbenv = NULL; 00825 DB_TXN * txnid = NULL; 00826 u_int32_t oflags; 00827 <span class="keywordtype">int</span> _printit; 00828 00829 <span class="keywordflow">if</span> (dbip) 00830 *dbip = NULL; 00831 00832 <span class="comment">/*</span> 00833 <span class="comment"> * Parse db configuration parameters.</span> 00834 <span class="comment"> */</span> 00835 <span class="comment">/*@-mods@*/</span> 00836 <span class="keywordflow">if</span> ((dbi = <a class="code" href="group__db3.html#a2">db3New</a>(rpmdb, rpmtag)) == NULL) 00837 <span class="comment">/*@-nullstate@*/</span> 00838 <span class="keywordflow">return</span> 1; 00839 <span class="comment">/*@=nullstate@*/</span> 00840 <span class="comment">/*@=mods@*/</span> 00841 dbi-><a class="code" href="struct__dbiIndex.html#m15">dbi_api</a> = <a class="code" href="db1_8c.html#a1">DB_VERSION_MAJOR</a>; 00842 00843 <span class="comment">/*</span> 00844 <span class="comment"> * Get the prefix/root component and directory path.</span> 00845 <span class="comment"> */</span> 00846 root = (dbi-><a class="code" href="struct__dbiIndex.html#m0">dbi_root</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m0">dbi_root</a> : rpmdb-><a class="code" href="structrpmdb__s.html#m0">db_root</a>); 00847 <span class="keywordflow">if</span> ((root[0] == <span class="charliteral">'/'</span> && root[1] == <span class="charliteral">'\0'</span>) || rpmdb-><a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a>) 00848 root = NULL; 00849 home = (dbi-><a class="code" href="struct__dbiIndex.html#m1">dbi_home</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m1">dbi_home</a> : rpmdb-><a class="code" href="structrpmdb__s.html#m1">db_home</a>); 00850 00851 <span class="comment">/*</span> 00852 <span class="comment"> * Either the root or directory components may be a URL. Concatenate,</span> 00853 <span class="comment"> * convert the URL to a path, and add the name of the file.</span> 00854 <span class="comment"> */</span> 00855 <span class="comment">/*@-mods@*/</span> 00856 urlfn = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(root, home, NULL); 00857 <span class="comment">/*@=mods@*/</span> 00858 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(urlfn, &dbhome); 00859 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m25">dbi_temporary</a>) { 00860 dbfile = NULL; 00861 dbsubfile = NULL; 00862 } <span class="keywordflow">else</span> { 00863 <span class="preprocessor">#ifdef HACK </span><span class="comment">/* XXX necessary to support dbsubfile */</span> 00864 dbfile = (dbi-><a class="code" href="struct__dbiIndex.html#m2">dbi_file</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m2">dbi_file</a> : db3basename); 00865 dbsubfile = (dbi-><a class="code" href="struct__dbiIndex.html#m3">dbi_subfile</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m3">dbi_subfile</a> : <a class="code" href="tagName_8c.html#a0">tagName</a>(dbi-><a class="code" href="struct__dbiIndex.html#m67">dbi_rpmtag</a>)); 00866 <span class="preprocessor">#else</span> 00867 <span class="preprocessor"></span> dbfile = (dbi-><a class="code" href="struct__dbiIndex.html#m2">dbi_file</a> ? dbi-><a class="code" href="struct__dbiIndex.html#m2">dbi_file</a> : <a class="code" href="tagName_8c.html#a0">tagName</a>(dbi-><a class="code" href="struct__dbiIndex.html#m67">dbi_rpmtag</a>)); 00868 dbsubfile = NULL; 00869 <span class="preprocessor">#endif</span> 00870 <span class="preprocessor"></span> } 00871 00872 oflags = (dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> | dbi-><a class="code" href="struct__dbiIndex.html#m9">dbi_oflags</a>); 00873 oflags &= ~DB_TRUNCATE; <span class="comment">/* XXX this is dangerous */</span> 00874 00875 <span class="preprocessor">#if 0 </span><span class="comment">/* XXX rpmdb: illegal flag combination specified to DB->open */</span> 00876 <span class="keywordflow">if</span> ( dbi-><a class="code" href="struct__dbiIndex.html#m12">dbi_mode</a> & O_EXCL) oflags |= DB_EXCL; 00877 <span class="preprocessor">#endif</span> 00878 <span class="preprocessor"></span> 00879 <span class="comment">/*</span> 00880 <span class="comment"> * Map open mode flags onto configured database/environment flags.</span> 00881 <span class="comment"> */</span> 00882 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m25">dbi_temporary</a>) { 00883 oflags |= DB_CREATE; 00884 dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> |= DB_CREATE; 00885 oflags &= ~DB_RDONLY; 00886 dbi-><a class="code" href="struct__dbiIndex.html#m9">dbi_oflags</a> &= ~DB_RDONLY; 00887 } <span class="keywordflow">else</span> { 00888 <span class="keywordflow">if</span> (!(dbi-><a class="code" href="struct__dbiIndex.html#m12">dbi_mode</a> & (O_RDWR|O_WRONLY))) oflags |= DB_RDONLY; 00889 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m12">dbi_mode</a> & O_CREAT) { 00890 oflags |= DB_CREATE; 00891 dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> |= DB_CREATE; 00892 } 00893 <span class="preprocessor">#ifdef DANGEROUS</span> 00894 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( dbi-><a class="code" href="struct__dbiIndex.html#m12">dbi_mode</a> & O_TRUNC) oflags |= DB_TRUNCATE; 00895 <span class="preprocessor">#endif</span> 00896 <span class="preprocessor"></span> } 00897 00898 <span class="comment">/*</span> 00899 <span class="comment"> * Avoid incompatible DB_CREATE/DB_RDONLY flags on DBENV->open.</span> 00900 <span class="comment"> */</span> 00901 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m19">dbi_use_dbenv</a>) { 00902 <span class="keywordflow">if</span> (access(dbhome, <a class="code" href="system_8h.html#a9">W_OK</a>) == -1) { 00903 00904 <span class="comment">/* dbhome is unwritable, don't attempt DB_CREATE on DB->open ... */</span> 00905 oflags &= ~DB_CREATE; 00906 00907 <span class="comment">/* ... but DBENV->open might still need DB_CREATE ... */</span> 00908 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> & DB_PRIVATE) { 00909 dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> &= ~DB_JOINENV; 00910 } <span class="keywordflow">else</span> { 00911 dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> |= DB_JOINENV; 00912 dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> &= ~DB_CREATE; 00913 dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> &= ~DB_THREAD; 00914 <span class="comment">/* ... but, unless DB_PRIVATE is used, skip DBENV. */</span> 00915 dbi-><a class="code" href="struct__dbiIndex.html#m19">dbi_use_dbenv</a> = 0; 00916 } 00917 00918 <span class="comment">/* ... DB_RDONLY maps dbhome perms across files ... */</span> 00919 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m25">dbi_temporary</a>) { 00920 oflags |= DB_CREATE; 00921 dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> |= DB_CREATE; 00922 oflags &= ~DB_RDONLY; 00923 dbi-><a class="code" href="struct__dbiIndex.html#m9">dbi_oflags</a> &= ~DB_RDONLY; 00924 } <span class="keywordflow">else</span> { 00925 oflags |= DB_RDONLY; 00926 <span class="comment">/* ... and DB_WRITECURSOR won't be needed ... */</span> 00927 dbi-><a class="code" href="struct__dbiIndex.html#m9">dbi_oflags</a> |= DB_RDONLY; 00928 } 00929 00930 } <span class="keywordflow">else</span> { <span class="comment">/* dbhome is writable, check for persistent dbenv. */</span> 00931 <span class="comment">/*@-mods@*/</span> 00932 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbf = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(dbhome, <span class="stringliteral">"/__db.001"</span>, NULL); 00933 <span class="comment">/*@=mods@*/</span> 00934 00935 <span class="keywordflow">if</span> (access(dbf, <a class="code" href="system_8h.html#a7">F_OK</a>) == -1) { 00936 <span class="comment">/* ... non-existent (or unwritable) DBENV, will create ... */</span> 00937 dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> |= DB_CREATE; 00938 dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> &= ~DB_JOINENV; 00939 } <span class="keywordflow">else</span> { 00940 <span class="comment">/* ... pre-existent (or bogus) DBENV, will join ... */</span> 00941 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> & DB_PRIVATE) { 00942 dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> &= ~DB_JOINENV; 00943 } <span class="keywordflow">else</span> { 00944 dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> |= DB_JOINENV; 00945 dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> &= ~DB_CREATE; 00946 dbi-><a class="code" href="struct__dbiIndex.html#m7">dbi_oeflags</a> &= ~DB_THREAD; 00947 } 00948 } 00949 dbf = <a class="code" href="poptint_8h.html#a14">_free</a>(dbf); 00950 } 00951 } 00952 00953 <span class="comment">/*</span> 00954 <span class="comment"> * Avoid incompatible DB_CREATE/DB_RDONLY flags on DB->open.</span> 00955 <span class="comment"> */</span> 00956 <span class="keywordflow">if</span> ((oflags & DB_CREATE) && (oflags & DB_RDONLY)) { 00957 <span class="comment">/* dbhome is writable, and DB->open flags may conflict. */</span> 00958 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbfn = (dbfile ? dbfile : <a class="code" href="tagName_8c.html#a0">tagName</a>(dbi-><a class="code" href="struct__dbiIndex.html#m67">dbi_rpmtag</a>)); 00959 <span class="comment">/*@-mods@*/</span> 00960 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbf = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(dbhome, <span class="stringliteral">"/"</span>, dbfn, NULL); 00961 <span class="comment">/*@=mods@*/</span> 00962 00963 <span class="keywordflow">if</span> (access(dbf, <a class="code" href="system_8h.html#a7">F_OK</a>) == -1) { 00964 <span class="comment">/* File does not exist, DB->open might create ... */</span> 00965 oflags &= ~DB_RDONLY; 00966 } <span class="keywordflow">else</span> { 00967 <span class="comment">/* File exists, DB->open need not create ... */</span> 00968 oflags &= ~DB_CREATE; 00969 } 00970 00971 <span class="comment">/* Only writers need DB_WRITECURSOR ... */</span> 00972 <span class="keywordflow">if</span> (!(oflags & DB_RDONLY) && access(dbf, <a class="code" href="system_8h.html#a9">W_OK</a>) == 0) { 00973 dbi-><a class="code" href="struct__dbiIndex.html#m9">dbi_oflags</a> &= ~DB_RDONLY; 00974 } <span class="keywordflow">else</span> { 00975 dbi-><a class="code" href="struct__dbiIndex.html#m9">dbi_oflags</a> |= DB_RDONLY; 00976 } 00977 dbf = <a class="code" href="poptint_8h.html#a14">_free</a>(dbf); 00978 } 00979 00980 <span class="comment">/*</span> 00981 <span class="comment"> * Turn off verify-on-close if opening read-only.</span> 00982 <span class="comment"> */</span> 00983 <span class="keywordflow">if</span> (oflags & DB_RDONLY) 00984 dbi-><a class="code" href="struct__dbiIndex.html#m16">dbi_verify_on_close</a> = 0; 00985 00986 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m19">dbi_use_dbenv</a>) { 00987 <span class="comment">/*@-mods@*/</span> 00988 <span class="keywordflow">if</span> (rpmdb-><a class="code" href="structrpmdb__s.html#m16">db_dbenv</a> == NULL) { 00989 rc = <a class="code" href="db3_8c.html#a5">db_init</a>(dbi, dbhome, dbfile, dbsubfile, &dbenv); 00990 <span class="keywordflow">if</span> (rc == 0) { 00991 rpmdb-><a class="code" href="structrpmdb__s.html#m16">db_dbenv</a> = dbenv; 00992 rpmdb-><a class="code" href="structrpmdb__s.html#m15">db_opens</a> = 1; 00993 } 00994 } <span class="keywordflow">else</span> { 00995 dbenv = rpmdb-><a class="code" href="structrpmdb__s.html#m16">db_dbenv</a>; 00996 rpmdb-><a class="code" href="structrpmdb__s.html#m15">db_opens</a>++; 00997 } 00998 <span class="comment">/*@=mods@*/</span> 00999 } 01000 01001 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"opening db index %s/%s %s mode=0x%x\n"</span>), 01002 dbhome, (dbfile ? dbfile : <a class="code" href="tagName_8c.html#a0">tagName</a>(dbi-><a class="code" href="struct__dbiIndex.html#m67">dbi_rpmtag</a>)), 01003 prDbiOpenFlags(oflags, 0), dbi-><a class="code" href="struct__dbiIndex.html#m12">dbi_mode</a>); 01004 01005 <span class="keywordflow">if</span> (rc == 0) { 01006 <span class="keyword">static</span> <span class="keywordtype">int</span> _lockdbfd = 0; 01007 01008 <span class="comment">/*@-moduncon@*/</span> <span class="comment">/* FIX: annotate db3 methods */</span> 01009 rc = db_create(&db, dbenv, dbi-><a class="code" href="struct__dbiIndex.html#m6">dbi_cflags</a>); 01010 <span class="comment">/*@=moduncon@*/</span> 01011 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db_create"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01012 <span class="keywordflow">if</span> (rc == 0 && db != NULL) { 01013 <span class="keywordflow">if</span> (rc == 0 && dbi-><a class="code" href="struct__dbiIndex.html#m31">dbi_lorder</a>) { 01014 rc = db->set_lorder(db, dbi-><a class="code" href="struct__dbiIndex.html#m31">dbi_lorder</a>); 01015 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_lorder"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01016 } 01017 <span class="keywordflow">if</span> (rc == 0 && dbi-><a class="code" href="struct__dbiIndex.html#m47">dbi_cachesize</a>) { 01018 rc = db->set_cachesize(db, 0, dbi-><a class="code" href="struct__dbiIndex.html#m47">dbi_cachesize</a>, 0); 01019 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_cachesize"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01020 } 01021 <span class="keywordflow">if</span> (rc == 0 && dbi-><a class="code" href="struct__dbiIndex.html#m48">dbi_pagesize</a>) { 01022 rc = db->set_pagesize(db, dbi-><a class="code" href="struct__dbiIndex.html#m48">dbi_pagesize</a>); 01023 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_pagesize"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01024 } 01025 <span class="comment">/* XXX 3.3.4 change. */</span> 01026 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 3) || (DB_VERSION_MAJOR == 4)</span> 01027 <span class="preprocessor"></span> <span class="keywordflow">if</span> (rc == 0 && 01028 rpmdb-><a class="code" href="structrpmdb__s.html#m12">db_malloc</a> && rpmdb-><a class="code" href="structrpmdb__s.html#m13">db_realloc</a> && rpmdb-><a class="code" href="structrpmdb__s.html#m14">db_free</a>) 01029 { 01030 rc = db->set_alloc(db, 01031 rpmdb-><a class="code" href="structrpmdb__s.html#m12">db_malloc</a>, rpmdb-><a class="code" href="structrpmdb__s.html#m13">db_realloc</a>, rpmdb-><a class="code" href="structrpmdb__s.html#m14">db_free</a>); 01032 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_alloc"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01033 } 01034 <span class="preprocessor">#else</span> 01035 <span class="preprocessor"></span> <span class="keywordflow">if</span> (rc == 0 && rpmdb-><a class="code" href="structrpmdb__s.html#m12">db_malloc</a>) { 01036 rc = db->set_malloc(db, rpmdb-><a class="code" href="structrpmdb__s.html#m12">db_malloc</a>); 01037 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_malloc"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01038 } 01039 <span class="preprocessor">#endif</span> 01040 <span class="preprocessor"></span> <span class="keywordflow">if</span> (rc == 0 && oflags & DB_CREATE) { 01041 <span class="keywordflow">switch</span>(dbi-><a class="code" href="struct__dbiIndex.html#m11">dbi_type</a>) { 01042 <span class="keywordflow">default</span>: 01043 <span class="keywordflow">case</span> DB_HASH: 01044 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m50">dbi_h_ffactor</a>) { 01045 rc = db->set_h_ffactor(db, dbi-><a class="code" href="struct__dbiIndex.html#m50">dbi_h_ffactor</a>); 01046 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_h_ffactor"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01047 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01048 } 01049 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m52">dbi_h_nelem</a>) { 01050 rc = db->set_h_nelem(db, dbi-><a class="code" href="struct__dbiIndex.html#m52">dbi_h_nelem</a>); 01051 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_h_nelem"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01052 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01053 } 01054 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m53">dbi_h_flags</a>) { 01055 rc = db->set_flags(db, dbi-><a class="code" href="struct__dbiIndex.html#m53">dbi_h_flags</a>); 01056 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_h_flags"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01057 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01058 } 01059 <span class="comment">/* XXX db-3.2.9 has added a DB arg to the call. */</span> 01060 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR > 2) || (DB_VERSION_MAJOR == 4)</span> 01061 <span class="preprocessor"></span> <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m51">dbi_h_hash_fcn</a>) { 01062 rc = db->set_h_hash(db, dbi-><a class="code" href="struct__dbiIndex.html#m51">dbi_h_hash_fcn</a>); 01063 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_h_hash"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01064 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01065 } 01066 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m54">dbi_h_dup_compare_fcn</a>) { 01067 rc = db->set_dup_compare(db, dbi-><a class="code" href="struct__dbiIndex.html#m54">dbi_h_dup_compare_fcn</a>); 01068 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_dup_compare"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01069 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01070 } 01071 <span class="preprocessor">#endif</span> 01072 <span class="preprocessor"></span> <span class="keywordflow">break</span>; 01073 <span class="keywordflow">case</span> DB_BTREE: 01074 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m55">dbi_bt_flags</a>) { 01075 rc = db->set_flags(db, dbi-><a class="code" href="struct__dbiIndex.html#m55">dbi_bt_flags</a>); 01076 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_bt_flags"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01077 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01078 } 01079 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m56">dbi_bt_minkey</a>) { 01080 rc = db->set_bt_minkey(db, dbi-><a class="code" href="struct__dbiIndex.html#m56">dbi_bt_minkey</a>); 01081 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_bt_minkey"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01082 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01083 } 01084 <span class="comment">/* XXX db-3.2.9 has added a DB arg to the call. */</span> 01085 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR > 2) || (DB_VERSION_MAJOR == 4)</span> 01086 <span class="preprocessor"></span> <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m57">dbi_bt_compare_fcn</a>) { 01087 rc = db->set_bt_compare(db, dbi-><a class="code" href="struct__dbiIndex.html#m57">dbi_bt_compare_fcn</a>); 01088 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_bt_compare"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01089 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01090 } 01091 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m58">dbi_bt_dup_compare_fcn</a>) { 01092 rc = db->set_dup_compare(db, dbi-><a class="code" href="struct__dbiIndex.html#m58">dbi_bt_dup_compare_fcn</a>); 01093 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_dup_compare"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01094 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01095 } 01096 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m59">dbi_bt_prefix_fcn</a>) { 01097 rc = db->set_bt_prefix(db, dbi-><a class="code" href="struct__dbiIndex.html#m59">dbi_bt_prefix_fcn</a>); 01098 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_bt_prefix"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01099 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01100 } 01101 <span class="preprocessor">#endif</span> 01102 <span class="preprocessor"></span> <span class="keywordflow">break</span>; 01103 <span class="keywordflow">case</span> DB_RECNO: 01104 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m61">dbi_re_delim</a>) { 01105 rc = db->set_re_delim(db, dbi-><a class="code" href="struct__dbiIndex.html#m61">dbi_re_delim</a>); 01106 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_re_selim"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01107 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01108 } 01109 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m62">dbi_re_len</a>) { 01110 rc = db->set_re_len(db, dbi-><a class="code" href="struct__dbiIndex.html#m62">dbi_re_len</a>); 01111 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_re_len"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01112 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01113 } 01114 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m63">dbi_re_pad</a>) { 01115 rc = db->set_re_pad(db, dbi-><a class="code" href="struct__dbiIndex.html#m63">dbi_re_pad</a>); 01116 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_re_pad"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01117 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01118 } 01119 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m64">dbi_re_source</a>) { 01120 rc = db->set_re_source(db, dbi-><a class="code" href="struct__dbiIndex.html#m64">dbi_re_source</a>); 01121 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_re_source"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01122 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01123 } 01124 <span class="keywordflow">break</span>; 01125 <span class="keywordflow">case</span> DB_QUEUE: 01126 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m65">dbi_q_extentsize</a>) { 01127 rc = db->set_q_extentsize(db, dbi-><a class="code" href="struct__dbiIndex.html#m65">dbi_q_extentsize</a>); 01128 rc = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->set_q_extentsize"</span>, rc, <a class="code" href="db3_8c.html#a0">_debug</a>); 01129 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>; 01130 } 01131 <span class="keywordflow">break</span>; 01132 } 01133 } 01134 01135 <span class="keywordflow">if</span> (rc == 0) { 01136 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbfullpath; 01137 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbpath; 01138 <span class="keywordtype">char</span> * t; 01139 <span class="keywordtype">int</span> nb; 01140 01141 nb = strlen(dbhome); 01142 <span class="keywordflow">if</span> (dbfile) nb += 1 + strlen(dbfile); 01143 dbfullpath = t = <a class="code" href="system_8h.html#a36">alloca</a>(nb + 1); 01144 01145 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, dbhome); 01146 <span class="keywordflow">if</span> (dbfile) 01147 t = <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>( t, <span class="stringliteral">"/"</span>), dbfile); 01148 <span class="preprocessor">#ifdef HACK </span><span class="comment">/* XXX necessary to support dbsubfile */</span> 01149 dbpath = (!dbi-><a class="code" href="struct__dbiIndex.html#m19">dbi_use_dbenv</a> && !dbi-><a class="code" href="struct__dbiIndex.html#m25">dbi_temporary</a>) 01150 ? dbfullpath : dbfile; 01151 <span class="preprocessor">#else</span> 01152 <span class="preprocessor"></span> dbpath = (!dbi-><a class="code" href="struct__dbiIndex.html#m25">dbi_temporary</a>) 01153 ? dbfullpath : dbfile; 01154 <span class="preprocessor">#endif</span> 01155 <span class="preprocessor"></span> 01156 rc = db->open(db, dbpath, dbsubfile, 01157 dbi-><a class="code" href="struct__dbiIndex.html#m11">dbi_type</a>, oflags, dbi-><a class="code" href="struct__dbiIndex.html#m13">dbi_perms</a>); 01158 01159 <span class="keywordflow">if</span> (rc == 0 && dbi-><a class="code" href="struct__dbiIndex.html#m11">dbi_type</a> == DB_UNKNOWN) { 01160 <span class="preprocessor">#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 3 && DB_VERSION_PATCH == 11) \</span> 01161 <span class="preprocessor"> || (DB_VERSION_MAJOR == 4)</span> 01162 <span class="preprocessor"></span> DBTYPE dbi_type = DB_UNKNOWN; 01163 xx = db->get_type(db, &dbi_type); 01164 <span class="keywordflow">if</span> (xx == 0) 01165 dbi-><a class="code" href="struct__dbiIndex.html#m11">dbi_type</a> = dbi_type; 01166 <span class="preprocessor">#else</span> 01167 <span class="preprocessor"></span> dbi-><a class="code" href="struct__dbiIndex.html#m11">dbi_type</a> = db->get_type(db); 01168 <span class="preprocessor">#endif</span> 01169 <span class="preprocessor"></span> } 01170 } 01171 01172 <span class="comment">/* XXX return rc == errno without printing */</span> 01173 _printit = (rc > 0 ? 0 : <a class="code" href="db3_8c.html#a0">_debug</a>); 01174 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->open"</span>, rc, _printit); 01175 01176 <span class="keywordflow">if</span> (rc == 0 && dbi-><a class="code" href="struct__dbiIndex.html#m19">dbi_use_dbenv</a> 01177 && (dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> & DB_INIT_CDB) && dbi-><a class="code" href="struct__dbiIndex.html#m21">dbi_get_rmw_cursor</a>) 01178 { 01179 <a class="code" href="rpmdb_8h.html#a2">DBC</a> * dbcursor = NULL; 01180 xx = db->cursor(db, txnid, &dbcursor, 01181 ((oflags & DB_RDONLY) ? 0 : DB_WRITECURSOR)); 01182 xx = <a class="code" href="db3_8c.html#a2">cvtdberr</a>(dbi, <span class="stringliteral">"db->cursor"</span>, xx, <a class="code" href="db3_8c.html#a0">_debug</a>); 01183 dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a> = dbcursor; 01184 } <span class="keywordflow">else</span> 01185 dbi-><a class="code" href="struct__dbiIndex.html#m71">dbi_rmw</a> = NULL; 01186 01187 <span class="comment">/*</span> 01188 <span class="comment"> * Lock a file using fcntl(2). Traditionally this is Packages,</span> 01189 <span class="comment"> * the file used * to store metadata of installed header(s),</span> 01190 <span class="comment"> * as Packages is always opened, and should be opened first,</span> 01191 <span class="comment"> * for any rpmdb access.</span> 01192 <span class="comment"> *</span> 01193 <span class="comment"> * If no DBENV is used, then access is protected with a</span> 01194 <span class="comment"> * shared/exclusive locking scheme, as always.</span> 01195 <span class="comment"> *</span> 01196 <span class="comment"> * With a DBENV, the fcntl(2) lock is necessary only to keep</span> 01197 <span class="comment"> * the riff-raff from playing where they don't belong, as</span> 01198 <span class="comment"> * the DBENV should provide it's own locking scheme. So try to</span> 01199 <span class="comment"> * acquire a lock, but permit failures, as some other</span> 01200 <span class="comment"> * DBENV player may already have acquired the lock.</span> 01201 <span class="comment"> */</span> 01202 <span class="keywordflow">if</span> (rc == 0 && dbi-><a class="code" href="struct__dbiIndex.html#m24">dbi_lockdbfd</a>) 01203 { 01204 <span class="keywordtype">int</span> fdno = -1; 01205 01206 <span class="keywordflow">if</span> (!(db->fd(db, &fdno) == 0 && fdno >= 0)) { 01207 rc = 1; 01208 } <span class="keywordflow">else</span> { 01209 <span class="keyword">struct </span>flock l; 01210 memset(&l, 0, <span class="keyword">sizeof</span>(l)); 01211 l.l_whence = 0; 01212 l.l_start = 0; 01213 l.l_len = 0; 01214 l.l_type = (dbi-><a class="code" href="struct__dbiIndex.html#m12">dbi_mode</a> & (O_RDWR|O_WRONLY)) 01215 ? F_WRLCK : F_RDLCK; 01216 l.l_pid = 0; 01217 01218 <span class="keywordflow">while</span> (1) { 01219 rc = fcntl(fdno, F_SETLK, (<span class="keywordtype">void</span> *) &l); 01220 <span class="keywordflow">if</span> (rc) { 01221 <span class="comment">/* Warning only if using CDB locking. */</span> 01222 rc = ((dbi-><a class="code" href="struct__dbiIndex.html#m19">dbi_use_dbenv</a> && 01223 (dbi-><a class="code" href="struct__dbiIndex.html#m8">dbi_eflags</a> & DB_INIT_CDB)) 01224 ? 0 : 1); 01225 <span class="keywordflow">if</span> (dbi-><a class="code" href="struct__dbiIndex.html#m35">dbi_verbose</a>) 01226 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>( (rc ? <a class="code" href="rpmerr_8h.html#a91a36">RPMERR_FLOCK</a> : <a class="code" href="rpmerr_8h.html#a91a90">RPMWARN_FLOCK</a>), 01227 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"cannot get %s lock on %s/%s\n"</span>), 01228 ((dbi-><a class="code" href="struct__dbiIndex.html#m12">dbi_mode</a> & (O_RDWR|O_WRONLY)) 01229 ? _(<span class="stringliteral">"exclusive"</span>) : <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"shared"</span>)), 01230 dbhome, (dbfile ? dbfile : <span class="stringliteral">""</span>)); 01231 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dbfile) { 01232 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, 01233 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"locked db index %s/%s\n"</span>), 01234 dbhome, dbfile); 01235 <span class="keywordflow">break</span>; 01236 } 01237 <span class="keywordflow">if</span> (!geteuid() || !(dbi-><a class="code" href="struct__dbiIndex.html#m12">dbi_mode</a> & (O_RDWR|O_WRONLY)) ) { 01238 sleep(5); 01239 } <span class="keywordflow">else</span> { 01240 <span class="keywordflow">break</span>; 01241 } 01242 } 01243 } 01244 } 01245 } 01246 } 01247 01248 dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a> = db; 01249 01250 <span class="keywordflow">if</span> (rc == 0 && dbi-><a class="code" href="struct__dbiIndex.html#m70">dbi_db</a> != NULL && dbip != NULL) { 01251 dbi-><a class="code" href="struct__dbiIndex.html#m73">dbi_vec</a> = &db3vec; 01252 *dbip = dbi; 01253 } <span class="keywordflow">else</span> { 01254 dbi-><a class="code" href="struct__dbiIndex.html#m16">dbi_verify_on_close</a> = 0; 01255 (void) <a class="code" href="db3_8c.html#a21">db3close</a>(dbi, 0); 01256 } 01257 01258 urlfn = <a class="code" href="poptint_8h.html#a14">_free</a>(urlfn); 01259 01260 <span class="comment">/*@-nullstate -compmempass@*/</span> 01261 <span class="keywordflow">return</span> rc; 01262 <span class="comment">/*@=nullstate =compmempass@*/</span> 01263 } 01264 01267 <span class="comment">/*@-exportheadervar@*/</span> 01268 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span> <a name="l01269"></a><a class="code" href="group__db3.html#a0">01269</a> <span class="keyword">struct </span><a class="code" href="struct__dbiVec.html">_dbiVec</a> db3vec = { 01270 <a class="code" href="db1_8c.html#a1">DB_VERSION_MAJOR</a>, <a class="code" href="db1_8c.html#a2">DB_VERSION_MINOR</a>, <a class="code" href="db1_8c.html#a3">DB_VERSION_PATCH</a>, 01271 <a class="code" href="db3_8c.html#a22">db3open</a>, <a class="code" href="db3_8c.html#a21">db3close</a>, <a class="code" href="db3_8c.html#a6">db3sync</a>, <a class="code" href="db3_8c.html#a14">db3copen</a>, <a class="code" href="db3_8c.html#a13">db3cclose</a>, <a class="code" href="db3_8c.html#a16">db3cdel</a>, <a class="code" href="db3_8c.html#a17">db3cget</a>, <a class="code" href="db3_8c.html#a15">db3cput</a>, 01272 <a class="code" href="db3_8c.html#a18">db3ccount</a>, <a class="code" href="db3_8c.html#a19">db3byteswapped</a>, <a class="code" href="db3_8c.html#a20">db3stat</a> 01273 }; 01274 <span class="comment">/*@=exportheadervar@*/</span> 01275 <span class="comment">/*@=type@*/</span> </pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:15:00 2002 for rpm by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.17 </small></address> </body> </html>