X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/b0aa8860b8fc1ae8482eae9aa7a9994e4def5567..ff55cce0a8b6abecf86ffd55a2eb3bf97a79dd7e:/ODBC-dblog.diff diff --git a/ODBC-dblog.diff b/ODBC-dblog.diff index 00f334e..574b5a4 100644 --- a/ODBC-dblog.diff +++ b/ODBC-dblog.diff @@ -1,152 +1,155 @@ Add support for logging daemon messages to an SQL database. -After applying this patch you'll need to run autoconf and autoheader to -generate updated versions of "configure" and "config.h.in". +After applying this patch, run these commands for a successful build: -You'll need to run configure with the --with-ODBC option in order for the -extended features to be active. + autoconf + autoheader + ./configure --with-ODBC + make proto + make -Patch provided by Steve Sether. +Steve Sether writes: -(Tweaked by Wayne Davison for rsync-style purposes but not compiled, so if the -dblog.c file has a compile problem, it's probably my fault...) +This patch adds the following options: +"database logging" + If set to True, rsync will attempt to connect to + the specified datasource and write to the named tables. + Defaults to False. ---- README-ODBC 2004-02-13 17:08:33.000000000 -0800 -+++ README-ODBC 2004-04-07 22:42:28.000000000 -0700 -@@ -0,0 +1,80 @@ -+This patch adds the following options: -+ -+"database logging" -+If set to True, rsync will attempt to connect to -+the specified datasource and write to the named tables. -+Defaults to False. -+ -+ -+"database datasource" -+Specifies the name of the ODBC data source to use. -+ -+"database username" -+The username to use when connecting to the database. -+ -+"database password" -+The password to use when connecting to the database. -+ -+"transfer table name" -+The name of the transfer table to log to. -+This table contains individual filenames, file sizes, bytes transferred, checksum bytes transferred, operation (send or receive), and a timestamp. -+ -+"session table name" -+The name of the session table to log to. -+This table contains the username, module name, module path, ip address, process ID, and a timestamp. -+ -+"exit table name" -+The name of the exit table to log to. -+This table contains the total bytes read, total bytes written, total size -+of all files, error code, line the error occured at, file the error occured at -+and the text of the error. (most of which will be blank if the program exited normally). -+ -+ -+"unique id method" -+Different databases use different methods to get a unique identifier. -+Some databases support sequence objects, and use various forms of the -+nextval command to retrieve a unique identifier from it. Other databases -+support an autonumber field, and support different methds of retrieving -+the ID used in the last insert. Valid values for this option are: -+ -+ nextval-postgres -+ uses the syntax of nextval for PostgreSQL databases -+ -+ nextval-oracle -+ uses the syntax of nextval for Oracle databases -+ -+ nextval-db2 -+ uses the syntax of nextval for DB2 databases -+ -+ last_insert_id -+ uses the last_insert_id() command for the MySQL databases -+ -+ @@IDENTITY -+ uses the @@IDENTITY command for Sybase databases -+ -+ custom -+ Define your own method to get a unique identifier. See the -+ "custom unique id select", and the "get custom id before select" -+ parameters. -+ -+ -+"sequence name" -+If your database supports sequences, list the name of the sequence to use -+for the session unique identifier. -+ -+"custom unique id select" -+Only used if you specify the custom method in "unique id method". This -+is a SQL statement to be executed to get a unique ID. This SQL -+statement must return one column with the unique ID to use for -+the session ID. Should be used in concert with the "get custom -+id before select" parameter. -+ -+"get custom id before insert" -+This parameter is ignored unless the "unique id method" is set to custom. -+If set to true, the "custom unique id select" statement will -+be executed BEFORE the session row is inserted into the database. -+(as is done when a sequence is used for unique IDs). -+If False the statement will be executed after the session -+row is inserted (as is done when the session ID is automatically generates -+unique IDs). -+Defaults to True. ---- Makefile.in 10 Feb 2004 17:06:11 -0000 1.98 -+++ Makefile.in 8 Apr 2004 05:56:31 -0000 -@@ -32,7 +32,7 @@ ZLIBOBJ=zlib/deflate.o zlib/infblock.o z - zlib/inflate.o zlib/inftrees.o zlib/infutil.o zlib/trees.o \ - zlib/zutil.o zlib/adler32.o +"database datasource" + Specifies the name of the ODBC data source to use. + +"database username" + The username to use when connecting to the database. + +"database password" + The password to use when connecting to the database. + +"transfer table name" + The name of the transfer table to log to. This table contains individual + filenames, file sizes, bytes transferred, checksum bytes transferred, + operation (send or receive), and a timestamp. + +"session table name" + The name of the session table to log to. This table contains the username, + module name, module path, ip address, process ID, and a timestamp. + +"exit table name" + + The name of the exit table to log to. This table contains the total bytes + read, total bytes written, total size of all files, error code, line the + error occured at, file the error occured at and the text of the error. + (most of which will be blank if the program exited normally). + +"unique id method" + Different databases use different methods to get a unique identifier. + Some databases support sequence objects, and use various forms of the + nextval command to retrieve a unique identifier from it. Other databases + support an autonumber field, and support different methds of retrieving + the ID used in the last insert. Valid values for this option are: + + nextval-postgres + uses the syntax of nextval for PostgreSQL databases + + nextval-oracle + uses the syntax of nextval for Oracle databases + + nextval-db2 + uses the syntax of nextval for DB2 databases + + last_insert_id + uses the last_insert_id() command for the MySQL databases + + @@IDENTITY + uses the @@IDENTITY command for Sybase databases + + custom + Define your own method to get a unique identifier. See the + "custom unique id select", and the "get custom id before select" + parameters. + +"sequence name" + If your database supports sequences, list the name of the sequence to use + for the session unique identifier. + +"custom unique id select" + Only used if you specify the custom method in "unique id method". This is + a SQL statement to be executed to get a unique ID. This SQL statement must + return one column with the unique ID to use for the session ID. Should be + used in concert with the "get custom id before select" parameter. + +"get custom id before insert" + This parameter is ignored unless the "unique id method" is set to custom. + If set to true, the "custom unique id select" statement will be executed + BEFORE the session row is inserted into the database. (as is done when a + sequence is used for unique IDs). If False the statement will be executed + after the session row is inserted (as is done when the session ID is + automatically generates unique IDs). Defaults to True. + +--- orig/Makefile.in 2005-07-07 23:11:07 ++++ Makefile.in 2005-05-23 23:31:30 +@@ -31,7 +31,7 @@ LIBOBJ=lib/wildmatch.o lib/compat.o lib/ + ZLIBOBJ=zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o \ + zlib/trees.o zlib/zutil.o zlib/adler32.o zlib/compress.o zlib/crc32.o OBJS1=rsync.o generator.o receiver.o cleanup.o sender.o exclude.o util.o \ - main.o checksum.o match.o syscall.o log.o backup.o + main.o checksum.o match.o syscall.o log.o backup.o @EXTRA_OBJECT@ OBJS2=options.o flist.o io.o compat.o hlink.o token.o uidlist.o socket.o \ fileio.o batch.o clientname.o OBJS3=progress.o pipe.o ---- cleanup.c 27 Jan 2004 08:14:33 -0000 1.21 -+++ cleanup.c 8 Apr 2004 05:56:31 -0000 -@@ -138,7 +138,12 @@ void _exit_cleanup(int code, const char - code = RERR_VANISHED; +--- orig/cleanup.c 2005-03-05 18:58:38 ++++ cleanup.c 2005-05-23 23:28:28 +@@ -39,6 +39,10 @@ void close_all(void) + int ret; + STRUCT_STAT st; + ++#ifdef HAVE_LIBODBC ++ db_log_close(); ++#endif ++ + max_fd = sysconf(_SC_OPEN_MAX) - 1; + for (fd = max_fd; fd >= 0; fd--) { + if ((ret = do_fstat(fd, &st)) == 0) { +@@ -144,8 +148,12 @@ void _exit_cleanup(int code, const char + code = RERR_PARTIAL; } -- if (code) log_exit(code, file, line); +- if (code) + if (code) { -+ log_exit(code, file, line); + log_exit(code, file, line); +#ifdef HAVE_LIBODBC + db_log_exit(code,file,line); +#endif + } - if (verbose > 2) - rprintf(FINFO,"_exit_cleanup(code=%d, file=%s, line=%d): about to call exit(%d)\n", ---- clientserver.c 14 Apr 2004 23:33:34 -0000 1.121 -+++ clientserver.c 15 Apr 2004 18:51:14 -0000 -@@ -311,6 +311,9 @@ static int rsync_module(int f_in, int f_ - exclude_path_prefix = NULL; + if (verbose > 2) { + rprintf(FINFO,"_exit_cleanup(code=%d, file=%s, line=%d): about to call exit(%d)\n", +--- orig/clientserver.c 2005-08-17 06:45:07 ++++ clientserver.c 2005-05-23 23:29:31 +@@ -348,6 +348,9 @@ static int rsync_module(int f_in, int f_ + XFLG_ANCHORED2ABS | XFLG_OLD_PREFIXES); log_init(); +#ifdef HAVE_LIBODBC + db_log_open(); +#endif - if (use_chroot) { - /* -@@ -429,6 +432,9 @@ static int rsync_module(int f_in, int f_ - rprintf(FINFO,"rsync %s %s from %s@%s (%s)\n", - am_sender?"on":"to", + #ifdef HAVE_PUTENV + s = lp_prexfer_exec(i); +@@ -524,6 +527,9 @@ static int rsync_module(int f_in, int f_ + rprintf(FLOG, "rsync %s %s from %s@%s (%s)\n", + am_sender ? "on" : "to", request, auth_user, host, addr); +#ifdef HAVE_LIBODBC + db_log_session(); +#endif } else { - rprintf(FINFO,"rsync %s %s from %s (%s)\n", - am_sender?"on":"to", ---- configure.in 9 Apr 2004 18:09:16 -0000 1.190 -+++ configure.in 15 Apr 2004 18:51:14 -0000 -@@ -94,6 +94,8 @@ AC_ARG_WITH(rsync-path, + rprintf(FLOG, "rsync %s %s from %s (%s)\n", + am_sender ? "on" : "to", +--- orig/configure.in 2005-07-29 02:47:19 ++++ configure.in 2005-05-23 23:32:21 +@@ -92,6 +92,8 @@ AC_ARG_WITH(rsync-path, [ --with-rsync-path=PATH set default --rsync-path to PATH (default: rsync)], [ RSYNC_PATH="$with_rsync_path" ], [ RSYNC_PATH="rsync" ]) @@ -155,24 +158,118 @@ dblog.c file has a compile problem, it's probably my fault...) AC_DEFINE_UNQUOTED(RSYNC_PATH, "$RSYNC_PATH", [location of rsync on remote machine]) -@@ -458,6 +460,14 @@ fi - if test x"$with_included_popt" != x"yes" - then +@@ -547,6 +549,14 @@ then AC_CHECK_LIB(popt, poptGetContext, , [with_included_popt=yes]) -+fi -+ + fi + +if test x"$with_ODBC" = x"yes" +then + AC_CHECK_HEADERS(sql.h sqlext.h sqltypes.h) + AC_CHECK_LIB(odbc,SQLExecDirect) + EXTRA_OBJECT="$EXTRA_OBJECT dblog.o" + AC_SUBST(EXTRA_OBJECT) - fi - ++fi ++ AC_MSG_CHECKING([whether to use included libpopt]) ---- dblog.c 2004-02-13 17:08:33.000000000 -0800 -+++ dblog.c 2004-04-07 23:18:56.000000000 -0700 -@@ -0,0 +1,352 @@ + if test x"$with_included_popt" = x"yes" + then +--- orig/dblog-tables-mysql.sql 2005-05-23 23:28:40 ++++ dblog-tables-mysql.sql 2005-05-23 23:28:40 +@@ -0,0 +1,43 @@ ++drop table transfer; ++drop table exit; ++drop table session; ++ ++CREATE TABLE session ( ++ id int auto_increment NOT NULL, ++ date timestamp NOT NULL, ++ ip_address varchar(15) NOT NULL, ++ username varchar(20) NOT NULL, ++ module_name varchar(20) NOT NULL, ++ module_path varchar(255) NOT NULL, ++ process_id int NOT NULL, ++ Primary Key (id) ++); ++ ++CREATE TABLE transfer ( ++ id int auto_increment NOT NULL, ++ session_id int NOT NULL, ++ date timestamp NOT NULL, ++ file_name varchar(255) NOT NULL, ++ file_size bigint NOT NULL, ++ bytes_transferred bigint NOT NULL, ++ checksum_bytes_transferred bigint NOT NULL, ++ operation varchar(20), ++ Primary Key (id), ++ foreign key (session_id) references session (id) ++); ++ ++CREATE TABLE exit ( ++ id int auto_increment NOT NULL, ++ session_id int NOT NULL, ++ date timestamp NOT NULL, ++ total_bytes_written bigint NOT NULL, ++ total_bytes_read bigint NOT NULL, ++ total_size bigint NOT NULL, ++ error_text varchar(128) NOT NULL, ++ error_code int NOT NULL, ++ error_file varchar(64) NOT NULL, ++ error_line int NOT NULL, ++ process_id int NOT NULL, ++ Primary Key (id), ++ foreign key (session_id) references session (id) ++); +--- orig/dblog-tables-postgresql.sql 2005-05-23 23:28:48 ++++ dblog-tables-postgresql.sql 2005-05-23 23:28:48 +@@ -0,0 +1,45 @@ ++drop table transfer; ++drop table exit; ++drop table session; ++drop sequence session_id_seq; ++create sequence session_id_seq; ++ ++CREATE TABLE "session" ( ++ "id" int NOT NULL, ++ "date" timestamp NOT NULL default now(), ++ "ip_address" varchar(15) NOT NULL, ++ "username" varchar(20) NOT NULL, ++ "module_name" varchar(20) NOT NULL, ++ "module_path" varchar(255) NOT NULL, ++ "process_id" int NOT NULL, ++ Primary Key (id) ++); ++ ++CREATE TABLE "transfer" ( ++ "id" serial NOT NULL, ++ "session_id" int NOT NULL, ++ "date" timestamp NOT NULL default now(), ++ "file_name" varchar(512) NOT NULL, ++ "file_size" bigint NOT NULL, ++ "bytes_transferred" bigint NOT NULL, ++ "checksum_bytes_transferred" bigint NOT NULL, ++ "operation" varchar(20), ++ Primary Key (id), ++ foreign key (session_id) references session (id) ++); ++ ++CREATE TABLE "exit" ( ++ "id" serial NOT NULL, ++ "session_id" int NOT NULL, ++ "date" timestamp NOT NULL default now(), ++ "total_bytes_written" bigint NOT NULL, ++ "total_bytes_read" bigint NOT NULL, ++ "total_size" bigint NOT NULL, ++ "error_text" varchar(128) NOT NULL, ++ "error_code" int NOT NULL, ++ "error_file" varchar(64) NOT NULL, ++ "error_line" int NOT NULL, ++ "process_id" int NOT NULL, ++ Primary Key (id), ++ foreign key (session_id) references session (id) ++); +--- orig/dblog.c 2005-05-24 07:12:54 ++++ dblog.c 2005-05-24 07:12:54 +@@ -0,0 +1,360 @@ +/* + * ODBC Database logging functions + * @@ -458,17 +555,25 @@ dblog.c file has a compile problem, it's probably my fault...) +void db_log_transfer(struct file_struct *file,struct stats *initial_stats,char *operation) +{ + extern struct stats stats; -+ char strSqlStatement[1024]; -+ char strFilePath[255]; -+ char strFileName[255]; ++ char strSqlStatement[2048]; ++ char strFileName[MAXPATHLEN]; ++ char *strFileNamePtr; + char strFileSize[255]; + int64 intBytesTransferred; + int64 intCheckSumBytes; + + if (lp_database_logging(module_id)) { + if (db_handle != NULL) { -+ snprintf(strFileName,sizeof(strFileName), "%s",f_name(file)); -+ snprintf(strFilePath, sizeof(strFilePath), "%s", file->basedir?file->basedir:""); ++ strFileNamePtr = safe_fname(f_name(file)); ++ if (am_sender && file->dir.root) { ++ pathjoin(strFileName, sizeof strFileName, ++ file->dir.root, strFileNamePtr); ++ strFileNamePtr = strFileName; ++ } ++ clean_fname(strFileNamePtr, 0); ++ if (*strFileNamePtr == '/') ++ strFileNamePtr++; ++ + snprintf(strFileSize,sizeof(strFileSize),"%.0f", (double)file->length); + if (am_sender) { + intBytesTransferred = stats.total_written - initial_stats->total_written; @@ -482,7 +587,7 @@ dblog.c file has a compile problem, it's probably my fault...) + intCheckSumBytes = stats.total_read - initial_stats->total_read; + } + -+ snprintf(strSqlStatement,sizeof(strSqlStatement),"INSERT INTO %s (session_id,date,file_path, file_name, file_size, bytes_transferred, checksum_bytes_transferred, operation) VALUES ('%ld','%s','%s','%s','%s','%Ld','%Ld','%s');",lp_transfer_table_name(module_id),session_id,timestring(time(NULL)),sanitizeSql(strFilePath),sanitizeSql(strFileName),strFileSize,intBytesTransferred,intCheckSumBytes,operation); ++ snprintf(strSqlStatement,sizeof(strSqlStatement),"INSERT INTO %s (session_id,date, file_name, file_size, bytes_transferred, checksum_bytes_transferred, operation) VALUES ('%ld','%s','%s','%s','%Ld','%Ld','%s');",lp_transfer_table_name(module_id),session_id,timestring(time(NULL)),sanitizeSql(strFileNamePtr),strFileSize,intBytesTransferred,intCheckSumBytes,operation); + result = SQLExecDirect(sql_statement_handle,strSqlStatement,SQL_NTS); + if (result != SQL_SUCCESS && result != SQL_SUCCESS_WITH_INFO) { + SQLGetDiagRec(SQL_HANDLE_DBC, db_handle,1, sql_status,&V_OD_err,V_OD_msg,100,&V_OD_mlen); @@ -512,7 +617,7 @@ dblog.c file has a compile problem, it's probably my fault...) + } else { + error_text = ""; + } -+ snprintf(strSqlStatement,sizeof(strSqlStatement),"INSERT INTO %s (session_id, date, total_bytes_written,total_bytes_read,total_size,error_text,error_code,error_file,error_line) VALUES ('%ld','%s','%Ld','%Ld','%Ld','%s','%d','%s','%d');",lp_exit_table_name(module_id),session_id,timestring(time(NULL)),stats.total_written,stats.total_read,stats.total_size,error_text,code,file,line); ++ snprintf(strSqlStatement,sizeof(strSqlStatement),"INSERT INTO %s (session_id, date, total_bytes_written,total_bytes_read,total_size,error_text,error_code,error_file,error_line,process_id) VALUES ('%ld','%s','%Ld','%Ld','%Ld','%s','%d','%s','%d','%d');",lp_exit_table_name(module_id),session_id,timestring(time(NULL)),stats.total_written,stats.total_read,stats.total_size,error_text,code,file,line,getpid()); + + result = SQLExecDirect(sql_statement_handle,strSqlStatement,SQL_NTS); + @@ -525,103 +630,9 @@ dblog.c file has a compile problem, it's probably my fault...) + rprintf(FERROR,"Error at db_log_exit: Not connected to database!\n"); + } +} ---- dblog-tables-mysql.sql 2004-02-13 17:08:33.000000000 -0800 -+++ dblog-tables-mysql.sql 2004-04-07 23:00:13.000000000 -0700 -@@ -0,0 +1,43 @@ -+drop table transfer; -+drop table exit; -+drop table session; -+ -+CREATE TABLE session ( -+ id int auto_increment NOT NULL, -+ date timestamp NOT NULL, -+ ip_address varchar(15) NOT NULL, -+ username varchar(20) NOT NULL, -+ module_name varchar(20) NOT NULL, -+ module_path varchar(255) NOT NULL, -+ process_id int NOT NULL, -+ Primary Key (id) -+); -+ -+CREATE TABLE transfer ( -+ id int auto_increment NOT NULL, -+ session_id int NOT NULL, -+ date timestamp NOT NULL, -+ file_path varchar(255) NOT NULL, -+ file_name varchar(255) NOT NULL, -+ file_size bigint NOT NULL, -+ bytes_transferred bigint NOT NULL, -+ checksum_bytes_transferred bigint NOT NULL, -+ operation varchar(20), -+ Primary Key (id), -+ foreign key (session_id) references session (id) -+); -+ -+CREATE TABLE exit ( -+ id int auto_increment NOT NULL, -+ session_id int NOT NULL, -+ date timestamp NOT NULL, -+ total_bytes_written bigint NOT NULL, -+ total_bytes_read bigint NOT NULL, -+ total_size bigint NOT NULL, -+ error_text varchar(128) NOT NULL, -+ error_code int NOT NULL, -+ error_file varchar(64) NOT NULL, -+ error_line int NOT NULL, -+ Primary Key (id), -+ foreign key (session_id) references session (id) -+); ---- dblog-tables-postgresql.sql 2004-02-13 17:08:33.000000000 -0800 -+++ dblog-tables-postgresql.sql 2004-04-07 22:59:55.000000000 -0700 -@@ -0,0 +1,45 @@ -+drop table transfer; -+drop table exit; -+drop table session; -+drop sequence session_id_seq; -+create sequence session_id_seq; -+ -+CREATE TABLE "session" ( -+ "id" int NOT NULL, -+ "date" timestamp NOT NULL default now(), -+ "ip_address" varchar(15) NOT NULL, -+ "username" varchar(20) NOT NULL, -+ "module_name" varchar(20) NOT NULL, -+ "module_path" varchar(255) NOT NULL, -+ "process_id" int NOT NULL, -+ Primary Key (id) -+); -+ -+CREATE TABLE "transfer" ( -+ "id" serial NOT NULL, -+ "session_id" int NOT NULL, -+ "date" timestamp NOT NULL default now(), -+ "file_path" varchar(512) NOT NULL, -+ "file_name" varchar(512) NOT NULL, -+ "file_size" bigint NOT NULL, -+ "bytes_transferred" bigint NOT NULL, -+ "checksum_bytes_transferred" bigint NOT NULL, -+ "operation" varchar(20), -+ Primary Key (id), -+ foreign key (session_id) references session (id) -+); -+ -+CREATE TABLE "exit" ( -+ "id" serial NOT NULL, -+ "session_id" int NOT NULL, -+ "date" timestamp NOT NULL default now(), -+ "total_bytes_written" bigint NOT NULL, -+ "total_bytes_read" bigint NOT NULL, -+ "total_size" bigint NOT NULL, -+ "error_text" varchar(128) NOT NULL, -+ "error_code" int NOT NULL, -+ "error_file" varchar(64) NOT NULL, -+ "error_line" int NOT NULL, -+ Primary Key (id), -+ foreign key (session_id) references session (id) -+); ---- loadparm.c 4 Feb 2004 07:31:29 -0000 1.50 -+++ loadparm.c 8 Apr 2004 06:31:18 -0000 -@@ -122,6 +122,17 @@ typedef struct +--- orig/loadparm.c 2005-07-28 17:25:13 ++++ loadparm.c 2005-05-23 23:29:42 +@@ -124,6 +124,17 @@ typedef struct BOOL list; BOOL use_chroot; BOOL transfer_logging; @@ -639,7 +650,7 @@ dblog.c file has a compile problem, it's probably my fault...) BOOL ignore_errors; char *uid; char *gid; -@@ -154,6 +165,17 @@ static service sDefault = +@@ -161,6 +172,17 @@ static service sDefault = True, /* list */ True, /* use chroot */ False, /* transfer logging */ @@ -655,9 +666,9 @@ dblog.c file has a compile problem, it's probably my fault...) + NULL, /* custom unique id select*/ + True, /* get custom id before insert */ False, /* ignore errors */ - "nobody",/* uid */ - -@@ -292,6 +314,17 @@ static struct parm_struct parm_table[] = + NOBODY_USER,/* uid */ + NOBODY_GROUP,/* gid */ +@@ -298,6 +320,17 @@ static struct parm_struct parm_table[] = {"include", P_STRING, P_LOCAL, &sDefault.include, NULL, 0}, {"include from", P_STRING, P_LOCAL, &sDefault.include_from,NULL, 0}, {"transfer logging", P_BOOL, P_LOCAL, &sDefault.transfer_logging,NULL,0}, @@ -675,7 +686,7 @@ dblog.c file has a compile problem, it's probably my fault...) {"ignore errors", P_BOOL, P_LOCAL, &sDefault.ignore_errors,NULL,0}, {"log format", P_STRING, P_LOCAL, &sDefault.log_format, NULL, 0}, {"refuse options", P_STRING, P_LOCAL, &sDefault.refuse_options,NULL, 0}, -@@ -359,6 +392,17 @@ FN_LOCAL_BOOL(lp_read_only, read_only) +@@ -370,6 +403,17 @@ FN_LOCAL_BOOL(lp_write_only, write_only) FN_LOCAL_BOOL(lp_list, list) FN_LOCAL_BOOL(lp_use_chroot, use_chroot) FN_LOCAL_BOOL(lp_transfer_logging, transfer_logging) @@ -693,9 +704,9 @@ dblog.c file has a compile problem, it's probably my fault...) FN_LOCAL_BOOL(lp_ignore_errors, ignore_errors) FN_LOCAL_BOOL(lp_ignore_nonreadable, ignore_nonreadable) FN_LOCAL_STRING(lp_uid, uid) ---- log.c 20 Jan 2004 05:15:14 -0000 1.71 -+++ log.c 8 Apr 2004 05:56:32 -0000 -@@ -75,7 +75,7 @@ struct { +--- orig/log.c 2005-06-10 21:33:28 ++++ log.c 2005-05-23 23:29:54 +@@ -84,7 +84,7 @@ struct { /* * Map from rsync error code to name, or return NULL. */ @@ -704,81 +715,39 @@ dblog.c file has a compile problem, it's probably my fault...) { int i; for (i = 0; rerr_names[i].name; i++) { ---- main.c 10 Feb 2004 03:54:47 -0000 1.192 -+++ main.c 8 Apr 2004 05:56:32 -0000 -@@ -120,6 +120,9 @@ static void report(int f) +--- orig/main.c 2005-07-27 23:31:12 ++++ main.c 2005-05-23 23:30:01 +@@ -139,6 +139,9 @@ static void handle_stats(int f) if (am_daemon) { log_exit(0, __FILE__, __LINE__); +#ifdef HAVE_LIBODBC + db_log_exit(0,__FILE__,__LINE__); +#endif - if (f == -1 || !am_sender) return; + if (f == -1 || !am_sender) + return; } +--- orig/receiver.c 2005-08-17 06:45:08 ++++ receiver.c 2005-05-23 23:30:07 +@@ -668,6 +668,9 @@ int recv_files(int f_in, struct file_lis ---- proto.h 14 Apr 2004 23:33:30 -0000 1.188 -+++ proto.h 15 Apr 2004 18:51:15 -0000 -@@ -51,6 +51,12 @@ int start_daemon(int f_in, int f_out); - int daemon_main(void); - void setup_protocol(int f_out,int f_in); - int claim_connection(char *fname,int max_connections); -+char *sanitizeSql(const char *input); -+void db_log_open(void); -+void db_log_close(); -+void db_log_session(); -+void db_log_transfer(struct file_struct *file,struct stats *initial_stats,char *operation); -+void db_log_exit(int code, const char *file, int line); - void free_exclude_list(struct exclude_list_struct *listp); - int check_exclude(struct exclude_list_struct *listp, char *name, int name_is_dir); - void add_exclude(struct exclude_list_struct *listp, const char *pattern, -@@ -135,6 +141,17 @@ BOOL lp_read_only(int ); - BOOL lp_list(int ); - BOOL lp_use_chroot(int ); - BOOL lp_transfer_logging(int ); -+BOOL lp_database_logging(int ); -+char *lp_database_datasource(int ); -+char *lp_database_username(int ); -+char *lp_database_password(int ); -+char *lp_transfer_table_name(int ); -+char *lp_exit_table_name(int ); -+char *lp_session_table_name(int ); -+char *lp_sequence_name(int ); -+char *lp_unique_id_method(int ); -+char *lp_custom_unique_id_select(int ); -+BOOL lp_get_custom_id_before_insert(int ); - BOOL lp_ignore_errors(int ); - BOOL lp_ignore_nonreadable(int ); - char *lp_uid(int ); -@@ -156,6 +173,7 @@ int lp_max_connections(int ); - BOOL lp_load(char *pszFname, int globals_only); - int lp_numservices(void); - int lp_number(char *name); -+char const *rerr_name(int code); - void log_init(void); - void log_open(void); - void log_close(void); ---- receiver.c 23 Mar 2004 16:50:40 -0000 1.75 -+++ receiver.c 8 Apr 2004 05:56:32 -0000 -@@ -453,7 +453,9 @@ int recv_files(int f_in,struct file_list - recv_ok = receive_data(f_in,mapbuf,fd2,fname,file->length); - - log_recv(file, &initial_stats); -- + if (!log_before_transfer) + log_item(file, &initial_stats, iflags, NULL); +#ifdef HAVE_LIBODBC -+ db_log_transfer(file, &initial_stats,"receive"); ++ db_log_transfer(file, &initial_stats, "receive"); +#endif - if (mapbuf) unmap_file(mapbuf); - if (fd1 != -1) { + + if (fd1 != -1) close(fd1); ---- sender.c 17 Feb 2004 21:57:44 -0000 1.38 -+++ sender.c 8 Apr 2004 05:56:32 -0000 -@@ -283,6 +283,9 @@ void send_files(struct file_list *flist, - } else { - match_sums(f_out, s, buf, st.st_size); - log_send(file, &initial_stats); +--- orig/sender.c 2005-07-28 01:46:25 ++++ sender.c 2005-05-23 23:30:15 +@@ -356,6 +356,9 @@ void send_files(struct file_list *flist, + + if (!log_before_transfer) + log_item(file, &initial_stats, iflags, NULL); +#ifdef HAVE_LIBODBC -+ db_log_transfer(file, &initial_stats,"send"); ++ db_log_transfer(file, &initial_stats,"send"); +#endif - } - if (!read_batch) { + if (mbuf) { + j = unmap_file(mbuf);