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  }