github.com/mmatczuk/gohan@v0.0.0-20170206152520-30e45d9bdb69/extension/gohanscript/lib/gohan.go (about) 1 // Copyright (C) 2016 Juniper Networks, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 // implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 package lib 17 18 import ( 19 "fmt" 20 "strings" 21 22 "github.com/cloudwan/gohan/db" 23 "github.com/cloudwan/gohan/db/sql" 24 "github.com/cloudwan/gohan/db/transaction" 25 "github.com/cloudwan/gohan/extension" 26 "github.com/cloudwan/gohan/extension/gohanscript" 27 "github.com/cloudwan/gohan/schema" 28 "github.com/cloudwan/gohan/util" 29 ) 30 31 func init() { 32 gohanscript.RegisterStmtParser("transaction", transactionFunc) 33 } 34 35 func transactionFunc(stmt *gohanscript.Stmt) (func(*gohanscript.Context) (interface{}, error), error) { 36 stmts, err := gohanscript.MakeStmts(stmt.File, stmt.RawNode["transaction"]) 37 if err != nil { 38 return nil, err 39 } 40 runner, err := gohanscript.StmtsToFunc("transaction", stmts) 41 if err != nil { 42 return nil, err 43 } 44 return func(context *gohanscript.Context) (interface{}, error) { 45 dbVar := util.MaybeString(stmt.RawData["db"]) 46 if dbVar == "" { 47 dbVar = "db" 48 } 49 rawDB, err := context.Get(dbVar) 50 if err != nil { 51 return nil, err 52 } 53 connection := rawDB.(db.DB) 54 tx, err := connection.Begin() 55 if err != nil { 56 return nil, err 57 } 58 transactionVar := util.MaybeString(stmt.RawData["transaction_var"]) 59 if transactionVar == "" { 60 transactionVar = "transaction" 61 } 62 context.Set(transactionVar, tx) 63 value, err := runner(context) 64 if err == nil { 65 tx.Commit() 66 } 67 tx.Close() 68 return value, err 69 }, nil 70 } 71 72 //GohanSchema returns gohan schema object by schemaID. 73 func GohanSchema(schemaID string) (*schema.Schema, error) { 74 var err error 75 manager := schema.GetManager() 76 schema, ok := manager.Schema(schemaID) 77 if !ok { 78 err = fmt.Errorf("Schema %s isn't loaded", schemaID) 79 } 80 return schema, err 81 } 82 83 //GohanSchemas returns map of schemas. 84 func GohanSchemas() schema.Map { 85 manager := schema.GetManager() 86 return manager.Schemas() 87 } 88 89 //GohanPolicies returns all policies 90 func GohanPolicies() []*schema.Policy { 91 manager := schema.GetManager() 92 return manager.Policies() 93 } 94 95 //ReadConfig reads configuraion from file. 96 func ReadConfig(path string) error { 97 config := util.GetConfig() 98 err := config.ReadConfig(path) 99 return err 100 } 101 102 //GetConfig returns config by key. 103 func GetConfig(key string, defaultValue interface{}) interface{} { 104 config := util.GetConfig() 105 return config.GetParam(key, defaultValue) 106 } 107 108 //GohanLoadSchema loads schema from path. 109 func GohanLoadSchema(src string) (interface{}, error) { 110 manager := schema.GetManager() 111 err := manager.LoadSchemaFromFile(src) 112 return nil, err 113 } 114 115 //ConnectDB start connection to db 116 func ConnectDB(dbType string, connection string, maxOpenConn int) (db.DB, error) { 117 return db.ConnectDB(dbType, connection, maxOpenConn) 118 } 119 120 //InitDB initializes database using schema. 121 func InitDB(dbType string, connection string, dropOnCreate bool, cascade bool) error { 122 err := db.InitDBWithSchemas(dbType, connection, dropOnCreate, cascade) 123 return err 124 } 125 126 //DBBegin starts transaction 127 func DBBegin(connection db.DB) (transaction.Transaction, error) { 128 return connection.Begin() 129 } 130 131 //DBCommit commits transaction 132 func DBCommit(tx transaction.Transaction) error { 133 return tx.Commit() 134 } 135 136 //DBClose closes a transaction. 137 func DBClose(tx transaction.Transaction) error { 138 return tx.Close() 139 } 140 141 //DBGet get resource from a db. 142 func DBGet(tx transaction.Transaction, schemaID string, id string, tenantID string) (map[string]interface{}, error) { 143 manager := schema.GetManager() 144 schemaObj, ok := manager.Schema(schemaID) 145 if !ok { 146 return nil, fmt.Errorf("Schema %s not found", schemaID) 147 } 148 filter := transaction.IDFilter(id) 149 if tenantID != "" { 150 filter["tenant_id"] = tenantID 151 } 152 resp, err := tx.Fetch(schemaObj, filter) 153 if err != nil { 154 return nil, err 155 } 156 return resp.Data(), err 157 } 158 159 //DBCreate creates a resource in a db. 160 func DBCreate(tx transaction.Transaction, schemaID string, data map[string]interface{}) error { 161 manager := schema.GetManager() 162 resource, err := manager.LoadResource(schemaID, data) 163 if err != nil { 164 return err 165 } 166 return tx.Create(resource) 167 } 168 169 //DBList lists data from database. 170 func DBList(tx transaction.Transaction, schemaID string, filter map[string]interface{}) ([]interface{}, error) { 171 manager := schema.GetManager() 172 schemaObj, ok := manager.Schema(schemaID) 173 if !ok { 174 return nil, fmt.Errorf("Schema %s not found", schemaID) 175 } 176 for key, value := range filter { 177 switch v := value.(type) { 178 case string: 179 filter[key] = []string{v} 180 case bool: 181 filter[key] = []string{fmt.Sprintf("%v", v)} 182 case int: 183 filter[key] = []string{fmt.Sprintf("%v", v)} 184 case []interface{}: 185 filterList := make([]string, len(v)) 186 for _, item := range v { 187 filterList = append(filterList, fmt.Sprintf("%v", item)) 188 } 189 filter[key] = filterList 190 } 191 } 192 resources, _, err := tx.List(schemaObj, filter, nil) 193 resp := []interface{}{} 194 for _, resource := range resources { 195 resp = append(resp, resource.Data()) 196 } 197 return resp, err 198 } 199 200 //DBUpdate updates a resource in a db. 201 func DBUpdate(tx transaction.Transaction, schemaID string, data map[string]interface{}) error { 202 manager := schema.GetManager() 203 resource, err := manager.LoadResource(schemaID, data) 204 if err != nil { 205 return err 206 } 207 return tx.Update(resource) 208 } 209 210 //DBDelete deletes a resource in a db. 211 func DBDelete(tx transaction.Transaction, schemaID string, id string) error { 212 manager := schema.GetManager() 213 schemaObj, ok := manager.Schema(schemaID) 214 if !ok { 215 return fmt.Errorf("Schema %s not found", schemaID) 216 } 217 return tx.Delete(schemaObj, id) 218 } 219 220 //DBQuery fetchs data from db with additional query 221 func DBQuery(tx transaction.Transaction, schemaID string, sql string, arguments []interface{}) ([]interface{}, error) { 222 manager := schema.GetManager() 223 schemaObj, ok := manager.Schema(schemaID) 224 if !ok { 225 return nil, fmt.Errorf("Schema %s not found", schemaID) 226 } 227 resources, err := tx.Query(schemaObj, sql, arguments) 228 resp := []interface{}{} 229 for _, resource := range resources { 230 resp = append(resp, resource.Data()) 231 } 232 return resp, err 233 } 234 235 //DBExec closes a transaction. 236 func DBExec(tx transaction.Transaction, sql string, arguments []interface{}) error { 237 return tx.Exec(sql, arguments...) 238 } 239 240 //DBColumn makes partiall part of sql query from schema 241 func DBColumn(schemaID string, join bool) (string, error) { 242 manager := schema.GetManager() 243 schemaObj, ok := manager.Schema(schemaID) 244 if !ok { 245 return "", fmt.Errorf("Schema %s not found", schemaID) 246 } 247 return strings.Join(sql.MakeColumns(schemaObj, schemaObj.GetDbTableName(), join), ", "), nil 248 } 249 250 //Error returns extension Error 251 func Error(code int, name, message string) error { 252 return extension.Errorf(code, name, message) 253 }