/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
*
* Almost generic set of SQL database interface routines
* (with a little more work)
+ * SQL engine specific routines are in mysql.c, postgresql.c,
+ * sqlite.c, ...
*
* Kern Sibbald, March 2000
*
#include "bacula.h"
#include "cats.h"
-#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL
+#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI
uint32_t bacula_db_version = 0;
+int db_type = -1;
+
/* Forward referenced subroutines */
void print_dashes(B_DB *mdb);
void print_result(B_DB *mdb);
+B_DB *db_init(JCR *jcr, const char *db_driver, const char *db_name, const char *db_user,
+ const char *db_password, const char *db_address, int db_port,
+ const char *db_socket, int mult_db_connections)
+{
+#ifdef HAVE_DBI
+ char *p;
+ if (!db_driver) {
+ Jmsg0(jcr, M_ABORT, 0, _("Driver type not specified in Catalog resource.\n"));
+ }
+ if (strlen(db_driver) < 5 || db_driver[3] != ':' || strncasecmp(db_driver, "dbi", 3) != 0) {
+ Jmsg0(jcr, M_ABORT, 0, _("Invalid driver type, must be \"dbi:<type>\"\n"));
+ }
+ p = (char *)(db_driver + 4);
+ if (strcasecmp(p, "mysql") == 0) {
+ db_type = SQL_TYPE_MYSQL;
+ } else if (strcasecmp(p, "postgresql") == 0) {
+ db_type = SQL_TYPE_POSTGRESQL;
+ } else if (strcasecmp(p, "sqlite") == 0) {
+ db_type = SQL_TYPE_SQLITE;
+ } else {
+ Jmsg1(jcr, M_ABORT, 0, _("Unknown database type: %s\n"), p);
+ }
+#elif HAVE_MYSQL
+ db_type = SQL_TYPE_MYSQL;
+#elif HAVE_POSTGRESQL
+ db_type = SQL_TYPE_POSTGRESQL;
+#elif HAVE_SQLITE
+ db_type = SQL_TYPE_SQLITE;
+#elif HAVE_SQLITE3
+ db_type = SQL_TYPE_SQLITE;
+#endif
+
+ return db_init_database(jcr, db_name, db_user, db_password, db_address,
+ db_port, db_socket, mult_db_connections);
+}
+
+dbid_list::dbid_list()
+{
+ memset(this, 0, sizeof(dbid_list));
+ max_ids = 1000;
+ DBId = (DBId_t *)malloc(max_ids * sizeof(DBId_t));
+ num_ids = num_seen = tot_ids = 0;
+ PurgedFiles = NULL;
+}
+
+dbid_list::~dbid_list()
+{
+ free(DBId);
+}
+
+
/*
* Called here to retrieve an integer from the database
*/
bacula_db_version = 0;
if (!db_sql_query(mdb, query, int_handler, (void *)&bacula_db_version)) {
- Mmsg(mdb->errmsg, "Database not created or server not running.\n");
Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
return false;
}
send(ctx, "+");
for (i = 0; i < sql_num_fields(mdb); i++) {
field = sql_fetch_field(mdb);
+ if (!field) {
+ break;
+ }
for (j = 0; j < (int)field->max_length + 2; j++) {
send(ctx, "-");
}
for (i = 0; i < sql_num_fields(mdb); i++) {
Dmsg1(800, "list_result processing field %d\n", i);
field = sql_fetch_field(mdb);
+ if (!field) {
+ break;
+ }
col_len = cstrlen(field->name);
if (type == VERT_LIST) {
if (col_len > max_len) {
for (i = 0; i < sql_num_fields(mdb); i++) {
Dmsg1(800, "list_result looking at field %d\n", i);
field = sql_fetch_field(mdb);
+ if (!field) {
+ break;
+ }
bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, field->name);
send(ctx, buf);
}
send(ctx, "|");
for (i = 0; i < sql_num_fields(mdb); i++) {
field = sql_fetch_field(mdb);
+ if (!field) {
+ break;
+ }
if (row[i] == NULL) {
bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, "NULL");
} else if (IS_NUM(field->type) && !jcr->gui && is_an_integer(row[i])) {
sql_field_seek(mdb, 0);
for (i = 0; i < sql_num_fields(mdb); i++) {
field = sql_fetch_field(mdb);
+ if (!field) {
+ break;
+ }
if (row[i] == NULL) {
bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL");
} else if (IS_NUM(field->type) && !jcr->gui && is_an_integer(row[i])) {