github.com/renegr87/renegr87@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr/lockbased_query_executer.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package lockbasedtxmgr 8 9 import ( 10 commonledger "github.com/hyperledger/fabric/common/ledger" 11 "github.com/hyperledger/fabric/core/ledger" 12 ) 13 14 // lockBasedQueryExecutor is a query executor used in `LockBasedTxMgr` 15 type lockBasedQueryExecutor struct { 16 helper *queryHelper 17 txid string 18 } 19 20 func newQueryExecutor(txmgr *LockBasedTxMgr, txid string, performCollCheck bool, hasher ledger.Hasher) *lockBasedQueryExecutor { 21 helper := newQueryHelper(txmgr, nil, performCollCheck, hasher) 22 logger.Debugf("constructing new query executor txid = [%s]", txid) 23 return &lockBasedQueryExecutor{helper, txid} 24 } 25 26 // GetState implements method in interface `ledger.QueryExecutor` 27 func (q *lockBasedQueryExecutor) GetState(ns string, key string) (val []byte, err error) { 28 val, _, err = q.helper.getState(ns, key) 29 return 30 } 31 32 // GetStateMetadata implements method in interface `ledger.QueryExecutor` 33 func (q *lockBasedQueryExecutor) GetStateMetadata(namespace, key string) (map[string][]byte, error) { 34 return q.helper.getStateMetadata(namespace, key) 35 } 36 37 // GetStateMultipleKeys implements method in interface `ledger.QueryExecutor` 38 func (q *lockBasedQueryExecutor) GetStateMultipleKeys(namespace string, keys []string) ([][]byte, error) { 39 return q.helper.getStateMultipleKeys(namespace, keys) 40 } 41 42 // GetStateRangeScanIterator implements method in interface `ledger.QueryExecutor` 43 // startKey is included in the results and endKey is excluded. An empty startKey refers to the first available key 44 // and an empty endKey refers to the last available key. For scanning all the keys, both the startKey and the endKey 45 // can be supplied as empty strings. However, a full scan should be used judiciously for performance reasons. 46 func (q *lockBasedQueryExecutor) GetStateRangeScanIterator(namespace string, startKey string, endKey string) (commonledger.ResultsIterator, error) { 47 return q.helper.getStateRangeScanIterator(namespace, startKey, endKey) 48 } 49 50 // GetStateRangeScanIteratorWithMetadata implements method in interface `ledger.QueryExecutor` 51 // startKey is included in the results and endKey is excluded. An empty startKey refers to the first available key 52 // and an empty endKey refers to the last available key. For scanning all the keys, both the startKey and the endKey 53 // can be supplied as empty strings. However, a full scan should be used judiciously for performance reasons. 54 // metadata is a map of additional query parameters 55 func (q *lockBasedQueryExecutor) GetStateRangeScanIteratorWithMetadata(namespace string, startKey string, endKey string, metadata map[string]interface{}) (ledger.QueryResultsIterator, error) { 56 return q.helper.getStateRangeScanIteratorWithMetadata(namespace, startKey, endKey, metadata) 57 } 58 59 // ExecuteQuery implements method in interface `ledger.QueryExecutor` 60 func (q *lockBasedQueryExecutor) ExecuteQuery(namespace, query string) (commonledger.ResultsIterator, error) { 61 return q.helper.executeQuery(namespace, query) 62 } 63 64 // ExecuteQueryWithMetadata implements method in interface `ledger.QueryExecutor` 65 func (q *lockBasedQueryExecutor) ExecuteQueryWithMetadata(namespace, query string, metadata map[string]interface{}) (ledger.QueryResultsIterator, error) { 66 return q.helper.executeQueryWithMetadata(namespace, query, metadata) 67 } 68 69 // GetPrivateData implements method in interface `ledger.QueryExecutor` 70 func (q *lockBasedQueryExecutor) GetPrivateData(namespace, collection, key string) ([]byte, error) { 71 return q.helper.getPrivateData(namespace, collection, key) 72 } 73 74 func (q *lockBasedQueryExecutor) GetPrivateDataHash(namespace, collection, key string) ([]byte, error) { 75 valueHash, _, err := q.helper.getPrivateDataValueHash(namespace, collection, key) 76 return valueHash, err 77 } 78 79 // GetPrivateDataMetadata implements method in interface `ledger.QueryExecutor` 80 func (q *lockBasedQueryExecutor) GetPrivateDataMetadata(namespace, collection, key string) (map[string][]byte, error) { 81 return q.helper.getPrivateDataMetadata(namespace, collection, key) 82 } 83 84 // GetPrivateDataMetadataByHash implements method in interface `ledger.QueryExecutor` 85 func (q *lockBasedQueryExecutor) GetPrivateDataMetadataByHash(namespace, collection string, keyhash []byte) (map[string][]byte, error) { 86 return q.helper.getPrivateDataMetadataByHash(namespace, collection, keyhash) 87 } 88 89 // GetPrivateDataMultipleKeys implements method in interface `ledger.QueryExecutor` 90 func (q *lockBasedQueryExecutor) GetPrivateDataMultipleKeys(namespace, collection string, keys []string) ([][]byte, error) { 91 return q.helper.getPrivateDataMultipleKeys(namespace, collection, keys) 92 } 93 94 // GetPrivateDataRangeScanIterator implements method in interface `ledger.QueryExecutor` 95 func (q *lockBasedQueryExecutor) GetPrivateDataRangeScanIterator(namespace, collection, startKey, endKey string) (commonledger.ResultsIterator, error) { 96 return q.helper.getPrivateDataRangeScanIterator(namespace, collection, startKey, endKey) 97 } 98 99 // ExecuteQueryOnPrivateData implements method in interface `ledger.QueryExecutor` 100 func (q *lockBasedQueryExecutor) ExecuteQueryOnPrivateData(namespace, collection, query string) (commonledger.ResultsIterator, error) { 101 return q.helper.executeQueryOnPrivateData(namespace, collection, query) 102 } 103 104 // Done implements method in interface `ledger.QueryExecutor` 105 func (q *lockBasedQueryExecutor) Done() { 106 logger.Debugf("Done with transaction simulation / query execution [%s]", q.txid) 107 q.helper.done() 108 }