oracle.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package database
  2. import (
  3. "database/sql"
  4. "github.com/gogf/gf/database/gdb"
  5. "github.com/gogf/gf/errors/gcode"
  6. "github.com/gogf/gf/errors/gerror"
  7. "github.com/gogf/gf/text/gregex"
  8. "github.com/gogf/gf/util/gconv"
  9. gora "github.com/sijms/go-ora/v2"
  10. )
  11. type OracleDriver struct {
  12. *gdb.DriverOracle
  13. }
  14. var (
  15. // customDriverName is my driver name, which is used for registering.
  16. customDriverName = "oracle"
  17. )
  18. func init() {
  19. // It here registers my custom driver in package initialization function "init".
  20. // You can later use this type in the database configuration.
  21. if err := gdb.Register(customDriverName, &OracleDriver{}); err != nil {
  22. panic(err)
  23. }
  24. }
  25. // New creates and returns a database object for oracle.
  26. // It implements the interface of gdb.Driver for extra database driver installation.
  27. func (d *OracleDriver) New(core *gdb.Core, node *gdb.ConfigNode) (gdb.DB, error) {
  28. return &OracleDriver{
  29. &gdb.DriverOracle{
  30. Core: core,
  31. },
  32. }, nil
  33. }
  34. // Open creates and returns an underlying sql.DB object for oracle.
  35. func (d *OracleDriver) Open(config *gdb.ConfigNode) (db *sql.DB, err error) {
  36. var (
  37. source string
  38. underlyingDriverName = "oracle"
  39. )
  40. options := map[string]string{
  41. "CONNECTION TIMEOUT": "60",
  42. "PREFETCH_ROWS": "25",
  43. }
  44. if config.Debug {
  45. options["TRACE FILE"] = "oracle_trace.log"
  46. }
  47. // [username:[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN]
  48. if config.Link != "" {
  49. // ============================================================================
  50. // Deprecated from v2.2.0.
  51. // ============================================================================
  52. source = config.Link
  53. // Custom changing the schema in runtime.
  54. if config.Name != "" {
  55. source, _ = gregex.ReplaceString(`@(.+?)/([\w\.\-]+)+`, "@$1/"+config.Name, source)
  56. }
  57. } else {
  58. source = gora.BuildUrl(
  59. config.Host, gconv.Int(config.Port), config.Name, config.User, config.Pass, options,
  60. )
  61. }
  62. if db, err = sql.Open(underlyingDriverName, source); err != nil {
  63. err = gerror.WrapCodef(
  64. gcode.CodeDbOperationError, err,
  65. `sql.Open failed for driver "%s" by source "%s"`, underlyingDriverName, source,
  66. )
  67. return nil, err
  68. }
  69. return
  70. }