PostgreSQL Source Code: contrib/basebackup_to_shell/basebackup_to_shell.c Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

12

20

22 .name = "basebackup_to_shell",

24);

25

27{

28

30

31

33

34

36

37

39

40

43

46

48 const char *archive_name);

54

66

69

70void

72{

74 "Shell command to be executed for each backup file.",

77 "",

79 0,

81

83 "Backup user must be a member of this role to use shell backup target.",

86 "",

88 0,

90

92

94}

95

96

97

98

99

100

101static void *

103{

105 {

106 Oid roleid;

107

113 errmsg("permission denied to use basebackup_to_shell")));

115 }

116

117 return target_detail;

118}

119

120

121

122

123

124

125

128{

131 char *c;

132

133

134

135

136

137

138

142 sink->target_detail = detail_arg;

144

145

146 if (sink->shell_command[0] == '\0')

149 errmsg("shell command for backup is not configured"));

150

151

152 for (c = sink->shell_command; *c != '\0'; ++c)

153 {

154 if (c[0] == '%' && c[1] != '\0')

155 {

156 if (c[1] == 'd')

158 ++c;

159 }

160 }

161

162

166 errmsg("a target detail is required because the configured command includes %%d"),

167 errhint("Try \"pg_basebackup --target shell:DETAIL ...\"")));

171 errmsg("a target detail is not permitted because the configured command does not include %%d")));

172

173

174

175

176

177

178

179

180

181 if (sink->target_detail != NULL)

182 {

183 char *d;

184 bool scary = false;

185

186 for (d = sink->target_detail; *d != '\0'; ++d)

187 {

188 if (*d >= 'a' && *d <= 'z')

189 continue;

190 if (*d >= 'A' && *d <= 'Z')

191 continue;

192 if (*d >= '0' && *d <= '9')

193 continue;

195 break;

196 }

197

201 errmsg("target detail must contain only alphanumeric characters"));

202 }

203

204 return &sink->base;

205}

206

207

208

209

210

211static char *

213 const char *target_detail)

214{

216 "df", target_detail, filename);

217}

218

219

220

221

222static void

224{

226

227

230

231

236 errmsg("could not close pipe to external command: %m")));

238 {

241 errmsg("shell command \"%s\" failed",

242 sink->current_command),

244 }

245

246

249 sink->current_command = NULL;

250}

251

252

253

254

255static void

257{

258

261

262

265 sink->target_detail);

266

267

272 errmsg("could not execute command \"%s\": %m",

273 sink->current_command)));

274}

275

276

277

278

279static void

281{

282

285

286

289 {

291 {

292

293

294

295

296

299 }

302 errmsg("could not write to shell backup program: %m")));

303 }

304}

305

306

307

308

309static void

317

318

319

320

321static void

329

330

331

332

333static void

341

342

343

344

345static void

353

354

355

356

357static void

365

366

367

368

369static void

bool has_privs_of_role(Oid member, Oid role)

Oid get_role_oid(const char *rolname, bool missing_ok)

void bbsink_forward_begin_backup(bbsink *sink)

void bbsink_forward_begin_manifest(bbsink *sink)

void bbsink_forward_end_backup(bbsink *sink, XLogRecPtr endptr, TimeLineID endtli)

void bbsink_forward_cleanup(bbsink *sink)

void bbsink_forward_manifest_contents(bbsink *sink, size_t len)

void bbsink_forward_end_archive(bbsink *sink)

void bbsink_forward_archive_contents(bbsink *sink, size_t len)

void bbsink_forward_begin_archive(bbsink *sink, const char *archive_name)

void bbsink_forward_end_manifest(bbsink *sink)

void BaseBackupAddTarget(char *name, void *(*check_detail)(char *, char *), bbsink *(*get_sink)(bbsink *, void *))

static void * shell_check_detail(char *target, char *target_detail)

static char * shell_required_role

static void shell_finish_command(bbsink_shell *sink)

static void bbsink_shell_begin_manifest(bbsink *sink)

static bbsink * shell_get_sink(bbsink *next_sink, void *detail_arg)

static void bbsink_shell_end_manifest(bbsink *sink)

static char * shell_construct_command(const char *base_command, const char *filename, const char *target_detail)

static void bbsink_shell_end_archive(bbsink *sink)

static void shell_send_data(bbsink_shell *sink, size_t len)

static void shell_run_command(bbsink_shell *sink, const char *filename)

static void bbsink_shell_begin_archive(bbsink *sink, const char *archive_name)

static void bbsink_shell_archive_contents(bbsink *sink, size_t len)

static char * shell_command

static const bbsink_ops bbsink_shell_ops

static void bbsink_shell_manifest_contents(bbsink *sink, size_t len)

#define Assert(condition)

int errcode_for_file_access(void)

int errcode(int sqlerrcode)

int int errdetail_internal(const char *fmt,...) pg_attribute_printf(1

int errhint(const char *fmt,...) pg_attribute_printf(1

#define ereport(elevel,...)

FILE * OpenPipeStream(const char *command, const char *mode)

int ClosePipeStream(FILE *file)

#define palloc0_object(type)

#define PG_MODULE_MAGIC_EXT(...)

void DefineCustomStringVariable(const char *name, const char *short_desc, const char *long_desc, char **valueAddr, const char *bootValue, GucContext context, int flags, GucStringCheckHook check_hook, GucStringAssignHook assign_hook, GucShowHook show_hook)

void MarkGUCPrefixReserved(const char *className)

char * pstrdup(const char *in)

void pfree(void *pointer)

char * replace_percent_placeholders(const char *instr, const char *param_name, const char *letters,...)

void(* begin_backup)(bbsink *sink)

char * wait_result_to_str(int exitstatus)

void StartTransactionCommand(void)

void CommitTransactionCommand(void)