Skip to content

Commit be7e270

Browse files
author
Akayeshmantha
committed
base64(raw) dataset download.
1 parent ef72720 commit be7e270

File tree

2 files changed

+85
-26
lines changed

2 files changed

+85
-26
lines changed

c/datasetjson.c

+84-26
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,13 @@ typedef struct Volser_tag {
7878
static int getVolserForDataset(const DatasetName *dataset, Volser *volser);
7979
static bool memberExists(char* dsName, DynallocMemberName daMemberName);
8080

81+
int streamDataset2(HttpService *service, Socket *socket, char *filename, int recordLength, jsonPrinter *jPrinter);
82+
8183
int streamDataset(Socket *socket, char *filename, int recordLength, jsonPrinter *jPrinter){
84+
streamDataset2(null, socket, filename, recordLength, jPrinter);
85+
}
86+
87+
int streamDataset2(HttpService *service, Socket *socket, char *filename, int recordLength, jsonPrinter *jPrinter){
8288
#ifdef __ZOWE_OS_ZOS
8389
int defaultSize = DATA_STREAM_BUFFER_SIZE;
8490
FILE *in;
@@ -89,35 +95,62 @@ int streamDataset(Socket *socket, char *filename, int recordLength, jsonPrinter
8995
else {
9096
in = fopen(filename,"rb, type=record");
9197
}
98+
int returnCode = 0;
99+
int reasonCode = 0;
100+
int bytesSent = 0;
92101
int bufferSize = recordLength+1;
93102
char buffer[bufferSize];
94-
jsonStartArray(jPrinter,"records");
95-
int contentLength = 0;
96-
int bytesRead = 0;
97-
if (in) {
98-
while (!feof(in)){
99-
bytesRead = fread(buffer,1,recordLength,in);
100-
if (bytesRead > 0){
101-
jsonAddUnterminatedString(jPrinter, NULL, buffer, bytesRead);
102-
contentLength = contentLength + bytesRead;
103-
}
104-
else if (bytesRead == 0){
105-
break;
106-
}
107-
else {
108-
zowelog(NULL, LOG_COMP_RESTDATASET, ZOWE_LOG_DEBUG, "Error reading DSN=%s, rc=%d\n", filename, bytesRead);
109-
break;
103+
char *type = getQueryParam(response->request, "type");
104+
if(strcmp(type, "raw")){
105+
outPtr = buffer;
106+
outLen = (unsigned int)bytesRead;
107+
#ifdef DEBUG
108+
if (outLen % 3) printf("buffer length not divisble by 3. Base64Encode will fail if this is not the eof.\n");
109+
#endif
110+
allocSize = ENCODE64_SIZE(outLen)+1;
111+
encodedBuffer = encodeBase64(NULL, outPtr, outLen, &encodedLength, FALSE);
112+
outPtr = encodedBuffer;
113+
outLen = encodedLength;
114+
int allocSize = 0;
115+
char *encodedBuffer = NULL;
116+
#ifdef DEBUG
117+
if (outLen % 3) printf("buffer length not divisble by 3. Base64Encode will fail if this is not the eof.\n");
118+
#endif
119+
allocSize = ENCODE64_SIZE(outLen)+1;
120+
encodedBuffer = encodeBase64(NULL, outPtr, outLen, &encodedLength, FALSE);
121+
outPtr = encodedBuffer;
122+
outLen = encodedLength;
123+
writeFully(socket,outPtr,(int) outLen);
124+
if (NULL != encodedBuffer) safeFree31(encodedBuffer, allocSize);
125+
bytesSent += encodedLength;
126+
}
127+
else{
128+
jsonStartArray(jPrinter,"records");
129+
int contentLength = 0;
130+
int bytesRead = 0;
131+
if (in){
132+
while (!feof(in)){
133+
bytesRead = fread(buffer,1,recordLength,in);
134+
if (bytesRead > 0){
135+
jsonAddUnterminatedString(jPrinter, NULL, buffer, bytesRead);
136+
contentLength = contentLength + bytesRead;
137+
}
138+
else if (bytesRead == 0){
139+
break;
140+
}
141+
else{
142+
zowelog(NULL, LOG_COMP_RESTDATASET, ZOWE_LOG_SEVERE, "Error reading DSN=%s, rc=%d\n",filename,bytesRead);
143+
break;
144+
}
110145
}
146+
fclose(in);
111147
}
112-
fclose(in);
113-
}
114-
else {
115-
zowelog(NULL, LOG_COMP_RESTDATASET, ZOWE_LOG_DEBUG, "FAILED TO OPEN FILE\n");
148+
else{
149+
zowelog(NULL, LOG_COMP_RESTDATASET, ZOWE_LOG_SEVERE, "FAILED TO OPEN FILE\n");
150+
}
151+
jsonEndArray(jPrinter);
152+
safeFree(buffer,recordLength);
116153
}
117-
118-
jsonEndArray(jPrinter);
119-
safeFree(buffer,recordLength);
120-
121154
#else /* not __ZOWE_OS_ZOS */
122155

123156
/* Currently nothing else has "datasets" */
@@ -1484,11 +1517,32 @@ void updateVSAMDataset(HttpResponse* response, char* absolutePath, hashtable *ac
14841517
14851518
*/
14861519

1520+
static void respondWithDatasetInternal2(HttpService *service,
1521+
HttpResponse* response,
1522+
const char *datasetPath,
1523+
const DatasetName *dsn,
1524+
const DDName *ddName,
1525+
int jsonMode);
1526+
14871527
static void respondWithDatasetInternal(HttpResponse* response,
14881528
const char *datasetPath,
14891529
const DatasetName *dsn,
14901530
const DDName *ddName,
14911531
int jsonMode) {
1532+
respondWithDatasetInternal2(null,
1533+
HttpResponse* response,
1534+
const char *datasetPath,
1535+
const DatasetName *dsn,
1536+
const DDName *ddName,
1537+
int jsonMode);
1538+
}
1539+
1540+
static void respondWithDatasetInternal2(HttpService *service,
1541+
HttpResponse* response,
1542+
const char *datasetPath,
1543+
const DatasetName *dsn,
1544+
const DDName *ddName,
1545+
int jsonMode) {
14921546
#ifdef __ZOWE_OS_ZOS
14931547
HttpRequest *request = response->request;
14941548

@@ -1565,14 +1619,18 @@ static void respondWithDatasetInternal(HttpResponse* response,
15651619
zowelog(NULL, LOG_COMP_RESTDATASET, ZOWE_LOG_DEBUG, "Streaming data for %s\n", datasetPath);
15661620

15671621
jsonStart(jPrinter);
1568-
int status = streamDataset(response->socket, ddPath, lrecl, jPrinter);
1622+
int status = streamDataset2(service, response->socket, ddPath, lrecl, jPrinter);
15691623
jsonEnd(jPrinter);
15701624
}
15711625
finishResponse(response);
15721626
#endif /* __ZOWE_OS_ZOS */
15731627
}
15741628

15751629
void respondWithDataset(HttpResponse* response, char* absolutePath, int jsonMode) {
1630+
respondWithDataset2(null, response, absolutePath, jsonMode);
1631+
}
1632+
1633+
void respondWithDataset2(HttpResponse* response, char* absolutePath, int jsonMode) {
15761634

15771635
HttpRequest *request = response->request;
15781636

@@ -1617,7 +1675,7 @@ void respondWithDataset(HttpResponse* response, char* absolutePath, int jsonMode
16171675

16181676
DDName ddName;
16191677
memcpy(&ddName.value, &daDDname.name, sizeof(ddName.value));
1620-
respondWithDatasetInternal(response, absolutePath, &dsn, &ddName, jsonMode);
1678+
respondWithDatasetInternal2(service, response, absolutePath, &dsn, &ddName, jsonMode);
16211679

16221680
daRC = dynallocUnallocDatasetByDDName(&daDDname, DYNALLOC_UNALLOC_FLAG_NONE,
16231681
&daSysRC, &daSysRSN);

h/datasetjson.h

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ void addMemberedDatasetMetadata(char *datasetName, int nameLength,
5959
jsonPrinter *jPrinter,
6060
int includeUnprintable);
6161
void respondWithDataset(HttpResponse* response, char* absolutePath, int jsonMode);
62+
void respondWithDataset2(HttpService *service, HttpResponse* response, char* absolutePath, int jsonMode);
6263
void respondWithVSAMDataset(HttpResponse* response, char* absolutePath, hashtable *acbTable, int jsonMode);
6364
void respondWithDatasetMetadata(HttpResponse *response);
6465
void respondWithHLQNames(HttpResponse *response, MetadataQueryCache *metadataQueryCache);

0 commit comments

Comments
 (0)