util.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package util
  2. import (
  3. "fmt"
  4. "io"
  5. . "jy/mongodbutil"
  6. "log"
  7. "os"
  8. qu "qfw/util"
  9. . "gopkg.in/mgo.v2/bson"
  10. "gopkg.in/natefinch/lumberjack.v2"
  11. )
  12. var syncint chan bool //获取下标锁
  13. var Config map[string]interface{}
  14. var Se = qu.SimpleEncrypt{Key: "topnet@extract"}
  15. func init() {
  16. //输出日志配置,多输出源
  17. filelog := &lumberjack.Logger{
  18. Filename: "./out.log",
  19. MaxSize: 500, // megabytes
  20. MaxBackups: 3,
  21. MaxAge: 20, //days
  22. Compress: true, // disabled by default
  23. }
  24. writers := []io.Writer{
  25. filelog,
  26. os.Stdout,
  27. }
  28. fileAndStdoutWriter := io.MultiWriter(writers...)
  29. log.SetOutput(fileAndStdoutWriter)
  30. syncint = make(chan bool, 1)
  31. }
  32. func InitMgoPool() {
  33. initCap := qu.IntAll(Config["dbsize"])
  34. addr := qu.ObjToString(Config["mgodb"])
  35. dbname := qu.ObjToString(Config["dbname"])
  36. Mgo = MgoFactory(initCap, initCap*3, 120, addr, dbname)
  37. }
  38. func GetSyncIndex(code string) string {
  39. tmp := ""
  40. syncint <- true
  41. Mgo.Update("rule_code", `{"code":"`+code+`"}`, M{"$inc": M{"index": 1}}, true, false)
  42. data, _ := Mgo.FindOne("rule_code", `{"code":"`+code+`"}`)
  43. <-syncint
  44. if len(*data) > 0 {
  45. tmp = code + "_" + fmt.Sprint((*data)["index"])
  46. }
  47. return tmp
  48. }
  49. //nfields非复制字段集
  50. func DeepCopy(value interface{}, nfields []string) interface{} {
  51. if valueMap, ok := value.(map[string]interface{}); ok {
  52. newMap := make(map[string]interface{})
  53. for k, v := range valueMap {
  54. iscop := true
  55. for _, fn := range nfields {
  56. if k == fn {
  57. iscop = false
  58. break
  59. }
  60. }
  61. if iscop {
  62. newMap[k] = DeepCopy(v, []string{})
  63. }
  64. }
  65. return newMap
  66. } else if valueSlice, ok := value.([]interface{}); ok {
  67. newSlice := make([]interface{}, len(valueSlice))
  68. for k, v := range valueSlice {
  69. newSlice[k] = DeepCopy(v, []string{})
  70. }
  71. return newSlice
  72. }
  73. return value
  74. }