00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "db_config.h"
00011
00012 #ifndef NO_SYSTEM_INCLUDES
00013 #include <sys/types.h>
00014
00015 #include <string.h>
00016 #endif
00017
00018 #include "db_int.h"
00019 #include "dbinc/db_page.h"
00020 #include "dbinc/db_shash.h"
00021 #include "dbinc/mp.h"
00022 #include "dbinc/db_am.h"
00023
00024
00025
00026
00027
00028
00029
00030 int
00031 __db_ditem(dbc, pagep, indx, nbytes)
00032 DBC *dbc;
00033 PAGE *pagep;
00034 u_int32_t indx, nbytes;
00035 {
00036 DB *dbp;
00037 DBT ldbt;
00038 db_indx_t cnt, *inp, offset;
00039 int ret;
00040 u_int8_t *from;
00041
00042 dbp = dbc->dbp;
00043 if (DBC_LOGGING(dbc)) {
00044 ldbt.data = P_ENTRY(dbp, pagep, indx);
00045 ldbt.size = nbytes;
00046 if ((ret = __db_addrem_log(dbp, dbc->txn,
00047 &LSN(pagep), 0, DB_REM_DUP, PGNO(pagep),
00048 (u_int32_t)indx, nbytes, &ldbt, NULL, &LSN(pagep))) != 0)
00049 return (ret);
00050 } else
00051 LSN_NOT_LOGGED(LSN(pagep));
00052
00053
00054
00055
00056
00057 if (NUM_ENT(pagep) == 1) {
00058 NUM_ENT(pagep) = 0;
00059 HOFFSET(pagep) = dbp->pgsize;
00060 return (0);
00061 }
00062
00063 inp = P_INP(dbp, pagep);
00064
00065
00066
00067
00068 from = (u_int8_t *)pagep + HOFFSET(pagep);
00069 DB_ASSERT(inp[indx] >= HOFFSET(pagep));
00070 memmove(from + nbytes, from, inp[indx] - HOFFSET(pagep));
00071 HOFFSET(pagep) += nbytes;
00072
00073
00074 offset = inp[indx];
00075 for (cnt = 0; cnt < NUM_ENT(pagep); ++cnt)
00076 if (inp[cnt] < offset)
00077 inp[cnt] += nbytes;
00078
00079
00080 --NUM_ENT(pagep);
00081 if (indx != NUM_ENT(pagep))
00082 memmove(&inp[indx], &inp[indx + 1],
00083 sizeof(db_indx_t) * (NUM_ENT(pagep) - indx));
00084
00085 return (0);
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095 int
00096 __db_pitem(dbc, pagep, indx, nbytes, hdr, data)
00097 DBC *dbc;
00098 PAGE *pagep;
00099 u_int32_t indx;
00100 u_int32_t nbytes;
00101 DBT *hdr, *data;
00102 {
00103 DB *dbp;
00104 BKEYDATA bk;
00105 DBT thdr;
00106 db_indx_t *inp;
00107 int ret;
00108 u_int8_t *p;
00109
00110 dbp = dbc->dbp;
00111 if (nbytes > P_FREESPACE(dbp, pagep)) {
00112 DB_ASSERT(nbytes <= P_FREESPACE(dbp, pagep));
00113 return (EINVAL);
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 if (DBC_LOGGING(dbc)) {
00133 if ((ret = __db_addrem_log(dbp, dbc->txn,
00134 &LSN(pagep), 0, DB_ADD_DUP, PGNO(pagep),
00135 (u_int32_t)indx, nbytes, hdr, data, &LSN(pagep))) != 0)
00136 return (ret);
00137 } else
00138 LSN_NOT_LOGGED(LSN(pagep));
00139
00140 if (hdr == NULL) {
00141 B_TSET(bk.type, B_KEYDATA, 0);
00142 bk.len = data == NULL ? 0 : data->size;
00143
00144 thdr.data = &bk;
00145 thdr.size = SSZA(BKEYDATA, data);
00146 hdr = &thdr;
00147 }
00148 inp = P_INP(dbp, pagep);
00149
00150
00151 if (indx != NUM_ENT(pagep))
00152 memmove(&inp[indx + 1], &inp[indx],
00153 sizeof(db_indx_t) * (NUM_ENT(pagep) - indx));
00154 HOFFSET(pagep) -= nbytes;
00155 inp[indx] = HOFFSET(pagep);
00156 ++NUM_ENT(pagep);
00157
00158 p = P_ENTRY(dbp, pagep, indx);
00159 memcpy(p, hdr->data, hdr->size);
00160 if (data != NULL)
00161 memcpy(p + hdr->size, data->data, data->size);
00162
00163 return (0);
00164 }