* system.
*
* Kern Sibbald, January MMI
+ *
+ * Version $Id$
+ *
*/
+
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
#ifdef HAVE_BACULA_DB
+uint32_t bacula_db_version = 0;
+
/* Forward referenced functions */
-extern char *working_directory;
+extern const char *working_directory;
/* List of open databases */
static BQUEUE db_list = {&db_list, &db_list};
#define DB_CLIENT_FILENAME "client.db"
#define DB_FILESET_FILENAME "fileset.db"
-static char *make_filename(B_DB *mdb, char *name)
+static POOLMEM *make_filename(B_DB *mdb, char *name)
{
- char *dbf, sep;
+ char sep;
+ POOLMEM *dbf;
- dbf = (char *) get_pool_memory(PM_FNAME);
+ dbf = get_pool_memory(PM_FNAME);
if (working_directory[strlen(working_directory)-1] == '/') {
sep = 0;
} else {
sep = '/';
}
- Mmsg(&dbf, "%s%c%s-%s", working_directory, sep, mdb->db_name, name);
+ Mmsg(dbf, "%s%c%s-%s", working_directory, sep, mdb->db_name, name);
return dbf;
}
* never have errors, or it is really fatal.
*/
B_DB *
-db_init_database(char *db_name, char *db_user, char *db_password)
+db_init_database(JCR *jcr, char *db_name, char *db_user, char *db_password,
+ char *db_address, int db_port, char *db_socket)
{
B_DB *mdb;
P(mutex); /* lock DB queue */
}
}
Dmsg0(200, "db_open first time\n");
- mdb = (B_DB *) malloc(sizeof(B_DB));
+ mdb = (B_DB *)malloc(sizeof(B_DB));
memset(mdb, 0, sizeof(B_DB));
Dmsg0(200, "DB struct init\n");
mdb->db_name = bstrdup(db_name);
- mdb->errmsg = (char *) get_pool_memory(PM_EMSG);
+ mdb->errmsg = get_pool_memory(PM_EMSG);
*mdb->errmsg = 0;
- mdb->cmd = (char *) get_pool_memory(PM_EMSG); /* command buffer */
+ mdb->cmd = get_pool_memory(PM_EMSG); /* command buffer */
mdb->ref_count = 1;
+ mdb->cached_path = get_pool_memory(PM_FNAME);
+ mdb->cached_path_id = 0;
qinsert(&db_list, &mdb->bq); /* put db in list */
Dmsg0(200, "Done db_open_database()\n");
mdb->cfd = -1;
V(mutex);
+ Jmsg(jcr, M_WARNING, 0, _("WARNING!!!! The Internal Database is for TESTING ONLY!\n"));
+ Jmsg(jcr, M_WARNING, 0, _("You should use either SQLite or MySQL\n"));
+
return mdb;
}
* which are returned in the errmsg
*/
int
-db_open_database(B_DB *mdb)
+db_open_database(JCR *jcr, B_DB *mdb)
{
char *dbf;
int fd, badctl;
- int errstat;
off_t filend;
+ int errstat;
Dmsg1(200, "db_open_database() %s\n", mdb->db_name);
P(mutex);
- if ((errstat = pthread_mutex_init(&(mdb->mutex), NULL)) != 0) {
- Mmsg1(&mdb->errmsg, "Unable to initialize DB mutex. ERR=%s\n", strerror(errstat));
+
+ if ((errstat=rwl_init(&mdb->lock)) != 0) {
+ Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"), strerror(errstat));
V(mutex);
return 0;
}
- P(mdb->mutex); /* test it once */
- V(mdb->mutex);
Dmsg0(200, "make_filename\n");
dbf = make_filename(mdb, DB_CONTROL_FILENAME);
mdb->cfd = open(dbf, O_CREAT|O_RDWR, 0600);
free_memory(dbf);
if (mdb->cfd < 0) {
- Mmsg2(&mdb->errmsg, "Unable to open Catalog DB control file %s: ERR=%s\n",
+ Mmsg2(&mdb->errmsg, _("Unable to open Catalog DB control file %s: ERR=%s\n"),
dbf, strerror(errno));
V(mutex);
return 0;
badctl = 0;
lseek(mdb->cfd, 0, SEEK_SET); /* seek to begining of control file */
if (read(mdb->cfd, &mdb->control, sizeof(mdb->control)) != sizeof(mdb->control)) {
- Mmsg1(&mdb->errmsg, "Error reading catalog DB control file. ERR=%s\n", strerror(errno));
+ Mmsg1(&mdb->errmsg, _("Error reading catalog DB control file. ERR=%s\n"), strerror(errno));
badctl = 1;
} else if (mdb->control.bdb_version != BDB_VERSION) {
- Mmsg2(&mdb->errmsg, "Error, catalog DB control file wrong version. \
+ Mmsg2(&mdb->errmsg, _("Error, catalog DB control file wrong version. \
Wanted %d, got %d\n\
-Please reinitialize the working directory.\n",
+Please reinitialize the working directory.\n"),
BDB_VERSION, mdb->control.bdb_version);
badctl = 1;
}
+ bacula_db_version = mdb->control.bdb_version;
if (badctl) {
V(mutex);
return 0;
return 1;
}
-void db_close_database(B_DB *mdb)
+void db_close_database(JCR *jcr, B_DB *mdb)
{
P(mutex);
mdb->ref_count--;
if (mdb->filesetfd) {
fclose(mdb->filesetfd);
}
- pthread_mutex_destroy(&mdb->mutex);
+ rwl_destroy(&mdb->lock);
free_pool_memory(mdb->errmsg);
free_pool_memory(mdb->cmd);
+ free_pool_memory(mdb->cached_path);
free(mdb);
}
V(mutex);
void db_escape_string(char *snew, char *old, int len)
{
- strcpy(snew, old);
+ memset(snew, 0, len);
+ bstrncpy(snew, old, len);
}
char *db_strerror(B_DB *mdb)
return 1;
}
+
+void _db_lock(char *file, int line, B_DB *mdb)
+{
+ int errstat;
+ if ((errstat=rwl_writelock(&mdb->lock)) != 0) {
+ e_msg(file, line, 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) {
+ e_msg(file, line, 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(JCR *jcr, B_DB *mdb)
+{
+}
+
+void db_end_transaction(JCR *jcr, B_DB *mdb)
+{
+}
+
+
#endif /* HAVE_BACULA_DB */