/*
* SQL header file
*
+ * by Kern E. Sibbald
+ *
* Anyone who accesses the database will need to include
* this file.
*
* the external world, and definitions destined only
* for the external world. This is control with
* the define __SQL_C, which is defined only in sql.c
+ *
+ * Version $Id$
*/
/*
#ifndef __SQL_H_
#define __SQL_H_ 1
-
+
typedef void (DB_LIST_HANDLER)(void *, char *);
typedef int (DB_RESULT_HANDLER)(void *, int, char **);
+
+#define db_lock(mdb) _db_lock(__FILE__, __LINE__, mdb)
+#define db_unlock(mdb) _db_unlock(__FILE__, __LINE__, mdb)
+
+#ifdef xxxxx_old_way_of_doing_it
+#define db_lock(mdb) P(mdb->mutex)
+#define db_unlock(mdb) V(mdb->mutex)
+#define db_lock(mdb) \
+ do { int errstat; if ((errstat=rwl_writelock(&(mdb->lock)))) \
+ e_msg(__FILE__, __LINE__, M_ABORT, 0, "rwl_writelock failure. ERR=%s\n",\
+ strerror(errstat)); \
+ } while(0)
+
+#define db_unlock(x) \
+ do { int errstat; if ((errstat=rwl_writeunlock(&(mdb->lock)))) \
+ e_msg(__FILE__, __LINE__, M_ABORT, 0, "rwl_writeunlock failure. ERR=%s\n",\
+ strerror(errstat)); \
+ } while(0)
+#endif
+
#ifdef __SQL_C
#ifdef HAVE_SQLITE
+#define BDB_VERSION 1
+
#include <sqlite.h>
/* Define opaque structure for sqlite */
*/
typedef struct s_db {
BQUEUE bq; /* queue control */
- pthread_mutex_t mutex;
+/* pthread_mutex_t mutex; */
+ rwlock_t lock; /* transaction lock */
struct sqlite *db;
char **result;
int nrow; /* nrow returned from sqlite */
char *db_password;
int connected;
char *sqlite_errmsg; /* error message returned by sqlite */
- char *errmsg; /* nicely edited error message */
- char *cmd; /* SQL command string */
+ POOLMEM *errmsg; /* nicely edited error message */
+ POOLMEM *cmd; /* SQL command string */
+ POOLMEM *cached_path;
+ uint32_t cached_path_id;
} B_DB;
#ifdef HAVE_MYSQL
+#define BDB_VERSION 1
+
#include <mysql.h>
/*
*/
typedef struct s_db {
BQUEUE bq; /* queue control */
- pthread_mutex_t mutex;
+/* pthread_mutex_t mutex; */
+ rwlock_t lock; /* transaction lock */
MYSQL mysql;
MYSQL *db;
MYSQL_RES *result;
char *db_password;
int have_insert_id; /* do have insert_id() */
int connected;
- char *errmsg; /* nicely edited error message */
- char *cmd; /* SQL command string */
+ POOLMEM *errmsg; /* nicely edited error message */
+ POOLMEM *cmd; /* SQL command string */
+ POOLMEM *cached_path;
+ uint32_t cached_path_id;
} B_DB;
/* Change this each time there is some incompatible
* file format change!!!!
*/
-#define BDB_VERSION 7 /* file version number */
+#define BDB_VERSION 9 /* file version number */
struct s_control {
int bdb_version; /* Version number */
*/
typedef struct s_db {
BQUEUE bq; /* queue control */
- pthread_mutex_t mutex; /* single thread lock */
+/* pthread_mutex_t mutex; */ /* single thread lock */
+ rwlock_t lock; /* transaction lock */
int ref_count; /* number of times opened */
struct s_control control; /* control file structure */
int cfd; /* control file device */
FILE *clientfd; /* Client records fd */
FILE *filesetfd; /* FileSet records fd */
char *db_name; /* name of database */
- char *errmsg; /* nicely edited error message */
- char *cmd; /* Command string */
+ POOLMEM *errmsg; /* nicely edited error message */
+ POOLMEM *cmd; /* Command string */
+ POOLMEM *cached_path;
+ uint32_t cached_path_id;
} B_DB;
#endif /* HAVE_MYSQL */
*/
/* Job record */
typedef struct {
- uint32_t JobId;
+ JobId_t JobId;
char Job[MAX_NAME_LENGTH]; /* Job unique name */
char Name[MAX_NAME_LENGTH]; /* Job base name */
int Type; /* actually char(1) */
time_t SchedTime; /* Time job scheduled */
time_t StartTime; /* Job start time */
time_t EndTime; /* Job termination time */
+ btime_t JobTDate; /* Backup time/date in seconds */
uint32_t VolSessionId;
uint32_t VolSessionTime;
uint32_t JobFiles;
/* JobMedia record */
typedef struct {
uint32_t JobMediaId; /* record id */
- uint32_t JobId; /* JobId */
+ JobId_t JobId; /* JobId */
uint32_t MediaId; /* MediaId */
uint32_t FirstIndex; /* First index this Volume */
uint32_t LastIndex; /* Last index this Volume */
} JOBMEDIA_DBR;
-
-
/* Attributes record -- NOT same as in database because
* in general, this "record" creates multiple database
* records (e.g. pathname, filename, fileattributes).
char *attr; /* attributes statp */
uint32_t FileIndex;
uint32_t Stream;
- uint32_t JobId;
+ JobId_t JobId;
uint32_t ClientId;
uint32_t PathId;
uint32_t FilenameId;
typedef struct {
FileId_t FileId;
uint32_t FileIndex;
- uint32_t JobId;
+ JobId_t JobId;
uint32_t FilenameId;
uint32_t PathId;
char LStat[256];
int UseOnce; /* set to use once only */
int UseCatalog; /* set to use catalog */
int AcceptAnyVolume; /* set to accept any volume sequence */
- int AutoRecycle; /* set to recycle automatically */
- uint32_t VolumeRetention; /* retention period in seconds */
+ int AutoPrune; /* set to prune automatically */
+ int Recycle; /* default Vol recycle flag */
+ btime_t VolRetention; /* retention period in seconds */
char PoolType[MAX_NAME_LENGTH];
char LabelFormat[MAX_NAME_LENGTH];
/* Extra stuff not in DB */
uint64_t VolBytes; /* Number of bytes written */
uint64_t VolMaxBytes; /* max bytes to write */
uint64_t VolCapacityBytes; /* capacity estimate */
+ btime_t VolRetention; /* Volume retention in seconds */
+ int Recycle; /* recycle yes/no */
char VolStatus[20]; /* Volume status */
- char Recycle[20]; /* Recycle yes/no */
/* Extra stuff not in DB */
faddr_t rec_addr; /* found record address */
} MEDIA_DBR;
/* Client record -- same as the database */
typedef struct {
uint32_t ClientId; /* Unique Client id */
+ int AutoPrune;
+ btime_t FileRetention;
+ btime_t JobRetention;
char Name[MAX_NAME_LENGTH]; /* Client name */
char Uname[256]; /* Uname for client */
} CLIENT_DBR;
} FILESET_DBR;
-
#include "protos.h"
-
#include "jcr.h"
-
+
#endif /* __SQL_H_ */