if (version != BDB_VERSION) {
Mmsg(&mdb->errmsg, "Database version mismatch. Wanted %d, got %d\n",
BDB_VERSION, version);
+ Jmsg(mdb->jcr, M_FATAL, 0, mdb->errmsg);
return 0;
}
return 1;
{
if (sql_query(mdb, cmd)) {
m_msg(file, line, &mdb->errmsg, _("query %s failed:\n%s\n"), cmd, sql_strerror(mdb));
- e_msg(file, line, M_FATAL, 0, mdb->errmsg);
+ j_msg(file, line, mdb->jcr, M_FATAL, 0, mdb->errmsg);
return 0;
}
mdb->result = sql_store_result(mdb);
{
if (sql_query(mdb, cmd)) {
m_msg(file, line, &mdb->errmsg, _("insert %s failed:\n%s\n"), cmd, sql_strerror(mdb));
- e_msg(file, line, M_FATAL, 0, mdb->errmsg);
+ j_msg(file, line, mdb->jcr, M_FATAL, 0, mdb->errmsg);
return 0;
}
if (mdb->have_insert_id) {
char ed1[30];
m_msg(file, line, &mdb->errmsg, _("Insertion problem: affect_rows=%s\n"),
edit_uint64(mdb->num_rows, ed1));
- e_msg(file, line, M_FATAL, 0, mdb->errmsg); /* ***FIXME*** remove me */
return 0;
}
+ mdb->changes++;
return 1;
}
if (sql_query(mdb, cmd)) {
m_msg(file, line, &mdb->errmsg, _("update %s failed:\n%s\n"), cmd, sql_strerror(mdb));
- e_msg(file, line, M_ERROR, 0, mdb->errmsg);
- e_msg(file, line, M_ERROR, 0, "%s\n", cmd);
+ j_msg(file, line, mdb->jcr, M_ERROR, 0, mdb->errmsg);
+ j_msg(file, line, mdb->jcr, M_ERROR, 0, "%s\n", cmd);
return 0;
}
mdb->num_rows = sql_affected_rows(mdb);
char ed1[30];
m_msg(file, line, &mdb->errmsg, _("Update problem: affect_rows=%s\n"),
edit_uint64(mdb->num_rows, ed1));
- e_msg(file, line, M_ERROR, 0, mdb->errmsg);
- e_msg(file, line, M_ERROR, 0, "%s\n", cmd);
return 0;
}
+ mdb->changes++;
return 1;
}
if (sql_query(mdb, cmd)) {
m_msg(file, line, &mdb->errmsg, _("delete %s failed:\n%s\n"), cmd, sql_strerror(mdb));
- e_msg(file, line, M_ERROR, 0, mdb->errmsg);
+ j_msg(file, line, mdb->jcr, M_ERROR, 0, mdb->errmsg);
return -1;
}
+ mdb->changes++;
return sql_affected_rows(mdb);
}
return mdb->errmsg;
}
+void _db_lock(char *file, int line, B_DB *mdb)
+{
+ int errstat;
+ if ((errstat=rwl_writelock(&mdb->lock)) != 0) {
+ j_msg(file, line, mdb->jcr, M_ABORT, 0, "rwl_writelock failure. ERR=%s\n",
+ strerror(errstat));
+ }
+}
+
+void _db_unlock(char *file, int line, B_DB *mdb)
+{
+ int errstat;
+ if ((errstat=rwl_writeunlock(&mdb->lock)) != 0) {
+ j_msg(file, line, mdb->jcr, M_ABORT, 0, "rwl_writeunlock failure. ERR=%s\n",
+ strerror(errstat));
+ }
+}
+
+/*
+ * Start a transaction. This groups inserts and makes things
+ * much more efficient. Usually started when inserting
+ * file attributes.
+ */
+void db_start_transaction(B_DB *mdb)
+{
+#ifdef xAVE_SQLITE
+ db_lock(mdb);
+ /* Allow only 10,000 changes per transaction */
+ if (mdb->transaction && mdb->changes > 10000) {
+ db_end_transaction(mdb);
+ }
+ if (!mdb->transaction) {
+ my_sqlite_query(mdb, "BEGIN"); /* begin transaction */
+ Dmsg0(400, "Start SQLite transaction\n");
+ mdb->transaction = 1;
+ }
+ db_unlock(mdb);
+#endif
+
+}
+
+void db_end_transaction(B_DB *mdb)
+{
+#ifdef xAVE_SQLITE
+ db_lock(mdb);
+ if (mdb->transaction) {
+ my_sqlite_query(mdb, "COMMIT"); /* end transaction */
+ mdb->transaction = 0;
+ Dmsg1(400, "End SQLite transaction changes=%d\n", mdb->changes);
+ }
+ mdb->changes = 0;
+ db_unlock(mdb);
+#endif
+}
+
+
#endif /* HAVE_MYSQL | HAVE_SQLITE */