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,