@@ -69,6 +69,15 @@ type DBInfo struct {
69
69
InstanceStartTime string `json:"instance_start_time"`
70
70
}
71
71
72
+ //ConnectionInfo is a structure for capturing the database info and version
73
+ type ConnectionInfo struct {
74
+ Couchdb string `json:"couchdb"`
75
+ Version string `json:"version"`
76
+ Vendor struct {
77
+ Name string `json:"name"`
78
+ } `json:"vendor"`
79
+ }
80
+
72
81
//RangeQueryResponse is used for processing REST range query responses from CouchDB
73
82
type RangeQueryResponse struct {
74
83
TotalRows int `json:"total_rows"`
@@ -211,7 +220,7 @@ func (dbclient *CouchDatabase) CreateDatabaseIfNotExist() (*DBOperationResponse,
211
220
connectURL .Path = dbclient .dbName
212
221
213
222
//process the URL with a PUT, creates the database
214
- resp , _ , err := dbclient .handleRequest (http .MethodPut , connectURL .String (), nil , "" , "" )
223
+ resp , _ , err := dbclient .couchInstance . handleRequest (http .MethodPut , connectURL .String (), nil , "" , "" )
215
224
if err != nil {
216
225
return nil , err
217
226
}
@@ -249,7 +258,7 @@ func (dbclient *CouchDatabase) GetDatabaseInfo() (*DBInfo, *DBReturn, error) {
249
258
}
250
259
connectURL .Path = dbclient .dbName
251
260
252
- resp , couchDBReturn , err := dbclient .handleRequest (http .MethodGet , connectURL .String (), nil , "" , "" )
261
+ resp , couchDBReturn , err := dbclient .couchInstance . handleRequest (http .MethodGet , connectURL .String (), nil , "" , "" )
253
262
if err != nil {
254
263
return nil , couchDBReturn , err
255
264
}
@@ -270,6 +279,40 @@ func (dbclient *CouchDatabase) GetDatabaseInfo() (*DBInfo, *DBReturn, error) {
270
279
271
280
}
272
281
282
+ //VerifyConnection method provides function to verify the connection information
283
+ func (couchInstance * CouchInstance ) VerifyConnection () (* ConnectionInfo , * DBReturn , error ) {
284
+
285
+ connectURL , err := url .Parse (couchInstance .conf .URL )
286
+ if err != nil {
287
+ logger .Errorf ("URL parse error: %s" , err .Error ())
288
+ return nil , nil , err
289
+ }
290
+ connectURL .Path = "/"
291
+
292
+ resp , couchDBReturn , err := couchInstance .handleRequest (http .MethodGet , connectURL .String (), nil , "" , "" )
293
+ if err != nil {
294
+ return nil , couchDBReturn , err
295
+ }
296
+ defer resp .Body .Close ()
297
+
298
+ dbResponse := & ConnectionInfo {}
299
+ errJSON := json .NewDecoder (resp .Body ).Decode (& dbResponse )
300
+ if errJSON != nil {
301
+ return nil , nil , errJSON
302
+ }
303
+
304
+ // trace the database info response
305
+ if logger .IsEnabledFor (logging .DEBUG ) {
306
+ dbResponseJSON , err := json .Marshal (dbResponse )
307
+ if err == nil {
308
+ logger .Debugf ("VerifyConnection() dbResponseJSON: %s" , dbResponseJSON )
309
+ }
310
+ }
311
+
312
+ return dbResponse , couchDBReturn , nil
313
+
314
+ }
315
+
273
316
//DropDatabase provides method to drop an existing database
274
317
func (dbclient * CouchDatabase ) DropDatabase () (* DBOperationResponse , error ) {
275
318
@@ -282,7 +325,7 @@ func (dbclient *CouchDatabase) DropDatabase() (*DBOperationResponse, error) {
282
325
}
283
326
connectURL .Path = dbclient .dbName
284
327
285
- resp , _ , err := dbclient .handleRequest (http .MethodDelete , connectURL .String (), nil , "" , "" )
328
+ resp , _ , err := dbclient .couchInstance . handleRequest (http .MethodDelete , connectURL .String (), nil , "" , "" )
286
329
if err != nil {
287
330
return nil , err
288
331
}
@@ -319,7 +362,7 @@ func (dbclient *CouchDatabase) EnsureFullCommit() (*DBOperationResponse, error)
319
362
}
320
363
connectURL .Path = dbclient .dbName + "/_ensure_full_commit"
321
364
322
- resp , _ , err := dbclient .handleRequest (http .MethodPost , connectURL .String (), nil , "" , "" )
365
+ resp , _ , err := dbclient .couchInstance . handleRequest (http .MethodPost , connectURL .String (), nil , "" , "" )
323
366
if err != nil {
324
367
logger .Errorf ("Failed to invoke _ensure_full_commit Error: %s\n " , err .Error ())
325
368
return nil , err
@@ -413,7 +456,7 @@ func (dbclient *CouchDatabase) SaveDoc(id string, rev string, couchDoc *CouchDoc
413
456
}
414
457
415
458
//handle the request for saving the JSON or attachments
416
- resp , _ , err := dbclient .handleRequest (http .MethodPut , saveURL .String (), data , rev , defaultBoundary )
459
+ resp , _ , err := dbclient .couchInstance . handleRequest (http .MethodPut , saveURL .String (), data , rev , defaultBoundary )
417
460
if err != nil {
418
461
return "" , err
419
462
}
@@ -536,7 +579,7 @@ func (dbclient *CouchDatabase) ReadDoc(id string) (*CouchDoc, string, error) {
536
579
537
580
readURL .RawQuery = query .Encode ()
538
581
539
- resp , couchDBReturn , err := dbclient .handleRequest (http .MethodGet , readURL .String (), nil , "" , "" )
582
+ resp , couchDBReturn , err := dbclient .couchInstance . handleRequest (http .MethodGet , readURL .String (), nil , "" , "" )
540
583
if err != nil {
541
584
fmt .Printf ("couchDBReturn=%v" , couchDBReturn )
542
585
if couchDBReturn != nil && couchDBReturn .StatusCode == 404 {
@@ -686,7 +729,7 @@ func (dbclient *CouchDatabase) ReadDocRange(startKey, endKey string, limit, skip
686
729
687
730
rangeURL .RawQuery = queryParms .Encode ()
688
731
689
- resp , _ , err := dbclient .handleRequest (http .MethodGet , rangeURL .String (), nil , "" , "" )
732
+ resp , _ , err := dbclient .couchInstance . handleRequest (http .MethodGet , rangeURL .String (), nil , "" , "" )
690
733
if err != nil {
691
734
return nil , err
692
735
}
@@ -781,7 +824,7 @@ func (dbclient *CouchDatabase) DeleteDoc(id, rev string) error {
781
824
782
825
logger .Debugf (" rev=%s" , rev )
783
826
784
- resp , couchDBReturn , err := dbclient .handleRequest (http .MethodDelete , deleteURL .String (), nil , rev , "" )
827
+ resp , couchDBReturn , err := dbclient .couchInstance . handleRequest (http .MethodDelete , deleteURL .String (), nil , rev , "" )
785
828
if err != nil {
786
829
fmt .Printf ("couchDBReturn=%v" , couchDBReturn )
787
830
if couchDBReturn != nil && couchDBReturn .StatusCode == 404 {
@@ -826,7 +869,7 @@ func (dbclient *CouchDatabase) QueryDocuments(query string, limit, skip int) (*[
826
869
827
870
data .ReadFrom (bytes .NewReader ([]byte (query )))
828
871
829
- resp , _ , err := dbclient .handleRequest (http .MethodPost , queryURL .String (), data , "" , "" )
872
+ resp , _ , err := dbclient .couchInstance . handleRequest (http .MethodPost , queryURL .String (), data , "" , "" )
830
873
if err != nil {
831
874
return nil , err
832
875
}
@@ -887,7 +930,7 @@ func (dbclient *CouchDatabase) QueryDocuments(query string, limit, skip int) (*[
887
930
}
888
931
889
932
//handleRequest method is a generic http request handler
890
- func (dbclient * CouchDatabase ) handleRequest (method , connectURL string , data io.Reader , rev string , multipartBoundary string ) (* http.Response , * DBReturn , error ) {
933
+ func (couchInstance * CouchInstance ) handleRequest (method , connectURL string , data io.Reader , rev string , multipartBoundary string ) (* http.Response , * DBReturn , error ) {
891
934
892
935
logger .Debugf ("Entering handleRequest() method=%s url=%v" , method , connectURL )
893
936
@@ -925,8 +968,8 @@ func (dbclient *CouchDatabase) handleRequest(method, connectURL string, data io.
925
968
}
926
969
927
970
//If username and password are set the use basic auth
928
- if dbclient . couchInstance .conf .Username != "" && dbclient . couchInstance .conf .Password != "" {
929
- req .SetBasicAuth (dbclient . couchInstance .conf .Username , dbclient . couchInstance .conf .Password )
971
+ if couchInstance .conf .Username != "" && couchInstance .conf .Password != "" {
972
+ req .SetBasicAuth (couchInstance .conf .Username , couchInstance .conf .Password )
930
973
}
931
974
932
975
if logger .IsEnabledFor (logging .DEBUG ) {
0 commit comments