@@ -78,7 +78,13 @@ typedef struct Volser_tag {
78
78
static int getVolserForDataset (const DatasetName * dataset , Volser * volser );
79
79
static bool memberExists (char * dsName , DynallocMemberName daMemberName );
80
80
81
+ int streamDataset2 (HttpService * service , Socket * socket , char * filename , int recordLength , jsonPrinter * jPrinter );
82
+
81
83
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 ){
82
88
#ifdef __ZOWE_OS_ZOS
83
89
int defaultSize = DATA_STREAM_BUFFER_SIZE ;
84
90
FILE * in ;
@@ -89,35 +95,62 @@ int streamDataset(Socket *socket, char *filename, int recordLength, jsonPrinter
89
95
else {
90
96
in = fopen (filename ,"rb, type=record" );
91
97
}
98
+ int returnCode = 0 ;
99
+ int reasonCode = 0 ;
100
+ int bytesSent = 0 ;
92
101
int bufferSize = recordLength + 1 ;
93
102
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
+ }
110
145
}
146
+ fclose (in );
111
147
}
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 );
116
153
}
117
-
118
- jsonEndArray (jPrinter );
119
- safeFree (buffer ,recordLength );
120
-
121
154
#else /* not __ZOWE_OS_ZOS */
122
155
123
156
/* Currently nothing else has "datasets" */
@@ -1484,11 +1517,32 @@ void updateVSAMDataset(HttpResponse* response, char* absolutePath, hashtable *ac
1484
1517
1485
1518
*/
1486
1519
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
+
1487
1527
static void respondWithDatasetInternal (HttpResponse * response ,
1488
1528
const char * datasetPath ,
1489
1529
const DatasetName * dsn ,
1490
1530
const DDName * ddName ,
1491
1531
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 ) {
1492
1546
#ifdef __ZOWE_OS_ZOS
1493
1547
HttpRequest * request = response -> request ;
1494
1548
@@ -1565,14 +1619,18 @@ static void respondWithDatasetInternal(HttpResponse* response,
1565
1619
zowelog (NULL , LOG_COMP_RESTDATASET , ZOWE_LOG_DEBUG , "Streaming data for %s\n" , datasetPath );
1566
1620
1567
1621
jsonStart (jPrinter );
1568
- int status = streamDataset ( response -> socket , ddPath , lrecl , jPrinter );
1622
+ int status = streamDataset2 ( service , response -> socket , ddPath , lrecl , jPrinter );
1569
1623
jsonEnd (jPrinter );
1570
1624
}
1571
1625
finishResponse (response );
1572
1626
#endif /* __ZOWE_OS_ZOS */
1573
1627
}
1574
1628
1575
1629
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 ) {
1576
1634
1577
1635
HttpRequest * request = response -> request ;
1578
1636
@@ -1617,7 +1675,7 @@ void respondWithDataset(HttpResponse* response, char* absolutePath, int jsonMode
1617
1675
1618
1676
DDName ddName ;
1619
1677
memcpy (& ddName .value , & daDDname .name , sizeof (ddName .value ));
1620
- respondWithDatasetInternal ( response , absolutePath , & dsn , & ddName , jsonMode );
1678
+ respondWithDatasetInternal2 ( service , response , absolutePath , & dsn , & ddName , jsonMode );
1621
1679
1622
1680
daRC = dynallocUnallocDatasetByDDName (& daDDname , DYNALLOC_UNALLOC_FLAG_NONE ,
1623
1681
& daSysRC , & daSysRSN );
0 commit comments