The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
This program is Free Software; you can redistribute it and/or
- modify it under the terms of version two of the GNU General Public
+ modify it under the terms of version three of the GNU Affero General Public
License as published by the Free Software Foundation and included
in the file LICENSE.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
- You should have received a copy of the GNU General Public License
+ You should have received a copy of the GNU Affero General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
*
* Kern Sibbald, March 2000
*
- * Version $Id$
+ * Version $Id: sql.c 8034 2008-11-11 14:33:46Z ricozz $
*/
/* The following is necessary so that we do not include
#include "bacula.h"
#include "cats.h"
-#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI
+#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI
uint32_t bacula_db_version = 0;
db_type = SQL_TYPE_SQLITE;
} else if (strcasecmp(p, "sqlite3") == 0) {
db_type = SQL_TYPE_SQLITE3;
+ } else if (strcasecmp(p, "ingres") == 0) {
+ db_type = SQL_TYPE_INGRES;
} else {
Jmsg1(jcr, M_ABORT, 0, _("Unknown database type: %s\n"), p);
}
db_type = SQL_TYPE_MYSQL;
#elif HAVE_POSTGRESQL
db_type = SQL_TYPE_POSTGRESQL;
+#elif HAVE_INGRES
+ db_type = SQL_TYPE_INGRES;
#elif HAVE_SQLITE
db_type = SQL_TYPE_SQLITE;
#elif HAVE_SQLITE3
*/
bool db_check_max_connections(JCR *jcr, B_DB *mdb, uint32_t max_concurrent_jobs)
{
- uint32_t max_conn=0;
- int ret=true;
+#ifdef HAVE_BATCH_FILE_INSERT
- /* Without Batch insert, no need to verify max_connections */
-#ifndef HAVE_BATCH_FILE_INSERT
- return ret;
-#endif
+ uint32_t max_conn = 0;
- /* Check max_connections setting */
- if (!db_sql_query(mdb, sql_get_max_connections[db_type], db_max_connections_handler, &max_conn)) {
+ /* With Batch insert, verify max_connections */
+ if (!db_sql_query(mdb, sql_get_max_connections[db_type],
+ db_max_connections_handler, &max_conn)) {
Jmsg(jcr, M_ERROR, 0, "Can't verify max_connections settings %s", mdb->errmsg);
- return ret;
+ return false;
}
- if (max_conn && max_concurrent_jobs && max_concurrent_jobs > max_conn) {
+ if (max_conn && max_concurrent_jobs > max_conn) {
Mmsg(mdb->errmsg,
- _("On db_name=%s, %s max_connections=%d is lower than Director MaxConcurentJobs=%d\n"),
- mdb->db_name, db_get_type(), max_conn, max_concurrent_jobs);
+ _("Potential performance problem:\n"
+ "max_connections=%d set for %s database \"%s\" should be larger than Director's "
+ "MaxConcurrentJobs=%d\n"),
+ max_conn, db_get_type(), mdb->db_name, max_concurrent_jobs);
Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg);
- ret = false;
+ return false;
}
- return ret;
+#endif
+
+ return true;
}
/* NOTE!!! The following routines expect that the
}
return 0;
}
- if (mdb->have_insert_id) {
- mdb->num_rows = sql_affected_rows(mdb);
- } else {
- mdb->num_rows = 1;
- }
+ mdb->num_rows = sql_affected_rows(mdb);
if (mdb->num_rows != 1) {
char ed1[30];
m_msg(file, line, &mdb->errmsg, _("Insertion problem: affected_rows=%s\n"),
void _db_lock(const char *file, int line, B_DB *mdb)
{
int errstat;
- if ((errstat=rwl_writelock(&mdb->lock)) != 0) {
+ if ((errstat=rwl_writelock_p(&mdb->lock, file, line)) != 0) {
berrno be;
e_msg(file, line, M_FATAL, 0, "rwl_writelock failure. stat=%d: ERR=%s\n",
errstat, be.bstrerror(errstat));
db_unlock(mdb);
#endif
+#ifdef HAVE_INGRES
+ if (!mdb->allow_transactions) {
+ return;
+ }
+ db_lock(mdb);
+ /* Allow only 25,000 changes per transaction */
+ if (mdb->transaction && mdb->changes > 25000) {
+ db_end_transaction(jcr, mdb);
+ }
+ if (!mdb->transaction) {
+ db_sql_query(mdb, "BEGIN", NULL, NULL); /* begin transaction */
+ Dmsg0(400, "Start Ingres transaction\n");
+ mdb->transaction = 1;
+ }
+ db_unlock(mdb);
+#endif
+
#ifdef HAVE_DBI
if (db_type == SQL_TYPE_SQLITE) {
if (!mdb->allow_transactions) {
db_unlock(mdb);
#endif
+
+
+#ifdef HAVE_INGRES
+ if (!mdb->allow_transactions) {
+ return;
+ }
+ db_lock(mdb);
+ if (mdb->transaction) {
+ db_sql_query(mdb, "COMMIT", NULL, NULL); /* end transaction */
+ mdb->transaction = 0;
+ Dmsg1(400, "End Ingres transaction changes=%d\n", mdb->changes);
+ }
+ mdb->changes = 0;
+ db_unlock(mdb);
+#endif
+
+
#ifdef HAVE_POSTGRESQL
if (!mdb->allow_transactions) {
return;
* ie, after a fatal signal and before exiting the program
* Print information about a B_DB object.
*/
-void dbg_print_db(JCR *jcr, FILE *fp)
+void db_debug_print(JCR *jcr, FILE *fp)
{
B_DB *mdb = jcr->db;
}
}
-#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/
+#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_INGRES*/