44 #define _RPMDB_INTERNAL
51 #if defined(__LCLINT__)
52 #define UINT32_T u_int32_t
54 #define UINT32_T rpmuint32_t
61 #if defined(__QNXNTO__)
120 #define _DBSWAP(_a) \
121 { unsigned char _b, *_c = (_a).uc; \
122 _b = _c[3]; _c[3] = _c[0]; _c[0] = _b; \
123 _b = _c[2]; _c[2] = _c[1]; _c[1] = _b; \
138 char * currDir = NULL;
141 if ((dbi->dbi_root[0] ==
'/' && dbi->dbi_root[1] ==
'\0') || dbi->dbi_rpmdb->db_chrootDone ||
sqlInRoot)
146 fprintf(stderr,
"sql:chroot(%s)\n", dbi->dbi_root);
153 currDir =
xrealloc(currDir, currDirLen);
154 memset(currDir, 0, currDirLen);
155 }
while (getcwd(currDir, currDirLen) == NULL &&
errno == ERANGE);
163 xx =
Chroot(dbi->dbi_root);
175 if ((dbi->dbi_root[0] ==
'/' && dbi->dbi_root[1] ==
'\0') || dbi->dbi_rpmdb->db_chrootDone || !
sqlInRoot)
180 fprintf(stderr,
"sql:chroot(.)\n");
203 fprintf(stderr,
"\tscp %p [%d:%d] av %p avlen %p nr [%d:%d] nc %d all %d\n", scp, scp->
ac, scp->
nalloc, scp->
av, scp->
avlen, scp->
rx, scp->
nr, scp->
nc, scp->
all);
208 DBT * key,
DBT * data,
unsigned int flags)
215 fprintf(stderr,
"%s on %s (%p,%p,%p,0x%x)", msg, dbi->dbi_subfile, dbcursor, key, data, flags);
218 if (key != NULL && key->
data != NULL) {
219 fprintf(stderr,
" key 0x%x[%d]", *(
unsigned int *)key->
data, key->
size);
221 fprintf(stderr,
" \"%s\"", (
const char *)key->
data);
223 if (data != NULL && data->
data != NULL)
224 fprintf(stderr,
" data 0x%x[%d]", *(
unsigned int *)data->
data, data->
size);
226 fprintf(stderr,
"\n");
227 if (dbcursor != NULL)
238 fprintf(stderr,
"*** scpResetKeys(%p)\n", scp);
241 for ( ix =0 ; ix < scp->
nkeys ; ix++ ) {
260 fprintf(stderr,
"*** scpResetAv(%p)\n", scp);
263 if (scp->
av != NULL) {
266 sqlite3_free_table(scp->
av);
272 for (xx = 0; xx < scp->
ac; xx++)
276 memset(scp->
av, 0, scp->
nalloc *
sizeof(*scp->
av));
277 if (scp->
avlen != NULL)
299 fprintf(stderr,
"*** scpReset(%p)\n", scp);
303 sqlite3_free(scp->
cmd);
307 xx = sqlite3_reset(scp->
pStmt);
309 xx = sqlite3_finalize(scp->
pStmt);
330 fprintf(stderr,
"*** scpFree(%p)\n", scp);
338 SCP_t scp =
xcalloc(1,
sizeof(*scp));
349 fprintf(stderr,
"*** scpNew(%p)\n", scp);
356 int swapped = dbiByteSwapped(dbi);
365 scp->
nc = sqlite3_column_count(scp->
pStmt);
367 if (scp->
nr == 0 && scp->
av != NULL)
373 if (!scp->
ac && !need && !scp->
nalloc)
376 if (scp->
ac + need >= scp->
nalloc) {
383 if (scp->
av != NULL && scp->
nr == 0) {
384 for (i = 0; i < scp->
nc; i++) {
395 rc = sqlite3_step(scp->
pStmt);
399 fprintf(stderr,
"sqlite3_step: DONE scp %p [%d:%d] av %p avlen %p\n", scp, scp->
ac, scp->
nalloc, scp->
av, scp->
avlen);
404 for (i = 0; i < scp->
nc; i++) {
406 if (scp->
ac + need >= scp->
nalloc) {
412 assert(scp->
av != NULL);
413 assert(scp->
avlen != NULL);
415 cname = sqlite3_column_name(scp->
pStmt, i);
416 vtype = sqlite3_column_decltype(scp->
pStmt, i);
419 if (!strcmp(vtype,
"blob")) {
420 const void * v = sqlite3_column_blob(scp->
pStmt, i);
421 nb = sqlite3_column_bytes(scp->
pStmt, i);
423 fprintf(stderr,
"\t%d %s %s %p[%d]\n", i, cname, vtype, v, (
int)nb);
426 scp->
av[scp->
ac] = memcpy(t, v, nb);
431 if (!strcmp(vtype,
"double")) {
432 double v = sqlite3_column_double(scp->
pStmt, i);
435 fprintf(stderr,
"\t%d %s %s %g\n", i, cname, vtype, v);
439 assert(swapped == 0);
443 if (!strcmp(vtype,
"int")) {
447 fprintf(stderr,
"\t%d %s %s %d\n", i, cname, vtype, (
int) v);
453 memcpy(&dbswap.
ui, scp->
av[scp->
ac],
sizeof(dbswap.
ui));
455 memcpy(scp->
av[scp->
ac], &dbswap.
ui,
sizeof(dbswap.
ui));
460 if (!strcmp(vtype,
"int64")) {
461 int64_t v = sqlite3_column_int64(scp->
pStmt, i);
464 fprintf(stderr,
"\t%d %s %s %ld\n", i, cname, vtype, (
long)v);
468 assert(swapped == 0);
472 if (!strcmp(vtype,
"text")) {
473 const char * v = (
const char *)sqlite3_column_text(scp->
pStmt, i);
476 fprintf(stderr,
"\t%d %s %s \"%s\"\n", i, cname, vtype, v);
488 fprintf(stderr,
"sqlite3_step: BUSY %d\n", rc);
491 fprintf(stderr,
"sqlite3_step: ERROR %d -- %s\n", rc, scp->
cmd);
492 fprintf(stderr,
" %s (%d)\n",
493 sqlite3_errmsg(((
SQL_DB*)dbi->dbi_db)->db), sqlite3_errcode(((
SQL_DB*)dbi->dbi_db)->db));
495 fprintf(stderr,
" cwd '%s'\n", getcwd(NULL,0));
500 fprintf(stderr,
"sqlite3_step: MISUSE %d\n", rc);
504 fprintf(stderr,
"sqlite3_step: rc %d\n", rc);
511 if (rc == SQLITE_DONE)
520 int swapped = dbiByteSwapped(dbi);
524 assert(key->
data != NULL);
525 switch (dbi->dbi_rpmtag) {
529 memcpy(&hnum, key->
data,
sizeof(hnum));
532 memcpy(&dbswap.
ui, &hnum,
sizeof(dbswap.
ui));
534 memcpy(&hnum, &dbswap.
ui,
sizeof(dbswap.
ui));
536 rc = sqlite3_bind_int(scp->
pStmt, pos, hnum);
542 rc = sqlite3_bind_blob(scp->
pStmt, pos, key->
data, key->
size, SQLITE_STATIC);
547 assert(key->
size ==
sizeof(
unsigned char));
548 assert(swapped == 0);
549 memcpy(&i, key->
data,
sizeof(i));
550 rc = sqlite3_bind_int(scp->
pStmt, pos, (
int) i);
555 assert(swapped == 0);
556 memcpy(&i, key->
data,
sizeof(i));
557 rc = sqlite3_bind_int(scp->
pStmt, pos, (
int) i);
566 memcpy(&i, key->
data,
sizeof(i));
570 memcpy(&dbswap.
ui, &i,
sizeof(dbswap.
ui));
572 memcpy(&i, &dbswap.
ui,
sizeof(dbswap.
ui));
574 rc = sqlite3_bind_int(scp->
pStmt, pos, i);
580 rc = sqlite3_bind_text(scp->
pStmt, pos, key->
data, key->
size, SQLITE_STATIC);
595 assert(data->
data != NULL);
597 rc = sqlite3_bind_blob(scp->
pStmt, pos, data->
data, data->
size, SQLITE_STATIC);
617 rc = sqlite3_exec(sqldb->
db,
"BEGIN TRANSACTION;", NULL, NULL, &pzErrmsg);
620 fprintf(stderr,
"Begin %s SQL transaction %s (%d)\n",
621 dbi->dbi_subfile, pzErrmsg, rc);
639 rc = sqlite3_exec(sqldb->
db,
"END TRANSACTION;", NULL, NULL, &pzErrmsg);
642 fprintf(stderr,
"End %s SQL transaction %s (%d)\n",
643 dbi->dbi_subfile, pzErrmsg, rc);
661 rc = sqlite3_exec(sqldb->
db,
"COMMIT;", NULL, NULL, &pzErrmsg);
664 fprintf(stderr,
"Commit %s SQL transaction(s) %s (%d)\n",
665 dbi->dbi_subfile, pzErrmsg, rc);
685 dbi->dbi_file, time);
704 SCP_t scp =
scpNew(dbi->dbi_db);
708 if (dbi->dbi_tmpdir) {
712 root = (dbi->dbi_root ? dbi->dbi_root : dbi->dbi_rpmdb->db_root);
713 if ((root[0] ==
'/' && root[1] ==
'\0') || dbi->dbi_rpmdb->db_chrootDone)
716 tmpdir =
rpmGenPath(root, dbi->dbi_tmpdir, NULL);
718 sprintf(cmd,
"PRAGMA temp_store_directory = '%s';", tmpdir);
719 xx = sqlite3_exec(sqldb->
db, cmd, NULL, NULL, (
char **)&scp->pzErrmsg);
720 tmpdir =
_free(tmpdir);
722 if (dbi->dbi_eflags &
DB_EXCL) {
724 sprintf(cmd,
"PRAGMA locking_mode = EXCLUSIVE;");
725 xx = sqlite3_exec(sqldb->
db, cmd, NULL, NULL, (
char **)&scp->pzErrmsg);
727 if (dbi->dbi_pagesize > 0) {
729 sprintf(cmd,
"PRAGMA cache_size = %d;", dbi->dbi_cachesize);
730 xx = sqlite3_exec(sqldb->
db, cmd, NULL, NULL, (
char **)&scp->pzErrmsg);
732 if (dbi->dbi_cachesize > 0) {
734 sprintf(cmd,
"PRAGMA page_size = %d;", dbi->dbi_pagesize);
735 xx = sqlite3_exec(sqldb->
db, cmd, NULL, NULL, (
char **)&scp->pzErrmsg);
740 "SELECT name FROM 'sqlite_master' WHERE type='table' and name='%s';",
743 rc = sqlite3_get_table(sqldb->
db, cmd,
744 &scp->av, &scp->nr, &scp->nc, (
char **)&scp->pzErrmsg);
750 const char * valtype =
"blob";
751 const char * keytype;
753 switch (dbi->dbi_rpmtag) {
755 keytype =
"int UNIQUE PRIMARY KEY";
762 keytype =
"blob UNIQUE";
768 keytype =
"int UNIQUE";
773 keytype =
"text UNIQUE";
778 fprintf(stderr,
"\t%s(%d) type(%d) keytype %s\n",
tagName(dbi->dbi_rpmtag), dbi->dbi_rpmtag, (
tagType(dbi->dbi_rpmtag) &
RPM_MASK_TYPE), keytype);
779 sprintf(cmd,
"CREATE %sTABLE '%s' (key %s, value %s)",
780 dbi->dbi_temporary ?
"TEMPORARY " :
"",
781 dbi->dbi_subfile, keytype, valtype);
782 rc = sqlite3_exec(sqldb->
db, cmd, NULL, NULL, (
char **)&scp->pzErrmsg);
786 sprintf(cmd,
"CREATE %sTABLE 'db_info' (endian TEXT)",
787 dbi->dbi_temporary ?
"TEMPORARY " :
"");
788 rc = sqlite3_exec(sqldb->
db, cmd, NULL, NULL, (
char **)&scp->pzErrmsg);
792 sprintf(cmd,
"INSERT INTO 'db_info' values('%u')", (
unsigned)((
union _dbswap *)&
endian)->
uc[0]);
793 rc = sqlite3_exec(sqldb->
db, cmd, NULL, NULL, (
char **)&scp->pzErrmsg);
798 if (dbi->dbi_no_fsync) {
800 sprintf(cmd,
"PRAGMA synchronous = OFF;");
801 xx = sqlite3_exec(sqldb->
db, cmd, NULL, NULL, (
char **)&scp->pzErrmsg);
826 SCP_t scp = (
SCP_t)dbcursor;
830 fprintf(stderr,
"==> sql_cclose(%p)\n", scp);
873 (void) sqlite3_close(sqldb->
db);
879 if (dbi->dbi_temporary && !(dbi->dbi_eflags &
DB_PRIVATE)) {
880 const char * dbhome = NULL;
882 const char * dbfname =
rpmGenPath(dbhome, dbi->dbi_file, NULL);
883 int xx = (dbfname ?
Unlink(dbfname) : 0);
885 dbfname =
_free(dbfname);
889 dbi->dbi_stats =
_free(dbi->dbi_stats);
890 dbi->dbi_file =
_free(dbi->dbi_file);
891 dbi->dbi_db =
_free(dbi->dbi_db);
913 extern struct _dbiVec sqlitevec;
916 const char * urlfn = NULL;
921 const char * dbfname;
922 const char * sql_errcode;
923 mode_t umask_safed = 0002;
937 if ((dbi = db3New(rpmdb, rpmtag)) == NULL)
946 root = rpmdb->db_root;
947 home = rpmdb->db_home;
949 dbi->dbi_root = root;
950 dbi->dbi_home = home;
952 dbfile =
tagName(dbi->dbi_rpmtag);
962 len = strlen(dbfile);
963 t =
xcalloc(len + 1,
sizeof(*t));
964 (void)
stpcpy( t, dbfile );
967 dbi->dbi_subfile = t;
971 dbi->dbi_mode = O_RDWR;
980 (void)
urlPath(urlfn, &dbhome);
985 (void)
rpmioMkpath(dbhome, 0755, getuid(), getgid());
990 dbfname =
rpmGenPath(dbhome, dbi->dbi_file, NULL);
993 dbfname, dbi->dbi_subfile, dbi->dbi_mode);
996 sqldb =
xcalloc(1,
sizeof(*sqldb));
1002 umask_safed = umask(~((mode_t)(dbi->dbi_perms)));
1004 xx = sqlite3_open(dbfname, &sqldb->
db);
1005 if (dbi->dbi_perms) {
1006 if ((0644 & dbi->dbi_perms) != dbi->dbi_perms) {
1008 (void)
Chmod(dbfname, dbi->dbi_perms);
1011 (void) umask(umask_safed);
1014 if (xx != SQLITE_OK)
1015 sql_errcode = sqlite3_errmsg(sqldb->
db);
1022 dbi->dbi_db = (
DB *)sqldb;
1024 if (sql_errcode != NULL) {
1033 if (rc == 0 && dbi->dbi_db != NULL && dbip != NULL) {
1040 urlfn =
_free(urlfn);
1041 dbfname =
_free(dbfname);
1079 DBC ** dbcp,
unsigned int flags)
1083 SCP_t scp =
scpNew(dbi->dbi_db);
1084 DBC * dbcursor = (
DBC *)scp;
1088 fprintf(stderr,
"==> sql_copen(%s) tag %d type %d scp %p\n",
tagName(dbi->dbi_rpmtag), dbi->dbi_rpmtag, (
tagType(dbi->dbi_rpmtag) &
RPM_MASK_TYPE), scp);
1116 DBT * data,
unsigned int flags)
1121 SCP_t scp =
scpNew(dbi->dbi_db);
1124 dbg_keyval(
"sql_cdel", dbi, dbcursor, key, data, flags);
1127 scp->cmd = sqlite3_mprintf(
"DELETE FROM '%q' WHERE key=? AND value=?;",
1130 rc = sqlite3_prepare(sqldb->
db, scp->cmd, (
int)strlen(scp->cmd), &scp->pStmt, &scp->pzErrmsg);
1131 if (rc)
rpmlog(
RPMLOG_WARNING,
"cdel(%s) prepare %s (%d)\n", dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1133 if (rc)
rpmlog(
RPMLOG_WARNING,
"cdel(%s) bind key %s (%d)\n", dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1135 if (rc)
rpmlog(
RPMLOG_WARNING,
"cdel(%s) bind data %s (%d)\n", dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1157 DBT * data,
unsigned int flags)
1162 SCP_t scp = (SCP_t)dbcursor;
1166 assert(dbcursor != NULL);
1167 dbg_keyval(
"sql_cget", dbi, dbcursor, key, data, flags);
1176 fprintf(stderr,
"\tcget(%s) scp %p rc %d flags %d av %p\n",
1177 dbi->dbi_subfile, scp, rc, flags, scp->av);
1178 if ( flags ==
DB_SET || scp->used == 0 ) {
1187 if ( key->
size == 0) {
1200 switch (dbi->dbi_rpmtag) {
1202 scp->cmd = sqlite3_mprintf(
"SELECT key FROM '%q' ORDER BY key;",
1206 scp->cmd = sqlite3_mprintf(
"SELECT key FROM '%q';",
1210 rc = sqlite3_prepare(sqldb->
db, scp->cmd, (
int)strlen(scp->cmd), &scp->pStmt, &scp->pzErrmsg);
1211 if (rc)
rpmlog(
RPMLOG_WARNING,
"cget(%s) sequential prepare %s (%d)\n", dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1217 scp->nkeys = scp->nr;
1218 scp->keys =
xcalloc(scp->nkeys,
sizeof(*scp->keys));
1219 for (ix = 0; ix < scp->nkeys; ix++) {
1220 scp->keys[ix] =
xmalloc(
sizeof(*scp->keys[0]));
1221 scp->keys[ix]->size = (
UINT32_T) scp->avlen[ix+1];
1222 scp->keys[ix]->data =
xmalloc(scp->keys[ix]->size);
1223 memcpy(scp->keys[ix]->data, scp->av[ix+1], scp->avlen[ix+1]);
1231 scp->keys =
xcalloc(scp->nkeys,
sizeof(*scp->keys));
1232 scp->keys[0] =
xmalloc(
sizeof(*scp->keys[0]));
1233 scp->keys[0]->size = key->
size;
1234 scp->keys[0]->data =
xmalloc(scp->keys[0]->size);
1235 memcpy(scp->keys[0]->data, key->
data, key->
size);
1241 scp->cmd = sqlite3_mprintf(
"SELECT value FROM '%q' WHERE key=?;", dbi->dbi_subfile);
1242 rc = sqlite3_prepare(sqldb->
db, scp->cmd, (
int)strlen(scp->cmd), &scp->pStmt, &scp->pzErrmsg);
1244 if (rc)
rpmlog(
RPMLOG_WARNING,
"cget(%s) prepare %s (%d)\n", dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1250 if ((scp->rx + 1) > scp->nkeys )
1258 if (rc)
rpmlog(
RPMLOG_WARNING,
"cget(%s) key bind %s (%d)\n", dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1263 rc = sqlite3_reset(scp->pStmt);
1267 assert(scp->nr < 2);
1269 if (scp->nr == 0 && scp->all == 0)
1279 assert(scp->nr == 1);
1282 scp->lkey =
_free(scp->lkey);
1285 key->
size = scp->keys[scp->rx]->size;
1288 scp->lkey = key->
data;
1290 (void) memcpy(key->
data, scp->keys[scp->rx]->data, key->
size);
1294 switch (dbi->dbi_rpmtag) {
1297 scp->ldata =
_free(scp->ldata);
1303 scp->ldata = data->
data;
1305 (
void) memcpy(data->
data, scp->av[1], data->
size);
1312 fprintf(stderr,
"\tcget(%s) found key 0x%x (%d)\n", dbi->dbi_subfile,
1313 key->
data == NULL ? 0 : *(
unsigned int *)key->
data, key->
size);
1315 fprintf(stderr,
"\tcget(%s) found data 0x%x (%d)\n", dbi->dbi_subfile,
1316 key->
data == NULL ? 0 : *(
unsigned int *)data->
data, data->
size);
1321 fprintf(stderr,
"\tcget(%s) not found\n", dbi->dbi_subfile);
1339 DBT * data,
unsigned int flags)
1344 SCP_t scp =
scpNew(dbi->dbi_db);
1347 dbg_keyval(
"sql_cput", dbi, dbcursor, key, data, flags);
1351 switch (dbi->dbi_rpmtag) {
1353 scp->cmd = sqlite3_mprintf(
"INSERT OR REPLACE INTO '%q' VALUES(?, ?);",
1355 rc = sqlite3_prepare(sqldb->
db, scp->cmd, (
int)strlen(scp->cmd), &scp->pStmt, &scp->pzErrmsg);
1356 if (rc)
rpmlog(
RPMLOG_WARNING,
"cput(%s) prepare %s (%d)\n",dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1358 if (rc)
rpmlog(
RPMLOG_WARNING,
"cput(%s) key bind %s (%d)\n", dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1360 if (rc)
rpmlog(
RPMLOG_WARNING,
"cput(%s) data bind %s (%d)\n", dbi->dbi_subfile, sqlite3_errmsg(sqldb->
db), rc);
1385 SCP_t scp =
scpNew(dbi->dbi_db);
1392 sql_rc = sqlite3_get_table(sqldb->
db,
"SELECT endian FROM 'db_info';",
1393 &scp->av, &scp->nr, &scp->nc, (
char **)&scp->pzErrmsg);
1396 if (sql_rc == 0 && scp->nr > 0) {
1397 assert(scp->av != NULL);
1398 db_endian.
uc[0] = (
unsigned char) strtol(scp->av[1], NULL, 10);
1408 scp->pzErrmsg, sql_rc);
1437 int (*callback) (
DB *,
const DBT *,
const DBT *,
DBT *),
1442 fprintf(stderr,
"*** sql_associate:\n");
1462 fprintf(stderr,
"*** sql_join:\n");
1482 fprintf(stderr,
"*** sql_cdup:\n");
1506 fprintf(stderr,
"*** sql_cpget:\n");
1520 unsigned int * countp,
1526 fprintf(stderr,
"*** sql_ccount:\n");
1541 SCP_t scp =
scpNew(dbi->dbi_db);
1547 dbi->dbi_stats =
_free(dbi->dbi_stats);
1553 scp->cmd = sqlite3_mprintf(
"SELECT COUNT('key') FROM '%q';", dbi->dbi_subfile);
1555 rc = sqlite3_get_table(sqldb->
db, scp->cmd,
1556 &scp->av, &scp->nr, &scp->nc, (
char **)&scp->pzErrmsg);
1559 if ( rc == 0 && scp->nr > 0) {
1560 assert(scp->av != NULL);
1561 nkeys = strtol(scp->av[1], NULL, 10);
1564 dbi->dbi_subfile, nkeys);
1575 ((
DB_HASH_STAT *)(dbi->dbi_stats))->hash_nkeys = nkeys;