github.com/willyham/dosa@v2.3.1-0.20171024181418-1e446d37ee71+incompatible/connectors/cassandra/keyspace_mapper.go (about) 1 // Copyright (c) 2017 Uber Technologies, Inc. 2 // 3 // Permission is hereby granted, free of charge, to any person obtaining a copy 4 // of this software and associated documentation files (the "Software"), to deal 5 // in the Software without restriction, including without limitation the rights 6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 // copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 // THE SOFTWARE. 20 21 package cassandra 22 23 import ( 24 "regexp" 25 ) 26 27 // ProductionKeyspaceName is the name of the production keyspace 28 const ProductionKeyspaceName = "production" 29 30 // CleanupKeyspaceName "cleans up" a keyspace name by changing unacceptable 31 // characters into underscores 32 func CleanupKeyspaceName(ksn string) string { 33 // clean up the scope, replacing invalid identifier characters with _ 34 re := regexp.MustCompile("[^a-zA-Z0-9_]") 35 newKsn := re.ReplaceAllLiteralString(ksn, "_") 36 // TODO: if len(newScope) > 48 then make a UUID hash 37 return newKsn 38 } 39 40 // KeyspaceMapper is an interface that maps scope/namePrefix to a keyspace 41 type KeyspaceMapper interface { 42 Keyspace(scope, namePrefix string) (keyspace string) 43 } 44 45 // UseScope is a simple KeyspaceMapper that always uses the scope 46 // to determine the keyspace name 47 type UseScope struct{} 48 49 // Keyspace just returns a cleaned-up scope name 50 func (*UseScope) Keyspace(scope, _ string) string { 51 return CleanupKeyspaceName(scope) 52 } 53 54 // UseNamePrefix is a simple keyspace mapper that always uses 55 // the namePrefix for the schema name 56 type UseNamePrefix struct{} 57 58 // Keyspace returns a cleaned-up copy of the namePrefix 59 func (*UseNamePrefix) Keyspace(_, namePrefix string) string { 60 return CleanupKeyspaceName(namePrefix) 61 } 62 63 // DefaultKeyspaceMapper is the KeyspaceMapper that is used when none is specified 64 var DefaultKeyspaceMapper = &UseScope{}