X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fcats%2Fcats.h;h=b9bdc80babbdbc0da55493b9bfa289b0a4660807;hb=04ed7aa59b3c185e750b4d36260afa945612a497;hp=7d7e94e7c08fa196054a35560cd3f75649fc4272;hpb=7e99455734dfdf24d597e7e9cf61d9a935ec706a;p=bacula%2Fbacula diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index 7d7e94e7c0..b9bdc80bab 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2008 Free Software Foundation Europe e.V. + Copyright (C) 2000-2009 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. @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark of John Walker. + Bacula® is a registered trademark of Kern Sibbald. The licensor of Bacula is the Free Software Foundation Europe (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. @@ -42,7 +42,7 @@ */ /* - Here is how database versions work. + Here is how database versions work. While I am working on a new release with database changes, the update scripts are in the src/cats directory under the names @@ -59,7 +59,7 @@ will be copied to the updatedb directory with the correct name (in the present case 8 to 9). - Now, in principle, each of the different DB implementations + Now, in principle, each of the different DB implementations can have a different version, but in practice they are all the same (simplifies things). The exception is the internal database, which is no longer used, and hence, no longer changes. @@ -72,7 +72,8 @@ enum { SQL_TYPE_MYSQL = 0, SQL_TYPE_POSTGRESQL = 1, - SQL_TYPE_SQLITE = 2 + SQL_TYPE_SQLITE = 2, + SQL_TYPE_SQLITE3 }; @@ -87,7 +88,7 @@ typedef int (DB_RESULT_HANDLER)(void *, int, char **); #if defined(BUILDING_CATS) #ifdef HAVE_SQLITE -#define BDB_VERSION 10 +#define BDB_VERSION 11 #include @@ -165,27 +166,29 @@ struct B_DB { #ifdef HAVE_SQLITE3 #define sql_insert_id(x,y) sqlite3_last_insert_rowid((x)->db) #define sql_close(x) sqlite3_close((x)->db) +#define sql_affected_rows(x) sqlite3_changes((x)->db) #else #define sql_insert_id(x,y) sqlite_last_insert_rowid((x)->db) #define sql_close(x) sqlite_close((x)->db) +#define sql_affected_rows(x) 1 #endif #define sql_strerror(x) (x)->sqlite_errmsg?(x)->sqlite_errmsg:"unknown" #define sql_num_rows(x) (x)->nrow #define sql_data_seek(x, i) (x)->row = (i) -#define sql_affected_rows(x) 1 #define sql_field_seek(x, y) my_sqlite_field_seek((x), (y)) #define sql_fetch_field(x) my_sqlite_fetch_field(x) #define sql_num_fields(x) ((x)->ncolumn) #define SQL_ROW char** +#define SQL_MATCH "MATCH" -#define sql_batch_start(x,y) my_batch_start(x,y) -#define sql_batch_end(x,y,z) my_batch_end(x,y,z) +#define sql_batch_start(x,y) my_batch_start(x,y) +#define sql_batch_end(x,y,z) my_batch_end(x,y,z) #define sql_batch_insert(x,y,z) my_batch_insert(x,y,z) #define sql_batch_lock_path_query my_sqlite_batch_lock_query #define sql_batch_lock_filename_query my_sqlite_batch_lock_query #define sql_batch_unlock_tables_query my_sqlite_batch_unlock_query #define sql_batch_fill_filename_query my_sqlite_batch_fill_filename_query -#define sql_batch_fill_path_query my_sqlite_batch_fill_path_query +#define sql_batch_fill_path_query my_sqlite_batch_fill_path_query /* In cats/sqlite.c */ void my_sqlite_free_table(B_DB *mdb); @@ -202,12 +205,12 @@ extern const char* my_sqlite_batch_fill_path_query; #else /* S Q L I T E 3 */ - + #ifdef HAVE_SQLITE3 -#define BDB_VERSION 10 +#define BDB_VERSION 11 #include @@ -303,14 +306,15 @@ struct B_DB { #define sql_strerror(x) (x)->sqlite_errmsg?(x)->sqlite_errmsg:"unknown" #define sql_num_rows(x) (x)->nrow #define sql_data_seek(x, i) (x)->row = (i) -#define sql_affected_rows(x) 1 +#define sql_affected_rows(x) sqlite3_changes((x)->db) #define sql_field_seek(x, y) my_sqlite_field_seek((x), (y)) #define sql_fetch_field(x) my_sqlite_fetch_field(x) #define sql_num_fields(x) ((x)->ncolumn) -#define sql_batch_start(x,y) my_batch_start(x,y) -#define sql_batch_end(x,y,z) my_batch_end(x,y,z) +#define sql_batch_start(x,y) my_batch_start(x,y) +#define sql_batch_end(x,y,z) my_batch_end(x,y,z) #define sql_batch_insert(x,y,z) my_batch_insert(x,y,z) #define SQL_ROW char** +#define SQL_MATCH "MATCH" #define sql_batch_lock_path_query my_sqlite_batch_lock_query #define sql_batch_lock_filename_query my_sqlite_batch_lock_query #define sql_batch_unlock_tables_query my_sqlite_batch_unlock_query @@ -333,7 +337,7 @@ extern const char* my_sqlite_batch_fill_path_query; #ifdef HAVE_MYSQL -#define BDB_VERSION 10 +#define BDB_VERSION 11 #include @@ -366,6 +370,7 @@ struct B_DB { POOLMEM *cached_path; int cached_path_len; /* length of cached path */ uint32_t cached_path_id; + bool allow_transactions; /* transactions allowed */ int changes; /* changes made to db */ POOLMEM *fname; /* Filename only */ POOLMEM *path; /* Path only */ @@ -393,10 +398,11 @@ struct B_DB { #define sql_num_fields(x) (int)mysql_num_fields((x)->result) #define SQL_ROW MYSQL_ROW #define SQL_FIELD MYSQL_FIELD +#define SQL_MATCH "MATCH" #define sql_batch_start(x,y) my_batch_start(x,y) -#define sql_batch_end(x,y,z) my_batch_end(x,y,z) -#define sql_batch_insert(x,y,z) my_batch_insert(x,y,z) +#define sql_batch_end(x,y,z) my_batch_end(x,y,z) +#define sql_batch_insert(x,y,z) my_batch_insert(x,y,z) #define sql_batch_lock_path_query my_mysql_batch_lock_path_query #define sql_batch_lock_filename_query my_mysql_batch_lock_filename_query #define sql_batch_unlock_tables_query my_mysql_batch_unlock_tables_query @@ -415,7 +421,7 @@ extern void my_mysql_free_result(B_DB *mdb); #ifdef HAVE_POSTGRESQL -#define BDB_VERSION 10 +#define BDB_VERSION 11 #include @@ -476,13 +482,13 @@ struct B_DB { POOLMEM *esc_path; /* Escaped path name */ int fnl; /* file name length */ int pnl; /* path name length */ -}; +}; void my_postgresql_free_result(B_DB *mdb); POSTGRESQL_ROW my_postgresql_fetch_row (B_DB *mdb); int my_postgresql_query (B_DB *mdb, const char *query); void my_postgresql_data_seek (B_DB *mdb, int row); -int my_postgresql_currval (B_DB *mdb, char *table_name); +int my_postgresql_currval (B_DB *mdb, const char *table_name); void my_postgresql_field_seek (B_DB *mdb, int row); POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb); @@ -513,8 +519,8 @@ extern const char* my_pg_batch_fill_path_query; #define sql_fetch_field(x) my_postgresql_fetch_field(x) #define sql_num_fields(x) ((x)->num_fields) -#define sql_batch_start(x,y) my_postgresql_batch_start(x,y) -#define sql_batch_end(x,y,z) my_postgresql_batch_end(x,y,z) +#define sql_batch_start(x,y) my_postgresql_batch_start(x,y) +#define sql_batch_end(x,y,z) my_postgresql_batch_end(x,y,z) #define sql_batch_insert(x,y,z) my_postgresql_batch_insert(x,y,z) #define sql_batch_lock_path_query my_pg_batch_lock_path_query #define sql_batch_lock_filename_query my_pg_batch_lock_filename_query @@ -524,15 +530,20 @@ extern const char* my_pg_batch_fill_path_query; #define SQL_ROW POSTGRESQL_ROW #define SQL_FIELD POSTGRESQL_FIELD +#define SQL_MATCH "~" #else #ifdef HAVE_DBI -#define BDB_VERSION 10 +#define BDB_VERSION 11 #include +#ifdef HAVE_BATCH_FILE_INSERT +#include +#endif //HAVE_BATCH_FILE_INSERT + #define IS_NUM(x) ((x) == 1 || (x) == 2 ) #define IS_NOT_NULL(x) ((x) == (1 << 0)) @@ -544,6 +555,10 @@ typedef struct dbi_field { unsigned int flags; // 1 == not null } DBI_FIELD; +typedef struct dbi_field_get { + BQUEUE bq; + char *value; +} DBI_FIELD_GET; /* * This is the "real" definition that should only be @@ -557,9 +572,11 @@ struct B_DB { brwlock_t lock; /* transaction lock */ dbi_conn *db; dbi_result *result; + dbi_inst instance; dbi_error_flag status; DBI_ROW row; DBI_FIELD *fields; + DBI_FIELD_GET *field_get; int num_rows; int row_size; /* size of malloced rows */ int num_fields; @@ -592,7 +609,7 @@ struct B_DB { POOLMEM *esc_path; /* Escaped path name */ int fnl; /* file name length */ int pnl; /* path name length */ -}; +}; void my_dbi_free_result(B_DB *mdb); DBI_ROW my_dbi_fetch_row (B_DB *mdb); @@ -603,20 +620,25 @@ DBI_FIELD * my_dbi_fetch_field(B_DB *mdb); const char * my_dbi_strerror (B_DB *mdb); int my_dbi_getisnull (dbi_result *result, int row_number, int column_number); char * my_dbi_getvalue (dbi_result *result, int row_number, unsigned int column_number); +//int my_dbi_getvalue (dbi_result *result, int row_number, unsigned int column_number, char *value); int my_dbi_sql_insert_id(B_DB *mdb, char *table_name); -// TODO: do batch insert in DBI -//int my_dbi_batch_start(JCR *jcr, B_DB *mdb); -//int my_dbi_batch_end(JCR *jcr, B_DB *mdb, const char *error); -//typedef struct ATTR_DBR ATTR_DBR; -//int my_dbi_batch_insert(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); -//char *my_dbi_copy_escape(char *dest, char *src, size_t len); - -//extern const char* my_dbi_batch_lock_path_query; -//extern const char* my_dbi_batch_lock_filename_query; -//extern const char* my_dbi_batch_unlock_tables_query; -//extern const char* my_dbi_batch_fill_filename_query; -//extern const char* my_dbi_batch_fill_path_query; +int my_dbi_batch_start(JCR *jcr, B_DB *mdb); +int my_dbi_batch_end(JCR *jcr, B_DB *mdb, const char *error); +typedef struct ATTR_DBR ATTR_DBR; +int my_dbi_batch_insert(JCR *jcr, B_DB *mdb, ATTR_DBR *ar); +char *my_postgresql_copy_escape(char *dest, char *src, size_t len); +// typedefs for libdbi work with postgresql copy insert +typedef int (*custom_function_insert_t)(void*, const char*, int); +typedef char* (*custom_function_error_t)(void*); +typedef int (*custom_function_end_t)(void*, const char*); + +extern const char* my_dbi_batch_lock_path_query[4]; +extern const char* my_dbi_batch_lock_filename_query[4]; +extern const char* my_dbi_batch_unlock_tables_query[4]; +extern const char* my_dbi_batch_fill_filename_query[4]; +extern const char* my_dbi_batch_fill_path_query[4]; +extern const char* my_dbi_match[4]; /* "Generic" names for easier conversion */ #define sql_store_result(x) (x)->result @@ -627,21 +649,21 @@ int my_dbi_sql_insert_id(B_DB *mdb, char *table_name); #define sql_strerror(x) my_dbi_strerror(x) #define sql_num_rows(x) dbi_result_get_numrows((x)->result) #define sql_data_seek(x, i) my_dbi_data_seek((x), (i)) +#define SQL_MATCH my_dbi_match[db_type] /* #define sql_affected_rows(x) dbi_result_get_numrows_affected((x)->result) */ #define sql_affected_rows(x) 1 #define sql_insert_id(x,y) my_dbi_sql_insert_id((x), (y)) #define sql_field_seek(x, y) my_dbi_field_seek((x), (y)) #define sql_fetch_field(x) my_dbi_fetch_field(x) #define sql_num_fields(x) ((x)->num_fields) -// TODO: do dbi batch insert -#define sql_batch_start(x,y) my_dbi_batch_start(x,y) -#define sql_batch_end(x,y,z) my_dbi_batch_end(x,y,z) +#define sql_batch_start(x,y) my_dbi_batch_start(x,y) +#define sql_batch_end(x,y,z) my_dbi_batch_end(x,y,z) #define sql_batch_insert(x,y,z) my_dbi_batch_insert(x,y,z) -#define sql_batch_lock_path_query my_dbi_batch_lock_path_query -#define sql_batch_lock_filename_query my_dbi_batch_lock_filename_query -#define sql_batch_unlock_tables_query my_dbi_batch_unlock_tables_query -#define sql_batch_fill_filename_query my_dbi_batch_fill_filename_query -#define sql_batch_fill_path_query my_dbi_batch_fill_path_query +#define sql_batch_lock_path_query my_dbi_batch_lock_path_query[db_type] +#define sql_batch_lock_filename_query my_dbi_batch_lock_filename_query[db_type] +#define sql_batch_unlock_tables_query my_dbi_batch_unlock_tables_query[db_type] +#define sql_batch_fill_filename_query my_dbi_batch_fill_filename_query[db_type] +#define sql_batch_fill_path_query my_dbi_batch_fill_path_query[db_type] #define SQL_ROW DBI_ROW #define SQL_FIELD DBI_FIELD @@ -712,32 +734,19 @@ struct B_DB { */ struct B_DB { int dummy; /* for SunOS compiler */ -}; +}; #endif /* __SQL_C */ -/* ============================================================== +/* ============================================================== * - * What follows are definitions that are used "globally" for all + * What follows are definitions that are used "globally" for all * the different SQL engines and both inside and external to the * cats directory. */ extern uint32_t bacula_db_version; -/* - * These are the sizes of the current definitions of database - * Ids. In general, FileId_t can be set to uint64_t and it - * *should* work. Users have reported back that it does work - * for PostgreSQL. For the other types, all places in Bacula - * have been converted, but no one has actually tested it. - * In principle, the only field that really should need to be - * 64 bits is the FileId_t - */ -typedef uint32_t FileId_t; -typedef uint32_t DBId_t; /* general DB id type */ -typedef uint32_t JobId_t; - #define faddr_t long /* @@ -788,6 +797,7 @@ struct JOB_DBR { uint32_t JobErrors; uint32_t JobMissingFiles; uint64_t JobBytes; + uint64_t ReadBytes; int PurgedFiles; int HasBase; @@ -808,6 +818,7 @@ struct JOB_DBR { /* Extra stuff not in DB */ int limit; /* limit records to display */ faddr_t rec_addr; + uint32_t FileIndex; /* added during Verify */ }; /* Job Media information used to create the media records @@ -836,11 +847,10 @@ struct VOL_PARAMS { uint32_t VolIndex; /* Volume seqence no. */ uint32_t FirstIndex; /* First index this Volume */ uint32_t LastIndex; /* Last index this Volume */ - uint32_t StartFile; /* File for start of data */ - uint32_t EndFile; /* End file on Volume */ - uint32_t StartBlock; /* start block on tape */ - uint32_t EndBlock; /* last block */ int32_t Slot; /* Slot */ + uint64_t StartAddr; /* Start address */ + uint64_t EndAddr; /* End address */ + int32_t InChanger; /* InChanger flag */ // uint32_t Copy; /* identical copy */ // uint32_t Stripe; /* RAIT strip number */ }; @@ -856,6 +866,7 @@ struct ATTR_DBR { char *attr; /* attributes statp */ uint32_t FileIndex; uint32_t Stream; + uint32_t FileType; JobId_t JobId; DBId_t ClientId; DBId_t PathId; @@ -891,12 +902,14 @@ struct POOL_DBR { int32_t AcceptAnyVolume; /* set to accept any volume sequence */ int32_t AutoPrune; /* set to prune automatically */ int32_t Recycle; /* default Vol recycle flag */ + uint32_t ActionOnPurge; /* action on purge, e.g. truncate the disk volume */ utime_t VolRetention; /* retention period in seconds */ utime_t VolUseDuration; /* time in secs volume can be used */ uint32_t MaxVolJobs; /* Max Jobs on Volume */ uint32_t MaxVolFiles; /* Max files on Volume */ uint64_t MaxVolBytes; /* Max bytes on Volume */ DBId_t RecyclePoolId; /* RecyclePool destination when media is purged */ + DBId_t ScratchPoolId; /* ScratchPool source when media is needed */ char PoolType[MAX_NAME_LENGTH]; char LabelFormat[MAX_NAME_LENGTH]; /* Extra stuff not in DB */ @@ -965,6 +978,7 @@ struct MEDIA_DBR { uint64_t VolWriteTime; /* time spent writing volume */ utime_t VolRetention; /* Volume retention in seconds */ utime_t VolUseDuration; /* time in secs volume can be used */ + uint32_t ActionOnPurge; /* action on purge, e.g. truncate the disk volume */ uint32_t MaxVolJobs; /* Max Jobs on Volume */ uint32_t MaxVolFiles; /* Max files on Volume */ int32_t Recycle; /* recycle yes/no */ @@ -989,7 +1003,7 @@ struct MEDIA_DBR { char cLastWritten[MAX_TIME_LENGTH]; /* LastWritten returned from DB */ char cLabelDate[MAX_TIME_LENGTH]; /* LabelData returned from DB */ char cInitialWrite[MAX_TIME_LENGTH]; /* InitialWrite returned from DB */ - bool set_first_written; + bool set_first_written; bool set_label_date; }; @@ -1033,13 +1047,29 @@ struct db_int64_ctx { int count; /* number of values seen */ }; +/* Call back context for getting a list of comma separated strings from the + * database + */ +class db_list_ctx { +public: + POOLMEM *list; /* list */ + int count; /* number of values seen */ + + db_list_ctx() { list = get_pool_memory(PM_FNAME); *list = 0; count = 0; } + ~db_list_ctx() { free_pool_memory(list); list = NULL; } + +private: + db_list_ctx(const db_list_ctx&); /* prohibit pass by value */ + db_list_ctx &operator=(const db_list_ctx&); /* prohibit class assignment */ +}; + #include "protos.h" #include "jcr.h" #include "sql_cmds.h" /* - * Exported globals from sql.c + * Exported globals from sql.c */ extern int DLL_IMP_EXP db_type; /* SQL engine type index */