diff --git a/doc/adminguide/slonik_ref.sgml b/doc/adminguide/slonik_ref.sgml
index b0f5302..3697168 100644
--- a/doc/adminguide/slonik_ref.sgml
+++ b/doc/adminguide/slonik_ref.sgml
@@ -379,6 +379,38 @@ echo 'But @sakaiMovies will display as a string, and is not expanded';
+
+
+ SLONIK DATE
+ 7
+
+ DATE
+
+ Display current date
+
+
+
+ date
+ (format)
+
+
+
+ Description
+
+ Prints the current date. Accepts an optional strftime()-conformant format string.
+
+
+ Example
+
+ DATE;
+ DATE(format='%Y-%m-%d %H:%M:%S %Z');
+
+
+ Version Information
+ This command was introduced in &slony1; 2.1
+
+
+
SLONIK EXIT
diff --git a/src/slonik/parser.y b/src/slonik/parser.y
index 1bd0f7a..2f0f326 100644
--- a/src/slonik/parser.y
+++ b/src/slonik/parser.y
@@ -76,6 +76,7 @@ static int assign_options(statement_option *so, option_list *ol);
%type try_on_error
%type try_on_success
%type stmt_echo
+%type stmt_date
%type stmt_exit
%type stmt_restart_node
%type stmt_error
@@ -140,6 +141,8 @@ static int assign_options(statement_option *so, option_list *ol);
%token K_CREATE
%token K_DROP
%token K_ECHO
+%token K_DATE
+%token K_DFORMAT
%token K_ERROR
%token K_EVENT
%token K_EXECUTE
@@ -373,6 +376,8 @@ try_stmts : try_stmt
normal_stmt : stmt_echo
{ $$ = $1; }
+ | stmt_date
+ { $$ = $1; }
| stmt_exit
{ $$ = $1; }
| stmt_restart_node
@@ -467,6 +472,32 @@ stmt_echo : lno K_ECHO literal ';'
}
;
+stmt_date : lno K_DATE option_list
+ {
+ SlonikStmt_date *new;
+ statement_option opt[] = {
+ STMT_OPTION_STR( O_DATE_FORMAT, "%F %T"),
+ STMT_OPTION_END
+ };
+
+ new = (SlonikStmt_date *)
+ malloc(sizeof(SlonikStmt_date));
+ memset(new, 0, sizeof(SlonikStmt_date));
+ new->hdr.stmt_type = STMT_DATE;
+ new->hdr.stmt_filename = current_file;
+ new->hdr.stmt_lno = $1;
+
+ if (assign_options(opt, $3) == 0)
+ {
+ new->fmt = opt[0].str;
+ }
+ else
+ parser_errors++;
+
+ $$ = (SlonikStmt *)new;
+ }
+ ;
+
stmt_exit : lno K_EXIT exit_code ';'
{
SlonikStmt_exit *new;
@@ -1566,6 +1597,11 @@ option_list_item : K_ID '=' option_item_id
$3->opt_code = O_CONNINFO;
$$ = $3;
}
+ | K_DFORMAT '=' option_item_literal
+ {
+ $3->opt_code = O_DATE_FORMAT;
+ $$ = $3;
+ }
| K_SET K_ID '=' option_item_id
{
$4->opt_code = O_SET_ID;
@@ -1777,6 +1813,7 @@ option_str(option_code opt_code)
case O_COMMENT: return "comment";
case O_CONNINFO: return "conninfo";
case O_CONNRETRY: return "connretry";
+ case O_DATE_FORMAT: return "format";
case O_EVENT_NODE: return "event node";
case O_EXECUTE_ONLY_ON: return "execute only on";
case O_FILENAME: return "filename";
diff --git a/src/slonik/scan.l b/src/slonik/scan.l
index c42d69d..200ded5 100644
--- a/src/slonik/scan.l
+++ b/src/slonik/scan.l
@@ -88,6 +88,7 @@ confirmed { return K_CONFIRMED; }
conninfo { return K_CONNINFO; }
connretry { return K_CONNRETRY; }
create { return K_CREATE; }
+date { return K_DATE; }
drop { return K_DROP; }
echo { return K_ECHO; }
error { return K_ERROR; }
@@ -98,6 +99,7 @@ failover { return K_FAILOVER; }
false { return K_FALSE; }
filename { return K_FILENAME; }
finish { return K_FINISH; }
+format { return K_DFORMAT; }
for { return K_FOR; }
forward { return K_FORWARD; }
full { return K_FULL; }
diff --git a/src/slonik/slonik.c b/src/slonik/slonik.c
index 38821ed..be4858f 100644
--- a/src/slonik/slonik.c
+++ b/src/slonik/slonik.c
@@ -264,6 +264,9 @@ script_check_stmts(SlonikScript * script, SlonikStmt * hdr)
case STMT_ECHO:
break;
+ case STMT_DATE:
+ break;
+
case STMT_EXIT:
break;
@@ -1174,6 +1177,24 @@ script_exec_stmts(SlonikScript * script, SlonikStmt * hdr)
}
break;
+ case STMT_DATE:
+ {
+ SlonikStmt_date *stmt =
+ (SlonikStmt_date *) hdr;
+ char outstr[200];
+
+ struct tm *local;
+ time_t t;
+
+ t = time(NULL);
+ local = localtime(&t);
+ strftime(outstr, sizeof(outstr), stmt->fmt, local);
+ printf("%s:%d: %s\n",
+ stmt->hdr.stmt_filename, stmt->hdr.stmt_lno,
+ outstr);
+ }
+ break;
+
case STMT_EXIT:
{
SlonikStmt_exit *stmt =
diff --git a/src/slonik/slonik.h b/src/slonik/slonik.h
index a0e0162..b378e55 100644
--- a/src/slonik/slonik.h
+++ b/src/slonik/slonik.h
@@ -16,6 +16,7 @@ typedef struct SlonikAdmInfo_s SlonikAdmInfo;
typedef struct SlonikStmt_s SlonikStmt;
typedef struct SlonikStmt_try_s SlonikStmt_try;
typedef struct SlonikStmt_echo_s SlonikStmt_echo;
+typedef struct SlonikStmt_date_s SlonikStmt_date;
typedef struct SlonikStmt_exit_s SlonikStmt_exit;
typedef struct SlonikStmt_repair_config_s SlonikStmt_repair_config;
typedef struct SlonikStmt_restart_node_s SlonikStmt_restart_node;
@@ -63,6 +64,7 @@ typedef enum
STMT_DROP_PATH,
STMT_DROP_SET,
STMT_ECHO,
+ STMT_DATE,
STMT_ERROR,
STMT_EXIT,
STMT_FAILED_NODE,
@@ -144,6 +146,12 @@ struct SlonikStmt_echo_s
char *str;
};
+struct SlonikStmt_date_s
+{
+ SlonikStmt hdr;
+ char *fmt;
+};
+
struct SlonikStmt_exit_s
{
@@ -626,6 +634,7 @@ typedef enum {
O_COMMENT,
O_CONNINFO,
O_CONNRETRY,
+ O_DATE_FORMAT,
O_EVENT_NODE,
O_EXECUTE_ONLY_ON,
O_FILENAME,