From e6faa15c99c45a5aed56b592f483149404d63855 Mon Sep 17 00:00:00 2001 From: Dan Langille Date: Tue, 9 Dec 2003 21:28:50 +0000 Subject: [PATCH] Modifications to take advantage of PostgreSQL support. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@846 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/cats/.cvsignore | 3 + bacula/src/cats/Makefile.in | 15 +++- bacula/src/cats/cats.h | 108 ++++++++++++++++++++++++-- bacula/src/cats/drop_bacula_tables.in | 10 ++- bacula/src/cats/make_bacula_tables.in | 9 ++- bacula/src/cats/sql.c | 11 ++- bacula/src/cats/sql_create.c | 6 +- bacula/src/cats/sql_delete.c | 4 +- bacula/src/cats/sql_find.c | 4 +- bacula/src/cats/sql_get.c | 4 +- bacula/src/cats/sql_list.c | 4 +- bacula/src/cats/sql_update.c | 4 +- 12 files changed, 152 insertions(+), 30 deletions(-) diff --git a/bacula/src/cats/.cvsignore b/bacula/src/cats/.cvsignore index e7a8344a05..06bb0ef58f 100644 --- a/bacula/src/cats/.cvsignore +++ b/bacula/src/cats/.cvsignore @@ -4,15 +4,18 @@ make_catalog_backup delete_catalog_backup create_bdb_database create_mysql_database +create_postgresql_database create_sqlite_database drop_bdb_tables drop_mysql_tables drop_sqlite_tables grant_mysql_privileges +grant_postgresql_privileges list_files.sql list_jobs.sql make_bdb_tables make_mysql_tables +make_postgresql_tables make_sqlite_tables mysql sqlite diff --git a/bacula/src/cats/Makefile.in b/bacula/src/cats/Makefile.in index ad9ad1dafe..a279830f46 100644 --- a/bacula/src/cats/Makefile.in +++ b/bacula/src/cats/Makefile.in @@ -12,6 +12,7 @@ topdir = ../.. thisdir = src/cats DEBUG=@DEBUG@ +MKDIR=$(topdir)/autoconf/mkinstalldirs SQL_INC=@SQL_INCLUDE@ @@ -25,11 +26,13 @@ SVROBJS = cats.o sql.o LIBSRCS = mysql.c bdb.c bdb_create.c bdb_get.c bdb_update.c \ bdb_delete.c bdb_find.c bdb_list.c \ sql.c sql_create.c sql_delete.c sql_find.c \ - sql_get.c sql_list.c sql_update.c sqlite.c + sql_get.c sql_list.c sql_update.c sqlite.c \ + postgresql.c LIBOBJS = mysql.o bdb.o bdb_create.o bdb_get.o bdb_update.o \ bdb_delete.o bdb_find.o bdb_list.o \ sql.o sql_create.o sql_delete.o sql_find.o \ - sql_get.o sql_list.o sql_update.o sqlite.o + sql_get.o sql_list.o sql_update.o sqlite.o \ + postgresql.o .SUFFIXES: .c .o .PHONY: @@ -61,19 +64,21 @@ clean: realclean: clean $(RMF) tags $(RMF) make_mysql_tables grant_mysql_privileges drop_mysql_tables - $(RMF) create_mysql_database make_sqlite_tables sqlite + $(RMF) make_postgresql_tables grant_postgresql_privileges drop_postgresql_tables + $(RMF) create_mysql_database create_postgresql_database make_sqlite_tables sqlite $(RMF) create_bdb_database drop_bdb_tables make_dbd_tables $(RMF) make_catalog_backup delete_catalog_backup $(RMF) update_mysql_tables update_sqlite_tables create_sqlite_database $(RMF) drop_bacula_tables drop_sqlite_tables make_bacula_tables $(RMF) update_bacula_tables - $(RMF) drop_bdb_tables make_bdb_tables mysql + $(RMF) drop_bdb_tables make_bdb_tables mysql postgresql distclean: realclean if test $(srcdir) = .; then $(MAKE) realclean; fi (cd $(srcdir); $(RMF) Makefile; $(RMF) -r CVS) install: + $(MKDIR) $(DESTDIR)$(datadir)/bacula $(INSTALL_SCRIPT) create_@DB_NAME@_database $(DESTDIR)$(scriptdir)/create_@DB_NAME@_database $(INSTALL_SCRIPT) drop_@DB_NAME@_tables $(DESTDIR)$(scriptdir)/drop_@DB_NAME@_tables $(INSTALL_SCRIPT) make_@DB_NAME@_tables $(DESTDIR)$(scriptdir)/make_@DB_NAME@_tables @@ -84,6 +89,7 @@ install: $(INSTALL_SCRIPT) make_catalog_backup $(DESTDIR)$(scriptdir)/make_catalog_backup $(INSTALL_SCRIPT) delete_catalog_backup $(DESTDIR)$(scriptdir)/delete_catalog_backup $(INSTALL_SCRIPT) grant_mysql_privileges $(DESTDIR)$(scriptdir)/grant_mysql_privileges + $(INSTALL_SCRIPT) grant_postgresql_privileges $(DESTDIR)$(scriptdir)/grant_postgresql_privileges uninstall: (cd $(DESTDIR)$(scriptdir); $(RMF) create_@DB_NAME@_database) @@ -96,6 +102,7 @@ uninstall: (cd $(DESTDIR)$(scriptdir); $(RMF) make_catalog_backup) (cd $(DESTDIR)$(scriptdir); $(RMF) delete_catalog_backup) (cd $(DESTDIR)$(scriptdir); $(RMF) grant_mysql_privileges) + (cd $(DESTDIR)$(scriptdir); $(RMF) grant_postgresql_privileges) # Semi-automatic generation of dependencies: diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index f17fecad42..0ce036b5e7 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -79,6 +79,7 @@ typedef struct s_db { brwlock_t lock; /* transaction lock */ struct sqlite *db; char **result; + int status; int nrow; /* nrow returned from sqlite */ int ncolumn; /* ncolum returned from sqlite */ int num_rows; /* used by code */ @@ -116,17 +117,17 @@ typedef struct s_db { * * S Q L I T E */ -#define sql_store_result(x) x->result +#define sql_store_result(x) (x)->result #define sql_free_result(x) my_sqlite_free_table(x) #define sql_fetch_row(x) my_sqlite_fetch_row(x) -#define sql_query(x, y) my_sqlite_query(x, y) +#define sql_query(x, y) my_sqlite_query((x), (y)) #define sql_close(x) sqlite_close((x)->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_data_seek(x, i) (x)->row = (i) #define sql_affected_rows(x) 1 #define sql_insert_id(x) sqlite_last_insert_rowid((x)->db) -#define sql_field_seek(x, y) my_sqlite_field_seek(x, y) +#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) (unsigned)((x)->ncolumn) #define SQL_ROW char** @@ -159,6 +160,7 @@ typedef struct s_db { MYSQL mysql; MYSQL *db; MYSQL_RES *result; + int status; my_ulonglong num_rows; int ref_count; char *db_name; @@ -182,24 +184,115 @@ typedef struct s_db { int pnl; /* path name length */ } B_DB; +#define DB_STATUS int /* "Generic" names for easier conversion */ #define sql_store_result(x) mysql_store_result((x)->db) #define sql_free_result(x) mysql_free_result((x)->result) #define sql_fetch_row(x) mysql_fetch_row((x)->result) -#define sql_query(x, y) mysql_query((x)->db, y) +#define sql_query(x, y) mysql_query((x)->db, (y)) #define sql_close(x) mysql_close((x)->db) #define sql_strerror(x) mysql_error((x)->db) #define sql_num_rows(x) mysql_num_rows((x)->result) -#define sql_data_seek(x, i) mysql_data_seek((x)->result, i) +#define sql_data_seek(x, i) mysql_data_seek((x)->result, (i)) #define sql_affected_rows(x) mysql_affected_rows((x)->db) #define sql_insert_id(x) mysql_insert_id((x)->db) -#define sql_field_seek(x, y) mysql_field_seek((x)->result, y) +#define sql_field_seek(x, y) mysql_field_seek((x)->result, (y)) #define sql_fetch_field(x) mysql_fetch_field((x)->result) #define sql_num_fields(x) mysql_num_fields((x)->result) #define SQL_ROW MYSQL_ROW #define SQL_FIELD MYSQL_FIELD +#else + +#ifdef HAVE_POSTGRESQL + +#define BDB_VERSION 7 + +#include + +/* TEMP: the following is taken from select OID, typname from pg_type; */ +#define IS_NUM(x) ((x) == 20 || (x) == 21 || (x) == 23 || (x) == 700 || (x) == 701 ) +#define IS_NOT_NULL(x) ((x) == 1) + +typedef char **POSTGRESQL_ROW; +typedef struct pg_field { + char *name; + unsigned int max_length; + unsigned int type; // 1 = number + unsigned int flags; // 1 == not null +} POSTGRESQL_FIELD; + + +/* + * This is the "real" definition that should only be + * used inside sql.c and associated database interface + * subroutines. + * + * P O S T G R E S Q L + */ +typedef struct s_db { + BQUEUE bq; /* queue control */ + brwlock_t lock; /* transaction lock */ + PGconn *db; + PGresult *result; + int status; + POSTGRESQL_ROW row; + POSTGRESQL_FIELD field; + int num_rows; + int num_fields; + int row_number; /* what row number did we get via my_postgresql_data_seek? */ + int field_number; /* what field number did we get via my_postgresql_field_seek? */ + int ref_count; + char *db_name; + char *db_user; + char *db_password; + char *db_address; /* host address */ + char *db_socket; /* socket for local access */ + int db_port; /* port of host address */ + int have_insert_id; /* do have insert_id() */ + int connected; + POOLMEM *errmsg; /* nicely edited error message */ + POOLMEM *cmd; /* SQL command string */ + POOLMEM *cached_path; + int cached_path_len; /* length of cached path */ + uint32_t cached_path_id; + int changes; /* changes made to db */ + POOLMEM *fname; /* Filename only */ + POOLMEM *path; /* Path only */ + POOLMEM *esc_name; /* Escaped file/path name */ + int fnl; /* file name length */ + int pnl; /* path name length */ + + int LastID; /* we need to set this during INSERT_DB ****WORK**** */ +} B_DB; + +POSTGRESQL_ROW my_postgresql_fetch_row (B_DB *mdb); +POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb); + +void my_postgresql_data_seek (B_DB *mdb, int row); +void my_postgresql_field_seek (B_DB *mdb, int row); +int my_postgresql_query (B_DB *mdb, char *query); +void my_postgresql_free_result(B_DB *mdb); + + +/* "Generic" names for easier conversion */ +#define sql_store_result(x) ((x)->result) +#define sql_free_result(x) my_postgresql_free_result(x) +#define sql_fetch_row(x) my_postgresql_fetch_row(x) +#define sql_query(x, y) my_postgresql_query((x), (y)) +#define sql_close(x) PQfinish((x)->db) +#define sql_strerror(x) PQresultErrorMessage((x)->result) +#define sql_num_rows(x) PQntuples((x)->result) +#define sql_data_seek(x, i) my_postgresql_data_seek((x), (i)) +#define sql_affected_rows(x) ((int) PQcmdTuples((x)->result)) +#define sql_insert_id(x) ((x)->LastID) +#define sql_field_seek(x, y) my_postgresql_field_seek((x), (y)) +#define sql_fetch_field(x) my_postgresql_fetch_field(x) +#define sql_num_fields(x) (x)->num_fields +#define SQL_ROW POSTGRESQL_ROW +#define SQL_FIELD POSTGRESQL_FIELD + #else /* USE BACULA DB routines */ #define HAVE_BACULA_DB 1 @@ -247,6 +340,7 @@ typedef struct s_db { #endif /* HAVE_MYSQL */ #endif /* HAVE_SQLITE */ +#endif /* HAVE_POSTGRESQL */ /* Use for better error location printing */ #define UPDATE_DB(jcr, db, cmd) UpdateDB(__FILE__, __LINE__, jcr, db, cmd) diff --git a/bacula/src/cats/drop_bacula_tables.in b/bacula/src/cats/drop_bacula_tables.in index fcfdf1ba9f..0ecc3f3864 100755 --- a/bacula/src/cats/drop_bacula_tables.in +++ b/bacula/src/cats/drop_bacula_tables.in @@ -7,6 +7,12 @@ if test xsqlite = x@DB_NAME@ ; then . ./drop_sqlite_tables echo "Dropped SQLite tables" else - . ./drop_mysql_tables - echo "Dropped MySQL tables" + if test xmysql = x@DB_NAME@ ; then + echo "Making MySQL tables" + . ./drop_mysql_tables + echo "Dropped MySQL tables" + else + . ./drop_postgresql_tables + echo "Dropped PostgreSQL tables" + fi fi diff --git a/bacula/src/cats/make_bacula_tables.in b/bacula/src/cats/make_bacula_tables.in index 158ae3b8c6..0195bb00ba 100755 --- a/bacula/src/cats/make_bacula_tables.in +++ b/bacula/src/cats/make_bacula_tables.in @@ -7,6 +7,11 @@ if test xsqlite = x@DB_NAME@ ; then echo "Making SQLite tables" . ./make_sqlite_tables else - echo "Making MySQL tables" - . ./make_mysql_tables + if test xmysql = x@DB_NAME@ ; then + echo "Making MySQL tables" + . ./make_mysql_tables + else + echo "Making PostgreSQL tables" + . ./make_postgresql_tables + fi fi diff --git a/bacula/src/cats/sql.c b/bacula/src/cats/sql.c index d8eb522741..16aebd1702 100644 --- a/bacula/src/cats/sql.c +++ b/bacula/src/cats/sql.c @@ -37,7 +37,7 @@ #include "bacula.h" #include "cats.h" -#if HAVE_MYSQL | HAVE_SQLITE +#if HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL uint32_t bacula_db_version = 0; @@ -52,11 +52,16 @@ static int int_handler(void *ctx, int num_fields, char **row) { uint32_t *val = (uint32_t *)ctx; + Dmsg1(50, "int_handler starts with row pointing at %x\n", row); + if (row[0]) { + Dmsg1(50, "int_handler finds '%s'\n", row[0]); *val = atoi(row[0]); } else { + Dmsg0(50, "int_handler finds zero\n"); *val = 0; } + Dmsg0(50, "int_handler finishes\n"); return 0; } @@ -75,7 +80,7 @@ int check_tables_version(JCR *jcr, B_DB *mdb) db_sql_query(mdb, query, int_handler, (void *)&bacula_db_version); if (bacula_db_version != BDB_VERSION) { Mmsg(&mdb->errmsg, "Version error for database \"%s\". Wanted %d, got %d\n", - mdb->db_name, BDB_VERSION, bacula_db_version); + mdb->db_name, BDB_VERSION, bacula_db_version); Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg); return 0; } @@ -332,4 +337,4 @@ void split_path_and_filename(JCR *jcr, B_DB *mdb, char *fname) Dmsg2(100, "sllit path=%s file=%s\n", mdb->path, mdb->fname); } -#endif /* HAVE_MYSQL | HAVE_SQLITE */ +#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index b4a95977c2..55684a825f 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -1,3 +1,5 @@ + + /* * Bacula Catalog Database Create record interface routines * @@ -34,7 +36,7 @@ #include "bacula.h" #include "cats.h" -#if HAVE_MYSQL || HAVE_SQLITE +#if HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL /* ----------------------------------------------------------------------- * @@ -706,4 +708,4 @@ static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) return ar->FilenameId > 0; } -#endif /* HAVE_MYSQL || HAVE_SQLITE */ +#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_delete.c b/bacula/src/cats/sql_delete.c index 5a0790804e..1a3bf4760f 100644 --- a/bacula/src/cats/sql_delete.c +++ b/bacula/src/cats/sql_delete.c @@ -37,7 +37,7 @@ #include "cats.h" -#if HAVE_MYSQL || HAVE_SQLITE +#if HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL /* ----------------------------------------------------------------------- * * Generic Routines (or almost generic) @@ -235,4 +235,4 @@ int db_purge_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) } -#endif /* HAVE_MYSQL || HAVE_SQLITE */ +#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_find.c b/bacula/src/cats/sql_find.c index 5e24511966..b2d454b584 100644 --- a/bacula/src/cats/sql_find.c +++ b/bacula/src/cats/sql_find.c @@ -39,7 +39,7 @@ #include "bacula.h" #include "cats.h" -#if HAVE_MYSQL || HAVE_SQLITE +#if HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL /* ----------------------------------------------------------------------- * @@ -306,4 +306,4 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr } -#endif /* HAVE_MYSQL || HAVE_SQLITE */ +#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index 29d28c8cac..4c47c1ebbd 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -38,7 +38,7 @@ #include "bacula.h" #include "cats.h" -#if HAVE_MYSQL || HAVE_SQLITE +#if HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL /* ----------------------------------------------------------------------- * @@ -857,4 +857,4 @@ FROM Media WHERE VolumeName='%s'", mr->VolumeName); } -#endif /* HAVE_MYSQL || HAVE_SQLITE */ +#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_list.c b/bacula/src/cats/sql_list.c index 8637c5c7b4..b084d5890d 100644 --- a/bacula/src/cats/sql_list.c +++ b/bacula/src/cats/sql_list.c @@ -34,7 +34,7 @@ #include "bacula.h" #include "cats.h" -#if HAVE_MYSQL || HAVE_SQLITE +#if HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL /* ----------------------------------------------------------------------- * @@ -324,4 +324,4 @@ AND Path.PathId=File.PathId", } -#endif /* HAVE_MYSQL || HAVE_SQLITE */ +#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */ diff --git a/bacula/src/cats/sql_update.c b/bacula/src/cats/sql_update.c index 5ab98254d6..1030bcb49f 100644 --- a/bacula/src/cats/sql_update.c +++ b/bacula/src/cats/sql_update.c @@ -34,7 +34,7 @@ #include "bacula.h" #include "cats.h" -#if HAVE_MYSQL || HAVE_SQLITE +#if HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL /* ----------------------------------------------------------------------- * @@ -312,4 +312,4 @@ db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) } } -#endif /* HAVE_MYSQL || HAVE_SQLITE */ +#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/ -- 2.39.5