Giter Site home page Giter Site logo

mysql_defaults_file's Introduction

mysql_defaults_file

Access in Go to MySQL via a defaults_file.

If using the MySQL command line utilities such as mysql or mysqladmin you can provide a defaults-file option which stores the credentials of the MySQL server you want to connect to. If no specific defaults file is mentioned these utilities look in ~/.my.cnf for this file.

The Go sql interface does not support this functionality yet it can be quite convenient as it avoids the need to explicitly provide credentials.

This small module fills in that gap by providing a function to allow you to connect to MySQL using a specified defaults-file, or using the ~/.my.cnf if you do not specify a defaults-file path.

There is also a function BuildDSN which allows you to build up a Go dsn for MySQL using various entries in a mysql .ini file.

This logic could be simplified by using github.com/go-sql-driver/mysql.Config together with Config.FormatDSN(), but there are a few minor differences in behaviour such as the default timezone handling using mysql.Config being UTC compared to mysql's command line client using the system timezone.

The functions provided are used by ps-top to simplify the connectivity and have been split off from it as they may be useful for other programs that connect to MySQL.

The code has been extended to handle quoted usernames and passwords, removing whitespace and quotes if found. Quoting with single or double quotes is permitted.

Usage

Usage:

import (
	...
	"database/sql"

	_ "github.com/go-sql-driver/mysql"
	"github.com/sjmudd/mysql_defaults_file"
	...
)

// Get the DSN information from the defaults file, provide the
// database to connect to and use sql.Open as normal
db, err = sql.Open("mysql", mysql_defaults_file.DefaultDSN("", "mydb"))

// Get the DSN from a non-standard defaults file, provide the
// database to connect to and use sql.Open as normal
db, err = sql.Open("mysql", mysql_defaults_file.DefaultDSN("/path/to/.my.cnf", "mydb"))

// open the connection to the database using the default defaults-file (original way).
db, err = mysql_defaults_file.OpenUsingDefaultsFile("mysql", "", "performance_schema")

// open the connection to the database using the default defaults-file (shorter form).
db, err = mysql_defaults_file.Open("", "")

// open the connection to the database using a specific defaults-file and to mydb.
db, err = mysql_defaults_file.Open("/path/to/my.ini", "mydb")

The errors you get back will be the same as calling sql.Open( "mysql",..... ).

Licensing

BSD 2-Clause License

Feedback

Feedback and patches welcome.

Simon J Mudd [email protected]

Code Documenton

godoc.org/github.com/sjmudd/mysql_defaults_file

mysql_defaults_file's People

Contributors

sjmudd avatar

Stargazers

Royall Spence avatar Dan Burke avatar Damian Gryski avatar

Watchers

 avatar James Cloos avatar  avatar

Forkers

esoel

mysql_defaults_file's Issues

Parse / ignore quotes in .cnf values

Hi,

Thanks for the very neat ps-top tool - it's incredibly helpful!

We had some trouble with it with our preexisting ~/.my.cnf login files. We figured out that the reason is that we quote some field values, eg password="blah". We do this because auto-generated passwords can contain special characters like #;\ all of which have meaning in the my.cnf spec - e.g. a # in a password string would be interpreted by the mysql CLI tools as a comment. The quotation marks allow you to express a literal. It seems the my.cnf and .ini formats are similar but not really compatible.

On the positive side, it looks like the ini parser you use pretty much isn't doing any interpreting (i.e. every config value currently is a literal, #; etc that's not at the beginning of a line is ignored anyway), so perhaps just trimming surrounding quotes from the .ini values actually "fixes" this problem for now, until - if ever - you decide to support those other constructs.

eg

func quoteTrim(val string) string {
    valLen = len(val)
    if valLen >= 2 {
        if val[0] == '"' && val[valLen-1] == '"' {
            return val[1 : valLen-1]
        }
    }
    return val
}

and then use that all around here.

How does this sound? I'm happy to give this a go and make a PR if that's acceptable to you.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.