// Copyright 2013 Google Inc. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.

/*
Package cloudsql exposes access to Google Cloud SQL databases.

This package does not work in App Engine "flexible environment".

This package is intended for MySQL drivers to make App Engine-specific
connections. Applications should use this package through database/sql:
Select a pure Go MySQL driver that supports this package, and use sql.Open
with protocol "cloudsql" and an address of the Cloud SQL instance.

A Go MySQL driver that has been tested to work well with Cloud SQL
is the go-sql-driver:

	import "database/sql"
	import _ "github.com/go-sql-driver/mysql"

	db, err := sql.Open("mysql", "user@cloudsql(project-id:instance-name)/dbname")

Another driver that works well with Cloud SQL is the mymysql driver:

	import "database/sql"
	import _ "github.com/ziutek/mymysql/godrv"

	db, err := sql.Open("mymysql", "cloudsql:instance-name*dbname/user/password")

Using either of these drivers, you can perform a standard SQL query.
This example assumes there is a table named 'users' with
columns 'first_name' and 'last_name':

	rows, err := db.Query("SELECT first_name, last_name FROM users")
	if err != nil {
		log.Errorf(ctx, "db.Query: %v", err)
	}
	defer rows.Close()

	for rows.Next() {
		var firstName string
		var lastName string
		if err := rows.Scan(&firstName, &lastName); err != nil {
			log.Errorf(ctx, "rows.Scan: %v", err)
			continue
		}
		log.Infof(ctx, "First: %v - Last: %v", firstName, lastName)
	}
	if err := rows.Err(); err != nil {
		log.Errorf(ctx, "Row error: %v", err)
	}
*/
package cloudsql

import (
	"net"
)

// Dial connects to the named Cloud SQL instance.
func Dial(instance string) (net.Conn, error) {
	return connect(instance)
}
