/* * Export data out of GPDB. * invoked by GPDB, be careful with C++ exceptions. */ Datum s3_export(PG_FUNCTION_ARGS) { /* Must be called via the external table format manager */ if (!CALLED_AS_EXTPROTOCOL(fcinfo)) elog(ERROR, "extprotocol_import: not called by external protocol manager"); /* Get our internal description of the protocol */ GPWriter *gpwriter = (GPWriter *)EXTPROTOCOL_GET_USER_CTX(fcinfo); /* last call. destroy writer */ if (EXTPROTOCOL_IS_LAST_CALL(fcinfo)) { thread_cleanup(); if (!writer_cleanup(&gpwriter)) { ereport(ERROR, (0, errmsg("Failed to cleanup S3 extension: %s", s3extErrorMessage.c_str()))); } EXTPROTOCOL_SET_USER_CTX(fcinfo, NULL); PG_RETURN_INT32(0); } /* first call. do any desired init */ if (gpwriter == NULL) { const char *url_with_options = EXTPROTOCOL_GET_URL(fcinfo); const char *format = get_format_str(fcinfo); thread_setup(); gpwriter = writer_init(url_with_options, format); if (!gpwriter) { ereport(ERROR, (0, errmsg("Failed to init S3 extension, segid = %d, " "segnum = %d, please check your " "configurations and net connection: %s", s3ext_segid, s3ext_segnum, s3extErrorMessage.c_str()))); } EXTPROTOCOL_SET_USER_CTX(fcinfo, gpwriter); } char *data_buf = EXTPROTOCOL_GET_DATABUF(fcinfo); int32 data_len = EXTPROTOCOL_GET_DATALEN(fcinfo); if (!writer_transfer_data(gpwriter, data_buf, data_len)) { ereport(ERROR, (0, errmsg("s3_export: could not write data: %s", s3extErrorMessage.c_str()))); } PG_RETURN_INT32(data_len); }
bool uploadS3(const char *urlWithOptions, const char *fileToUpload) { if (!urlWithOptions) { return false; } size_t data_len = BUF_SIZE; char data_buf[BUF_SIZE]; size_t read_len = 0; bool ret = true; thread_setup(); GPWriter *writer = writer_init(urlWithOptions); if (!writer) { return false; } FILE *fd = fopen(fileToUpload, "r"); if (fd == NULL) { fprintf(stderr, "File does not exist\n"); ret = false; } else { do { read_len = fread(data_buf, 1, data_len, fd); if (read_len == 0) { break; } if (!writer_transfer_data(writer, data_buf, (int)read_len)) { fprintf(stderr, "Failed to write data to Amazon S3\n"); ret = false; break; } } while (read_len == data_len && !S3QueryIsAbortInProgress()); if (ferror(fd)) { ret = false; } fclose(fd); } writer_cleanup(&writer); thread_cleanup(); return ret; }