diff --git a/.gitignore b/.gitignore index fa0e6b5..476eda6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,18 @@ .vscode # Exclude from upgrade -upgrade/*.c -upgrade/*.h +tools/upgrade/*.c +tools/upgrade/*.h # Exclude upgrade binary -upgrade/upgrade +cmd/upgrade/upgrade + +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +Icon? +ehthumbs.db +Thumbs.db +.idea \ No newline at end of file diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..c833e61 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,15 @@ +# This is the official list of Go-SQLite3 authors for copyright purposes. + +# If you are submitting a patch, please add your name or the name of the +# organization which holds the copyright to this list in alphabetical order. + +# Names should be added to this file as +# Name +# The email address is not required for organizations. +# Please keep the list sorted. + +# Individual Persons +G.J.R. Timmer +Yasuhiro Matsumoto + +# Organizations diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..42125a0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,17 @@ +## Version 2.0.0 (2018-xx-xx) + +Changes: + +- Rewrite of package +- Documentation fixes +- Moved `crypt` encoders to subpackage + +New Features: + +- Golang:1.10 `sql/driver` support +- Crypt + `Encoder` interface for implementing custom encoder + `Salter` interface for custom encoder + +Bug Fixes: +- TODO \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..8c0e2de --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing Guidelines + +## Reporting Issues + +Before creating a new Issue, please check first if a similar Issue [already exists](https://github.com/mattn/go-sqlite3/issues?state=open) or was [recently closed](https://github.com/mattn/go-sqlite3/issues?direction=desc&page=1&sort=updated&state=closed). + +## Contributing Code + +By contributing to this project, you share your code under the MIT License, as specified in the LICENSE file. +Don't forget to add yourself to the AUTHORS file. + +### Code Review + +Everyone is invited to review and comment on pull requests. +If it looks fine to you, comment with "LGTM" (Looks good to me). + +If changes are required, notice the reviewers with "PTAL" (Please take another look) after committing the fixes. + +Before merging the Pull Request, at least one team member must have commented with "LGTM". + +## Development Ideas + +If you are looking for ideas for code contributions, please check our [Development Ideas](https://github.com/mattn/go-sqlite3/wiki/Development-Ideas) Wiki page. \ No newline at end of file diff --git a/LICENSE b/LICENSE index ca458bb..e364750 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Yasuhiro Matsumoto +Copyright (c) 2018 Yasuhiro Matsumoto Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 37d017a..48c5f09 100644 --- a/README.md +++ b/README.md @@ -1,518 +1 @@ -go-sqlite3 -========== - -[![GoDoc Reference](https://godoc.org/github.com/mattn/go-sqlite3?status.svg)](http://godoc.org/github.com/mattn/go-sqlite3) -[![Build Status](https://travis-ci.org/mattn/go-sqlite3.svg?branch=master)](https://travis-ci.org/mattn/go-sqlite3) -[![Coverage Status](https://coveralls.io/repos/mattn/go-sqlite3/badge.svg?branch=master)](https://coveralls.io/r/mattn/go-sqlite3?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/mattn/go-sqlite3)](https://goreportcard.com/report/github.com/mattn/go-sqlite3) - -# Description - -sqlite3 driver conforming to the built-in database/sql interface - -Supported Golang version: -- 1.9.x -- 1.10.x - -[This package follows the official Golang Release Policy.](https://golang.org/doc/devel/release.html#policy) - -### Overview - -- [Installation](#installation) -- [API Reference](#api-reference) -- [Connection String](#connection-string) -- [Features](#features) -- [Compilation](#compilation) - - [Android](#android) - - [ARM](#arm) - - [Cross Compile](#cross-compile) - - [Google Cloud Platform](#google-cloud-platform) - - [Linux](#linux) - - [Alpine](#alpine) - - [Fedora](#fedora) - - [Ubuntu](#ubuntu) - - [Mac OSX](#mac-osx) - - [Windows](#windows) - - [Errors](#errors) -- [User Authentication](#user-authentication) - - [Compile](#compile) - - [Usage](#usage) -- [Extensions](#extensions) - - [Spatialite](#spatialite) -- [FAQ](#faq) -- [License](#license) - -# Installation - -This package can be installed with the go get command: - - go get github.com/mattn/go-sqlite3 - -_go-sqlite3_ is *cgo* package. -If you want to build your app using go-sqlite3, you need gcc. -However, after you have built and installed _go-sqlite3_ with `go install github.com/mattn/go-sqlite3` (which requires gcc), you can build your app without relying on gcc in future. - -***Important: because this is a `CGO` enabled package you are required to set the environment variable `CGO_ENABLED=1` and have a `gcc` compile present within your path.*** - -# API Reference - -API documentation can be found here: http://godoc.org/github.com/mattn/go-sqlite3 - -Examples can be found under the [examples](./_example) directory - -# Connection String - -When creating a new SQLite database or connection to an existing one, with the file name additional options can be given. -This is also known as a DSN string. (Data Source Name). - -Options are append after the filename of the SQLite database. -The database filename and options are seperated by an `?` (Question Mark). - -This also applies when using an in-memory database instead of a file. - -Options can be given using the following format: `KEYWORD=VALUE` and multiple options can be combined with the `&` ampersand. - -This library supports dsn options of SQLite itself and provides additional options. - -Boolean values can be one of: -* `0` `no` `false` `off` -* `1` `yes` `true` `on` - -| Name | Key | Value(s) | Description | -|------|-----|----------|-------------| -| UA - Create | `_auth` | - | Create User Authentication, for more information see [User Authentication](#user-authentication) | -| UA - Username | `_auth_user` | `string` | Username for User Authentication, for more information see [User Authentication](#user-authentication) | -| UA - Password | `_auth_pass` | `string` | Password for User Authentication, for more information see [User Authentication](#user-authentication) | -| UA - Crypt | `_auth_crypt` |
  • SHA1
  • SSHA1
  • SHA256
  • SSHA256
  • SHA384
  • SSHA384
  • SHA512
  • SSHA512
| Password encoder to use for User Authentication, for more information see [User Authentication](#user-authentication) | -| UA - Salt | `_auth_salt` | `string` | Salt to use if the configure password encoder requires a salt, for User Authentication, for more information see [User Authentication](#user-authentication) | -| Auto Vacuum | `_auto_vacuum` \| `_vacuum` |
  • `0` \| `none`
  • `1` \| `full`
  • `2` \| `incremental`
| For more information see [PRAGMA auto_vacuum](https://www.sqlite.org/pragma.html#pragma_auto_vacuum) | -| Busy Timeout | `_busy_timeout` \| `_timeout` | `int` | Specify value for sqlite3_busy_timeout. For more information see [PRAGMA busy_timeout](https://www.sqlite.org/pragma.html#pragma_busy_timeout) | -| Case Sensitive LIKE | `_case_sensitive_like` \| `_cslike` | `boolean` | For more information see [PRAGMA case_sensitive_like](https://www.sqlite.org/pragma.html#pragma_case_sensitive_like) | -| Defer Foreign Keys | `_defer_foreign_keys` \| `_defer_fk` | `boolean` | For more information see [PRAGMA defer_foreign_keys](https://www.sqlite.org/pragma.html#pragma_defer_foreign_keys) | -| Foreign Keys | `_foreign_keys` \| `_fk` | `boolean` | For more information see [PRAGMA foreign_keys](https://www.sqlite.org/pragma.html#pragma_foreign_keys) | -| Ignore CHECK Constraints | `_ignore_check_constraints` | `boolean` | For more information see [PRAGMA ignore_check_constraints](https://www.sqlite.org/pragma.html#pragma_ignore_check_constraints) | -| Immutable | `immutable` | `boolean` | For more information see [Immutable](https://www.sqlite.org/c3ref/open.html) | -| Journal Mode | `_journal_mode` \| `_journal` |
  • DELETE
  • TRUNCATE
  • PERSIST
  • MEMORY
  • WAL
  • OFF
| For more information see [PRAGMA journal_mode](https://www.sqlite.org/pragma.html#pragma_journal_mode) | -| Locking Mode | `_locking_mode` \| `_locking` |
  • NORMAL
  • EXCLUSIVE
| For more information see [PRAGMA locking_mode](https://www.sqlite.org/pragma.html#pragma_locking_mode) | -| Mode | `mode` |
  • ro
  • rw
  • rwc
  • memory
| Access Mode of the database. For more information see [SQLite Open](https://www.sqlite.org/c3ref/open.html) | -| Mutex Locking | `_mutex` |
  • no
  • full
| Specify mutex mode. | -| Query Only | `_query_only` | `boolean` | For more information see [PRAGMA query_only](https://www.sqlite.org/pragma.html#pragma_query_only) | -| Recursive Triggers | `_recursive_triggers` \| `_rt` | `boolean` | For more information see [PRAGMA recursive_triggers](https://www.sqlite.org/pragma.html#pragma_recursive_triggers) | -| Secure Delete | `_secure_delete` | `boolean` \| `FAST` | For more information see [PRAGMA secure_delete](https://www.sqlite.org/pragma.html#pragma_secure_delete) | -| Shared-Cache Mode | `cache` |
  • shared
  • private
| Set cache mode for more information see [sqlite.org](https://www.sqlite.org/sharedcache.html) | -| Synchronous | `_synchronous` \| `_sync` |
  • 0 \| OFF
  • 1 \| NORMAL
  • 2 \| FULL
  • 3 \| EXTRA
| For more information see [PRAGMA synchronous](https://www.sqlite.org/pragma.html#pragma_synchronous) | -| Time Zone Location | `_loc` | auto | Specify location of time format. | -| Transaction Lock | `_txlock` |
  • immediate
  • deferred
  • exclusive
| Specify locking behavior for transactions. | -| Writable Schema | `_writable_schema` | `Boolean` | When this pragma is on, the SQLITE_MASTER tables in which database can be changed using ordinary UPDATE, INSERT, and DELETE statements. Warning: misuse of this pragma can easily result in a corrupt database file. | - -## DSN Examples - -``` -file:test.db?cache=shared&mode=memory -``` - -# Features - -This package allows additional configuration of features available within SQLite3 to be enabled or disabled by golang build constraints also known as build `tags`. - -[Click here for more information about build tags / constraints.](https://golang.org/pkg/go/build/#hdr-Build_Constraints) - -### Usage - -If you wish to build this library with additional extensions / features. -Use the following command. - -```bash -go build --tags "" -``` - -For available features see the extension list. -When using multiple build tags, all the different tags should be space delimted. - -Example: - -```bash -go build --tags "icu json1 fts5 secure_delete" -``` - -### Feature / Extension List - -| Extension | Build Tag | Description | -|-----------|-----------|-------------| -| Additional Statistics | sqlite_stat4 | This option adds additional logic to the ANALYZE command and to the query planner that can help SQLite to chose a better query plan under certain situations. The ANALYZE command is enhanced to collect histogram data from all columns of every index and store that data in the sqlite_stat4 table.

The query planner will then use the histogram data to help it make better index choices. The downside of this compile-time option is that it violates the query planner stability guarantee making it more difficult to ensure consistent performance in mass-produced applications.

SQLITE_ENABLE_STAT4 is an enhancement of SQLITE_ENABLE_STAT3. STAT3 only recorded histogram data for the left-most column of each index whereas the STAT4 enhancement records histogram data from all columns of each index.

The SQLITE_ENABLE_STAT3 compile-time option is a no-op and is ignored if the SQLITE_ENABLE_STAT4 compile-time option is used | -| Allow URI Authority | sqlite_allow_uri_authority | URI filenames normally throws an error if the authority section is not either empty or "localhost".

However, if SQLite is compiled with the SQLITE_ALLOW_URI_AUTHORITY compile-time option, then the URI is converted into a Uniform Naming Convention (UNC) filename and passed down to the underlying operating system that way | -| App Armor | sqlite_app_armor | When defined, this C-preprocessor macro activates extra code that attempts to detect misuse of the SQLite API, such as passing in NULL pointers to required parameters or using objects after they have been destroyed.

App Armor is not available under `Windows`. | -| Disable Load Extensions | sqlite_omit_load_extension | Loading of external extensions is enabled by default.

To disable extension loading add the build tag `sqlite_omit_load_extension`. | -| Foreign Keys | sqlite_foreign_keys | This macro determines whether enforcement of foreign key constraints is enabled or disabled by default for new database connections.

Each database connection can always turn enforcement of foreign key constraints on and off and run-time using the foreign_keys pragma.

Enforcement of foreign key constraints is normally off by default, but if this compile-time parameter is set to 1, enforcement of foreign key constraints will be on by default | -| Full Auto Vacuum | sqlite_vacuum_full | Set the default auto vacuum to full | -| Incremental Auto Vacuum | sqlite_vacuum_incr | Set the default auto vacuum to incremental | -| Full Text Search Engine | sqlite_fts5 | When this option is defined in the amalgamation, versions 5 of the full-text search engine (fts5) is added to the build automatically | -| International Components for Unicode | sqlite_icu | This option causes the International Components for Unicode or "ICU" extension to SQLite to be added to the build | -| Introspect PRAGMAS | sqlite_introspect | This option adds some extra PRAGMA statements.
  • PRAGMA function_list
  • PRAGMA module_list
  • PRAGMA pragma_list
| -| JSON SQL Functions | sqlite_json | When this option is defined in the amalgamation, the JSON SQL functions are added to the build automatically | -| Secure Delete | sqlite_secure_delete | This compile-time option changes the default setting of the secure_delete pragma.

When this option is not used, secure_delete defaults to off. When this option is present, secure_delete defaults to on.

The secure_delete setting causes deleted content to be overwritten with zeros. There is a small performance penalty since additional I/O must occur.

On the other hand, secure_delete can prevent fragments of sensitive information from lingering in unused parts of the database file after it has been deleted. See the documentation on the secure_delete pragma for additional information | -| Secure Delete (FAST) | sqlite_secure_delete_fast | For more information see [PRAGMA secure_delete](https://www.sqlite.org/pragma.html#pragma_secure_delete) | -| Tracing / Debug | sqlite_trace | Activate trace functions | -| User Authentication | sqlite_userauth | SQLite User Authentication see [User Authentication](#user-authentication) for more information. | - -# Compilation - -This package requires `CGO_ENABLED=1` ennvironment variable if not set by default, and the presence of the `gcc` compiler. - -If you need to add additional CFLAGS or LDFLAGS to the build command, and do not want to modify this package. Then this can be achieved by using the `CGO_CFLAGS` and `CGO_LDFLAGS` environment variables. - -## Android - -This package can be compiled for android. -Compile with: - -```bash -go build --tags "android" -``` - -For more information see [#201](https://github.com/mattn/go-sqlite3/issues/201) - -# ARM - -To compile for `ARM` use the following environment. - -```bash -env CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ \ - CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 \ - go build -v -``` - -Additional information: -- [#242](https://github.com/mattn/go-sqlite3/issues/242) -- [#504](https://github.com/mattn/go-sqlite3/issues/504) - -# Cross Compile - -This library can be cross-compiled. - -In some cases you are required to the `CC` environment variable with the cross compiler. - -Additional information: -- [#491](https://github.com/mattn/go-sqlite3/issues/491) -- [#560](https://github.com/mattn/go-sqlite3/issues/560) - -# Google Cloud Platform - -Building on GCP is not possible because `Google Cloud Platform does not allow `gcc` to be executed. - -Please work only with compiled final binaries. - -## Linux - -To compile this package on Linux you must install the development tools for your linux distribution. - -To compile under linux use the build tag `linux`. - -```bash -go build --tags "linux" -``` - -If you wish to link directly to libsqlite3 then you can use the `libsqlite3` build tag. - -``` -go build --tags "libsqlite3 linux" -``` - -### Alpine - -When building in an `alpine` container run the following command before building. - -``` -apk add --update gcc musl-dev -``` - -### Fedora - -```bash -sudo yum groupinstall "Development Tools" "Development Libraries" -``` - -### Ubuntu - -```bash -sudo apt-get install build-essential -``` - -## Mac OSX - -OSX should have all the tools present to compile this package, if not install XCode this will add all the developers tools. - -Required dependency - -```bash -brew install sqlite3 -``` - -For OSX there is an additional package install which is required if you whish to build the `icu` extension. - -This additional package can be installed with `homebrew`. - -```bash -brew upgrade icu4c -``` - -To compile for Mac OSX. - -```bash -go build --tags "darwin" -``` - -If you wish to link directly to libsqlite3 then you can use the `libsqlite3` build tag. - -``` -go build --tags "libsqlite3 darwin" -``` - -Additional information: -- [#206](https://github.com/mattn/go-sqlite3/issues/206) -- [#404](https://github.com/mattn/go-sqlite3/issues/404) - -## Windows - -To compile this package on Windows OS you must have the `gcc` compiler installed. - -1) Install a Windows `gcc` toolchain. -2) Add the `bin` folders to the Windows path if the installer did not do this by default. -3) Open a terminal for the TDM-GCC toolchain, can be found in the Windows Start menu. -4) Navigate to your project folder and run the `go build ...` command for this package. - -For example the TDM-GCC Toolchain can be found [here](ttps://sourceforge.net/projects/tdm-gcc/). - -## Errors - -- Compile error: `can not be used when making a shared object; recompile with -fPIC` - - When receiving a compile time error referencing recompile with `-FPIC` then you - are probably using a hardend system. - - You can copile the library on a hardend system with the following command. - - ```bash - go build -ldflags '-extldflags=-fno-PIC' - ``` - - More details see [#120](https://github.com/mattn/go-sqlite3/issues/120) - -- Can't build go-sqlite3 on windows 64bit. - - > Probably, you are using go 1.0, go1.0 has a problem when it comes to compiling/linking on windows 64bit. - > See: [#27](https://github.com/mattn/go-sqlite3/issues/27) - -- `go get github.com/mattn/go-sqlite3` throws compilation error. - - `gcc` throws: `internal compiler error` - - Remove the download repository from your disk and try re-install with: - - ```bash - go install github.com/mattn/go-sqlite3 - ``` - -# User Authentication - -This package supports the SQLite User Authentication module. - -## Compile - -To use the User authentication module the package has to be compiled with the tag `sqlite_userauth`. See [Features](#features). - -## Usage - -### Create protected database - -To create a database protected by user authentication provide the following argument to the connection string `_auth`. -This will enable user authentication within the database. This option however requires two additional arguments: - -- `_auth_user` -- `_auth_pass` - -When `_auth` is present on the connection string user authentication will be enabled and the provided user will be created -as an `admin` user. After initial creation, the parameter `_auth` has no effect anymore and can be omitted from the connection string. - -Example connection string: - -Create an user authentication database with user `admin` and password `admin`. - -`file:test.s3db?_auth&_auth_user=admin&_auth_pass=admin` - -Create an user authentication database with user `admin` and password `admin` and use `SHA1` for the password encoding. - -`file:test.s3db?_auth&_auth_user=admin&_auth_pass=admin&_auth_crypt=sha1` - -### Password Encoding - -The passwords within the user authentication module of SQLite are encoded with the SQLite function `sqlite_cryp`. -This function uses a ceasar-cypher which is quite insecure. -This library provides several additional password encoders which can be configured through the connection string. - -The password cypher can be configured with the key `_auth_crypt`. And if the configured password encoder also requires an -salt this can be configured with `_auth_salt`. - -#### Available Encoders - -- SHA1 -- SSHA1 (Salted SHA1) -- SHA256 -- SSHA256 (salted SHA256) -- SHA384 -- SSHA384 (salted SHA384) -- SHA512 -- SSHA512 (salted SHA512) - -### Restrictions - -Operations on the database regarding to user management can only be preformed by an administrator user. - -### Support - -The user authentication supports two kinds of users - -- administrators -- regular users - -### User Management - -User management can be done by directly using the `*SQLiteConn` or by SQL. - -#### SQL - -The following sql functions are available for user management. - -| Function | Arguments | Description | -|----------|-----------|-------------| -| `authenticate` | username `string`, password `string` | Will authenticate an user, this is done by the connection; and should not be used manually. | -| `auth_user_add` | username `string`, password `string`, admin `int` | This function will add an user to the database.
if the database is not protected by user authentication it will enable it. Argument `admin` is an integer identifying if the added user should be an administrator. Only Administrators can add administrators. | -| `auth_user_change` | username `string`, password `string`, admin `int` | Function to modify an user. Users can change their own password, but only an administrator can change the administrator flag. | -| `authUserDelete` | username `string` | Delete an user from the database. Can only be used by an administrator. The current logged in administrator cannot be deleted. This is to make sure their is always an administrator remaining. | - -These functions will return an integer. - -- 0 (SQLITE_OK) -- 23 (SQLITE_AUTH) Failed to perform due to authentication or insufficient privileges - -##### Examples - -```sql -// Autheticate user -// Create Admin User -SELECT auth_user_add('admin2', 'admin2', 1); - -// Change password for user -SELECT auth_user_change('user', 'userpassword', 0); - -// Delete user -SELECT user_delete('user'); -``` - -#### *SQLiteConn - -The following functions are available for User authentication from the `*SQLiteConn`. - -| Function | Description | -|----------|-------------| -| `Authenticate(username, password string) error` | Authenticate user | -| `AuthUserAdd(username, password string, admin bool) error` | Add user | -| `AuthUserChange(username, password string, admin bool) error` | Modify user | -| `AuthUserDelete(username string) error` | Delete user | - -### Attached database - -When using attached databases. SQLite will use the authentication from the `main` database for the attached database(s). - -# Extensions - -If you want your own extension to be listed here or you want to add a reference to an extension; please submit an Issue for this. - -## Spatialite - -Spatialite is available as an extension to SQLite, and can be used in combination with this repository. -For an example see [shaxbee/go-spatialite](https://github.com/shaxbee/go-spatialite). - -# FAQ - -- Getting insert error while query is opened. - - > You can pass some arguments into the connection string, for example, a URI. - > See: [#39](https://github.com/mattn/go-sqlite3/issues/39) - -- Do you want to cross compile? mingw on Linux or Mac? - - > See: [#106](https://github.com/mattn/go-sqlite3/issues/106) - > See also: http://www.limitlessfx.com/cross-compile-golang-app-for-windows-from-linux.html - -- Want to get time.Time with current locale - - Use `_loc=auto` in SQLite3 filename schema like `file:foo.db?_loc=auto`. - -- Can I use this in multiple routines concurrently? - - Yes for readonly. But, No for writable. See [#50](https://github.com/mattn/go-sqlite3/issues/50), [#51](https://github.com/mattn/go-sqlite3/issues/51), [#209](https://github.com/mattn/go-sqlite3/issues/209), [#274](https://github.com/mattn/go-sqlite3/issues/274). - -- Why I'm getting `no such table` error? - - Why is it racy if I use a `sql.Open("sqlite3", ":memory:")` database? - - Each connection to :memory: opens a brand new in-memory sql database, so if - the stdlib's sql engine happens to open another connection and you've only - specified ":memory:", that connection will see a brand new database. A - workaround is to use "file::memory:?mode=memory&cache=shared". Every - connection to this string will point to the same in-memory database. - - For more information see - * [#204](https://github.com/mattn/go-sqlite3/issues/204) - * [#511](https://github.com/mattn/go-sqlite3/issues/511) - -- Reading from database with large amount of goroutines fails on OSX. - - OS X limits OS-wide to not have more than 1000 files open simultaneously by default. - - For more information see [#289](https://github.com/mattn/go-sqlite3/issues/289) - -- Trying to execure a `.` (dot) command throws an error. - - Error: `Error: near ".": syntax error` - Dot command are part of SQLite3 CLI not of this library. - - You need to implement the feature or call the sqlite3 cli. - - More infomation see [#305](https://github.com/mattn/go-sqlite3/issues/305) - -- Error: `database is locked` - - When you get an database is locked. Please use the following options. - - Add to DSN: `cache=shared` - - Example: - ```go - db, err := sql.Open("sqlite3", "file:locked.sqlite?cache=shared") - ``` - - Second please set the database connections of the SQL package to 1. - - ```go - db.SetMaxOpenConn(1) - ``` - - More information see [#209](https://github.com/mattn/go-sqlite3/issues/209) - -# License - -MIT: http://mattn.mit-license.org/2018 - -sqlite3-binding.c, sqlite3-binding.h, sqlite3ext.h - -The -binding suffix was added to avoid build failures under gccgo. - -In this repository, those files are an amalgamation of code that was copied from SQLite3. The license of that code is the same as the license of SQLite3. - -# Author - -Yasuhiro Matsumoto (a.k.a mattn) - -G.J.R. Timmer + # TODO Rewrite \ No newline at end of file diff --git a/_driver/README.md b/_driver/README.md new file mode 100644 index 0000000..37d017a --- /dev/null +++ b/_driver/README.md @@ -0,0 +1,518 @@ +go-sqlite3 +========== + +[![GoDoc Reference](https://godoc.org/github.com/mattn/go-sqlite3?status.svg)](http://godoc.org/github.com/mattn/go-sqlite3) +[![Build Status](https://travis-ci.org/mattn/go-sqlite3.svg?branch=master)](https://travis-ci.org/mattn/go-sqlite3) +[![Coverage Status](https://coveralls.io/repos/mattn/go-sqlite3/badge.svg?branch=master)](https://coveralls.io/r/mattn/go-sqlite3?branch=master) +[![Go Report Card](https://goreportcard.com/badge/github.com/mattn/go-sqlite3)](https://goreportcard.com/report/github.com/mattn/go-sqlite3) + +# Description + +sqlite3 driver conforming to the built-in database/sql interface + +Supported Golang version: +- 1.9.x +- 1.10.x + +[This package follows the official Golang Release Policy.](https://golang.org/doc/devel/release.html#policy) + +### Overview + +- [Installation](#installation) +- [API Reference](#api-reference) +- [Connection String](#connection-string) +- [Features](#features) +- [Compilation](#compilation) + - [Android](#android) + - [ARM](#arm) + - [Cross Compile](#cross-compile) + - [Google Cloud Platform](#google-cloud-platform) + - [Linux](#linux) + - [Alpine](#alpine) + - [Fedora](#fedora) + - [Ubuntu](#ubuntu) + - [Mac OSX](#mac-osx) + - [Windows](#windows) + - [Errors](#errors) +- [User Authentication](#user-authentication) + - [Compile](#compile) + - [Usage](#usage) +- [Extensions](#extensions) + - [Spatialite](#spatialite) +- [FAQ](#faq) +- [License](#license) + +# Installation + +This package can be installed with the go get command: + + go get github.com/mattn/go-sqlite3 + +_go-sqlite3_ is *cgo* package. +If you want to build your app using go-sqlite3, you need gcc. +However, after you have built and installed _go-sqlite3_ with `go install github.com/mattn/go-sqlite3` (which requires gcc), you can build your app without relying on gcc in future. + +***Important: because this is a `CGO` enabled package you are required to set the environment variable `CGO_ENABLED=1` and have a `gcc` compile present within your path.*** + +# API Reference + +API documentation can be found here: http://godoc.org/github.com/mattn/go-sqlite3 + +Examples can be found under the [examples](./_example) directory + +# Connection String + +When creating a new SQLite database or connection to an existing one, with the file name additional options can be given. +This is also known as a DSN string. (Data Source Name). + +Options are append after the filename of the SQLite database. +The database filename and options are seperated by an `?` (Question Mark). + +This also applies when using an in-memory database instead of a file. + +Options can be given using the following format: `KEYWORD=VALUE` and multiple options can be combined with the `&` ampersand. + +This library supports dsn options of SQLite itself and provides additional options. + +Boolean values can be one of: +* `0` `no` `false` `off` +* `1` `yes` `true` `on` + +| Name | Key | Value(s) | Description | +|------|-----|----------|-------------| +| UA - Create | `_auth` | - | Create User Authentication, for more information see [User Authentication](#user-authentication) | +| UA - Username | `_auth_user` | `string` | Username for User Authentication, for more information see [User Authentication](#user-authentication) | +| UA - Password | `_auth_pass` | `string` | Password for User Authentication, for more information see [User Authentication](#user-authentication) | +| UA - Crypt | `_auth_crypt` |
  • SHA1
  • SSHA1
  • SHA256
  • SSHA256
  • SHA384
  • SSHA384
  • SHA512
  • SSHA512
| Password encoder to use for User Authentication, for more information see [User Authentication](#user-authentication) | +| UA - Salt | `_auth_salt` | `string` | Salt to use if the configure password encoder requires a salt, for User Authentication, for more information see [User Authentication](#user-authentication) | +| Auto Vacuum | `_auto_vacuum` \| `_vacuum` |
  • `0` \| `none`
  • `1` \| `full`
  • `2` \| `incremental`
| For more information see [PRAGMA auto_vacuum](https://www.sqlite.org/pragma.html#pragma_auto_vacuum) | +| Busy Timeout | `_busy_timeout` \| `_timeout` | `int` | Specify value for sqlite3_busy_timeout. For more information see [PRAGMA busy_timeout](https://www.sqlite.org/pragma.html#pragma_busy_timeout) | +| Case Sensitive LIKE | `_case_sensitive_like` \| `_cslike` | `boolean` | For more information see [PRAGMA case_sensitive_like](https://www.sqlite.org/pragma.html#pragma_case_sensitive_like) | +| Defer Foreign Keys | `_defer_foreign_keys` \| `_defer_fk` | `boolean` | For more information see [PRAGMA defer_foreign_keys](https://www.sqlite.org/pragma.html#pragma_defer_foreign_keys) | +| Foreign Keys | `_foreign_keys` \| `_fk` | `boolean` | For more information see [PRAGMA foreign_keys](https://www.sqlite.org/pragma.html#pragma_foreign_keys) | +| Ignore CHECK Constraints | `_ignore_check_constraints` | `boolean` | For more information see [PRAGMA ignore_check_constraints](https://www.sqlite.org/pragma.html#pragma_ignore_check_constraints) | +| Immutable | `immutable` | `boolean` | For more information see [Immutable](https://www.sqlite.org/c3ref/open.html) | +| Journal Mode | `_journal_mode` \| `_journal` |
  • DELETE
  • TRUNCATE
  • PERSIST
  • MEMORY
  • WAL
  • OFF
| For more information see [PRAGMA journal_mode](https://www.sqlite.org/pragma.html#pragma_journal_mode) | +| Locking Mode | `_locking_mode` \| `_locking` |
  • NORMAL
  • EXCLUSIVE
| For more information see [PRAGMA locking_mode](https://www.sqlite.org/pragma.html#pragma_locking_mode) | +| Mode | `mode` |
  • ro
  • rw
  • rwc
  • memory
| Access Mode of the database. For more information see [SQLite Open](https://www.sqlite.org/c3ref/open.html) | +| Mutex Locking | `_mutex` |
  • no
  • full
| Specify mutex mode. | +| Query Only | `_query_only` | `boolean` | For more information see [PRAGMA query_only](https://www.sqlite.org/pragma.html#pragma_query_only) | +| Recursive Triggers | `_recursive_triggers` \| `_rt` | `boolean` | For more information see [PRAGMA recursive_triggers](https://www.sqlite.org/pragma.html#pragma_recursive_triggers) | +| Secure Delete | `_secure_delete` | `boolean` \| `FAST` | For more information see [PRAGMA secure_delete](https://www.sqlite.org/pragma.html#pragma_secure_delete) | +| Shared-Cache Mode | `cache` |
  • shared
  • private
| Set cache mode for more information see [sqlite.org](https://www.sqlite.org/sharedcache.html) | +| Synchronous | `_synchronous` \| `_sync` |
  • 0 \| OFF
  • 1 \| NORMAL
  • 2 \| FULL
  • 3 \| EXTRA
| For more information see [PRAGMA synchronous](https://www.sqlite.org/pragma.html#pragma_synchronous) | +| Time Zone Location | `_loc` | auto | Specify location of time format. | +| Transaction Lock | `_txlock` |
  • immediate
  • deferred
  • exclusive
| Specify locking behavior for transactions. | +| Writable Schema | `_writable_schema` | `Boolean` | When this pragma is on, the SQLITE_MASTER tables in which database can be changed using ordinary UPDATE, INSERT, and DELETE statements. Warning: misuse of this pragma can easily result in a corrupt database file. | + +## DSN Examples + +``` +file:test.db?cache=shared&mode=memory +``` + +# Features + +This package allows additional configuration of features available within SQLite3 to be enabled or disabled by golang build constraints also known as build `tags`. + +[Click here for more information about build tags / constraints.](https://golang.org/pkg/go/build/#hdr-Build_Constraints) + +### Usage + +If you wish to build this library with additional extensions / features. +Use the following command. + +```bash +go build --tags "" +``` + +For available features see the extension list. +When using multiple build tags, all the different tags should be space delimted. + +Example: + +```bash +go build --tags "icu json1 fts5 secure_delete" +``` + +### Feature / Extension List + +| Extension | Build Tag | Description | +|-----------|-----------|-------------| +| Additional Statistics | sqlite_stat4 | This option adds additional logic to the ANALYZE command and to the query planner that can help SQLite to chose a better query plan under certain situations. The ANALYZE command is enhanced to collect histogram data from all columns of every index and store that data in the sqlite_stat4 table.

The query planner will then use the histogram data to help it make better index choices. The downside of this compile-time option is that it violates the query planner stability guarantee making it more difficult to ensure consistent performance in mass-produced applications.

SQLITE_ENABLE_STAT4 is an enhancement of SQLITE_ENABLE_STAT3. STAT3 only recorded histogram data for the left-most column of each index whereas the STAT4 enhancement records histogram data from all columns of each index.

The SQLITE_ENABLE_STAT3 compile-time option is a no-op and is ignored if the SQLITE_ENABLE_STAT4 compile-time option is used | +| Allow URI Authority | sqlite_allow_uri_authority | URI filenames normally throws an error if the authority section is not either empty or "localhost".

However, if SQLite is compiled with the SQLITE_ALLOW_URI_AUTHORITY compile-time option, then the URI is converted into a Uniform Naming Convention (UNC) filename and passed down to the underlying operating system that way | +| App Armor | sqlite_app_armor | When defined, this C-preprocessor macro activates extra code that attempts to detect misuse of the SQLite API, such as passing in NULL pointers to required parameters or using objects after they have been destroyed.

App Armor is not available under `Windows`. | +| Disable Load Extensions | sqlite_omit_load_extension | Loading of external extensions is enabled by default.

To disable extension loading add the build tag `sqlite_omit_load_extension`. | +| Foreign Keys | sqlite_foreign_keys | This macro determines whether enforcement of foreign key constraints is enabled or disabled by default for new database connections.

Each database connection can always turn enforcement of foreign key constraints on and off and run-time using the foreign_keys pragma.

Enforcement of foreign key constraints is normally off by default, but if this compile-time parameter is set to 1, enforcement of foreign key constraints will be on by default | +| Full Auto Vacuum | sqlite_vacuum_full | Set the default auto vacuum to full | +| Incremental Auto Vacuum | sqlite_vacuum_incr | Set the default auto vacuum to incremental | +| Full Text Search Engine | sqlite_fts5 | When this option is defined in the amalgamation, versions 5 of the full-text search engine (fts5) is added to the build automatically | +| International Components for Unicode | sqlite_icu | This option causes the International Components for Unicode or "ICU" extension to SQLite to be added to the build | +| Introspect PRAGMAS | sqlite_introspect | This option adds some extra PRAGMA statements.
  • PRAGMA function_list
  • PRAGMA module_list
  • PRAGMA pragma_list
| +| JSON SQL Functions | sqlite_json | When this option is defined in the amalgamation, the JSON SQL functions are added to the build automatically | +| Secure Delete | sqlite_secure_delete | This compile-time option changes the default setting of the secure_delete pragma.

When this option is not used, secure_delete defaults to off. When this option is present, secure_delete defaults to on.

The secure_delete setting causes deleted content to be overwritten with zeros. There is a small performance penalty since additional I/O must occur.

On the other hand, secure_delete can prevent fragments of sensitive information from lingering in unused parts of the database file after it has been deleted. See the documentation on the secure_delete pragma for additional information | +| Secure Delete (FAST) | sqlite_secure_delete_fast | For more information see [PRAGMA secure_delete](https://www.sqlite.org/pragma.html#pragma_secure_delete) | +| Tracing / Debug | sqlite_trace | Activate trace functions | +| User Authentication | sqlite_userauth | SQLite User Authentication see [User Authentication](#user-authentication) for more information. | + +# Compilation + +This package requires `CGO_ENABLED=1` ennvironment variable if not set by default, and the presence of the `gcc` compiler. + +If you need to add additional CFLAGS or LDFLAGS to the build command, and do not want to modify this package. Then this can be achieved by using the `CGO_CFLAGS` and `CGO_LDFLAGS` environment variables. + +## Android + +This package can be compiled for android. +Compile with: + +```bash +go build --tags "android" +``` + +For more information see [#201](https://github.com/mattn/go-sqlite3/issues/201) + +# ARM + +To compile for `ARM` use the following environment. + +```bash +env CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ \ + CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 \ + go build -v +``` + +Additional information: +- [#242](https://github.com/mattn/go-sqlite3/issues/242) +- [#504](https://github.com/mattn/go-sqlite3/issues/504) + +# Cross Compile + +This library can be cross-compiled. + +In some cases you are required to the `CC` environment variable with the cross compiler. + +Additional information: +- [#491](https://github.com/mattn/go-sqlite3/issues/491) +- [#560](https://github.com/mattn/go-sqlite3/issues/560) + +# Google Cloud Platform + +Building on GCP is not possible because `Google Cloud Platform does not allow `gcc` to be executed. + +Please work only with compiled final binaries. + +## Linux + +To compile this package on Linux you must install the development tools for your linux distribution. + +To compile under linux use the build tag `linux`. + +```bash +go build --tags "linux" +``` + +If you wish to link directly to libsqlite3 then you can use the `libsqlite3` build tag. + +``` +go build --tags "libsqlite3 linux" +``` + +### Alpine + +When building in an `alpine` container run the following command before building. + +``` +apk add --update gcc musl-dev +``` + +### Fedora + +```bash +sudo yum groupinstall "Development Tools" "Development Libraries" +``` + +### Ubuntu + +```bash +sudo apt-get install build-essential +``` + +## Mac OSX + +OSX should have all the tools present to compile this package, if not install XCode this will add all the developers tools. + +Required dependency + +```bash +brew install sqlite3 +``` + +For OSX there is an additional package install which is required if you whish to build the `icu` extension. + +This additional package can be installed with `homebrew`. + +```bash +brew upgrade icu4c +``` + +To compile for Mac OSX. + +```bash +go build --tags "darwin" +``` + +If you wish to link directly to libsqlite3 then you can use the `libsqlite3` build tag. + +``` +go build --tags "libsqlite3 darwin" +``` + +Additional information: +- [#206](https://github.com/mattn/go-sqlite3/issues/206) +- [#404](https://github.com/mattn/go-sqlite3/issues/404) + +## Windows + +To compile this package on Windows OS you must have the `gcc` compiler installed. + +1) Install a Windows `gcc` toolchain. +2) Add the `bin` folders to the Windows path if the installer did not do this by default. +3) Open a terminal for the TDM-GCC toolchain, can be found in the Windows Start menu. +4) Navigate to your project folder and run the `go build ...` command for this package. + +For example the TDM-GCC Toolchain can be found [here](ttps://sourceforge.net/projects/tdm-gcc/). + +## Errors + +- Compile error: `can not be used when making a shared object; recompile with -fPIC` + + When receiving a compile time error referencing recompile with `-FPIC` then you + are probably using a hardend system. + + You can copile the library on a hardend system with the following command. + + ```bash + go build -ldflags '-extldflags=-fno-PIC' + ``` + + More details see [#120](https://github.com/mattn/go-sqlite3/issues/120) + +- Can't build go-sqlite3 on windows 64bit. + + > Probably, you are using go 1.0, go1.0 has a problem when it comes to compiling/linking on windows 64bit. + > See: [#27](https://github.com/mattn/go-sqlite3/issues/27) + +- `go get github.com/mattn/go-sqlite3` throws compilation error. + + `gcc` throws: `internal compiler error` + + Remove the download repository from your disk and try re-install with: + + ```bash + go install github.com/mattn/go-sqlite3 + ``` + +# User Authentication + +This package supports the SQLite User Authentication module. + +## Compile + +To use the User authentication module the package has to be compiled with the tag `sqlite_userauth`. See [Features](#features). + +## Usage + +### Create protected database + +To create a database protected by user authentication provide the following argument to the connection string `_auth`. +This will enable user authentication within the database. This option however requires two additional arguments: + +- `_auth_user` +- `_auth_pass` + +When `_auth` is present on the connection string user authentication will be enabled and the provided user will be created +as an `admin` user. After initial creation, the parameter `_auth` has no effect anymore and can be omitted from the connection string. + +Example connection string: + +Create an user authentication database with user `admin` and password `admin`. + +`file:test.s3db?_auth&_auth_user=admin&_auth_pass=admin` + +Create an user authentication database with user `admin` and password `admin` and use `SHA1` for the password encoding. + +`file:test.s3db?_auth&_auth_user=admin&_auth_pass=admin&_auth_crypt=sha1` + +### Password Encoding + +The passwords within the user authentication module of SQLite are encoded with the SQLite function `sqlite_cryp`. +This function uses a ceasar-cypher which is quite insecure. +This library provides several additional password encoders which can be configured through the connection string. + +The password cypher can be configured with the key `_auth_crypt`. And if the configured password encoder also requires an +salt this can be configured with `_auth_salt`. + +#### Available Encoders + +- SHA1 +- SSHA1 (Salted SHA1) +- SHA256 +- SSHA256 (salted SHA256) +- SHA384 +- SSHA384 (salted SHA384) +- SHA512 +- SSHA512 (salted SHA512) + +### Restrictions + +Operations on the database regarding to user management can only be preformed by an administrator user. + +### Support + +The user authentication supports two kinds of users + +- administrators +- regular users + +### User Management + +User management can be done by directly using the `*SQLiteConn` or by SQL. + +#### SQL + +The following sql functions are available for user management. + +| Function | Arguments | Description | +|----------|-----------|-------------| +| `authenticate` | username `string`, password `string` | Will authenticate an user, this is done by the connection; and should not be used manually. | +| `auth_user_add` | username `string`, password `string`, admin `int` | This function will add an user to the database.
if the database is not protected by user authentication it will enable it. Argument `admin` is an integer identifying if the added user should be an administrator. Only Administrators can add administrators. | +| `auth_user_change` | username `string`, password `string`, admin `int` | Function to modify an user. Users can change their own password, but only an administrator can change the administrator flag. | +| `authUserDelete` | username `string` | Delete an user from the database. Can only be used by an administrator. The current logged in administrator cannot be deleted. This is to make sure their is always an administrator remaining. | + +These functions will return an integer. + +- 0 (SQLITE_OK) +- 23 (SQLITE_AUTH) Failed to perform due to authentication or insufficient privileges + +##### Examples + +```sql +// Autheticate user +// Create Admin User +SELECT auth_user_add('admin2', 'admin2', 1); + +// Change password for user +SELECT auth_user_change('user', 'userpassword', 0); + +// Delete user +SELECT user_delete('user'); +``` + +#### *SQLiteConn + +The following functions are available for User authentication from the `*SQLiteConn`. + +| Function | Description | +|----------|-------------| +| `Authenticate(username, password string) error` | Authenticate user | +| `AuthUserAdd(username, password string, admin bool) error` | Add user | +| `AuthUserChange(username, password string, admin bool) error` | Modify user | +| `AuthUserDelete(username string) error` | Delete user | + +### Attached database + +When using attached databases. SQLite will use the authentication from the `main` database for the attached database(s). + +# Extensions + +If you want your own extension to be listed here or you want to add a reference to an extension; please submit an Issue for this. + +## Spatialite + +Spatialite is available as an extension to SQLite, and can be used in combination with this repository. +For an example see [shaxbee/go-spatialite](https://github.com/shaxbee/go-spatialite). + +# FAQ + +- Getting insert error while query is opened. + + > You can pass some arguments into the connection string, for example, a URI. + > See: [#39](https://github.com/mattn/go-sqlite3/issues/39) + +- Do you want to cross compile? mingw on Linux or Mac? + + > See: [#106](https://github.com/mattn/go-sqlite3/issues/106) + > See also: http://www.limitlessfx.com/cross-compile-golang-app-for-windows-from-linux.html + +- Want to get time.Time with current locale + + Use `_loc=auto` in SQLite3 filename schema like `file:foo.db?_loc=auto`. + +- Can I use this in multiple routines concurrently? + + Yes for readonly. But, No for writable. See [#50](https://github.com/mattn/go-sqlite3/issues/50), [#51](https://github.com/mattn/go-sqlite3/issues/51), [#209](https://github.com/mattn/go-sqlite3/issues/209), [#274](https://github.com/mattn/go-sqlite3/issues/274). + +- Why I'm getting `no such table` error? + + Why is it racy if I use a `sql.Open("sqlite3", ":memory:")` database? + + Each connection to :memory: opens a brand new in-memory sql database, so if + the stdlib's sql engine happens to open another connection and you've only + specified ":memory:", that connection will see a brand new database. A + workaround is to use "file::memory:?mode=memory&cache=shared". Every + connection to this string will point to the same in-memory database. + + For more information see + * [#204](https://github.com/mattn/go-sqlite3/issues/204) + * [#511](https://github.com/mattn/go-sqlite3/issues/511) + +- Reading from database with large amount of goroutines fails on OSX. + + OS X limits OS-wide to not have more than 1000 files open simultaneously by default. + + For more information see [#289](https://github.com/mattn/go-sqlite3/issues/289) + +- Trying to execure a `.` (dot) command throws an error. + + Error: `Error: near ".": syntax error` + Dot command are part of SQLite3 CLI not of this library. + + You need to implement the feature or call the sqlite3 cli. + + More infomation see [#305](https://github.com/mattn/go-sqlite3/issues/305) + +- Error: `database is locked` + + When you get an database is locked. Please use the following options. + + Add to DSN: `cache=shared` + + Example: + ```go + db, err := sql.Open("sqlite3", "file:locked.sqlite?cache=shared") + ``` + + Second please set the database connections of the SQL package to 1. + + ```go + db.SetMaxOpenConn(1) + ``` + + More information see [#209](https://github.com/mattn/go-sqlite3/issues/209) + +# License + +MIT: http://mattn.mit-license.org/2018 + +sqlite3-binding.c, sqlite3-binding.h, sqlite3ext.h + +The -binding suffix was added to avoid build failures under gccgo. + +In this repository, those files are an amalgamation of code that was copied from SQLite3. The license of that code is the same as the license of SQLite3. + +# Author + +Yasuhiro Matsumoto (a.k.a mattn) + +G.J.R. Timmer diff --git a/backup.go b/_driver/backup.go similarity index 100% rename from backup.go rename to _driver/backup.go diff --git a/backup_test.go b/_driver/backup_test.go similarity index 100% rename from backup_test.go rename to _driver/backup_test.go diff --git a/callback.go b/_driver/callback.go similarity index 100% rename from callback.go rename to _driver/callback.go diff --git a/callback_test.go b/_driver/callback_test.go similarity index 100% rename from callback_test.go rename to _driver/callback_test.go diff --git a/sqlite3_go18.go b/_driver/connection_go18.go similarity index 96% rename from sqlite3_go18.go rename to _driver/connection_go18.go index 43e6418..ded06ae 100644 --- a/sqlite3_go18.go +++ b/_driver/connection_go18.go @@ -1,4 +1,4 @@ -// Copyright (C) 2014 Yasuhiro Matsumoto . +// Copyright (C) 2018 The Go-SQLite3 Authors. // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. diff --git a/sqlite3_go18_test.go b/_driver/connection_go18_test.go similarity index 98% rename from sqlite3_go18_test.go rename to _driver/connection_go18_test.go index 741ed90..2d87b4d 100644 --- a/sqlite3_go18_test.go +++ b/_driver/connection_go18_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2014 Yasuhiro Matsumoto . +// Copyright (C) 2018 The Go-SQLite3 Authors. // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. diff --git a/doc.go b/_driver/doc.go similarity index 100% rename from doc.go rename to _driver/doc.go diff --git a/error.go b/_driver/error.go similarity index 100% rename from error.go rename to _driver/error.go diff --git a/error_test.go b/_driver/error_test.go similarity index 100% rename from error_test.go rename to _driver/error_test.go diff --git a/sqlite3.go b/_driver/sqlite3.go similarity index 98% rename from sqlite3.go rename to _driver/sqlite3.go index 6cac2f0..6dfa135 100644 --- a/sqlite3.go +++ b/_driver/sqlite3.go @@ -670,6 +670,7 @@ func lastError(db *C.sqlite3) error { // Exec implements Execer. func (c *SQLiteConn) Exec(query string, args []driver.Value) (driver.Result, error) { + fmt.Println("Exec()") list := make([]namedValue, len(args)) for i, v := range args { list[i] = namedValue{ @@ -700,6 +701,7 @@ func (c *SQLiteConn) exec(ctx context.Context, query string, args []namedValue) res, err = s.(*SQLiteStmt).exec(ctx, args[:na]) if err != nil && err != driver.ErrSkip { s.Close() + fmt.Printf("exec() %s\n", err) return nil, err } args = args[na:] @@ -777,6 +779,7 @@ func (c *SQLiteConn) begin(ctx context.Context) (driver.Tx, error) { } func errorString(err Error) string { + fmt.Println("errorString") return C.GoString(C.sqlite3_errstr(C.int(err.Code))) } @@ -888,6 +891,8 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, errors.New("sqlite library was not compiled for thread-safe operation") } + fmt.Println("OPEN") + var pkey string // Options @@ -1266,6 +1271,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { rv := C.sqlite3_exec(db, cs, nil, nil, nil) C.free(unsafe.Pointer(cs)) if rv != C.SQLITE_OK { + fmt.Printf("-Open-Exec() %d\n", rv) return lastError(db) } return nil @@ -1350,7 +1356,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { if err := conn.Authenticate(authUser, authPass); err != nil { return nil, err } - + fmt.Println("+") // Register: authenticate // Authenticate will perform an authentication of the provided username // and password against the database. @@ -1368,6 +1374,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { if err := conn.RegisterFunc("authenticate", conn.authenticate, true); err != nil { return nil, err } + fmt.Println("+") // // Register: auth_user_add // auth_user_add can be used (by an admin user only) @@ -1381,6 +1388,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { if err := conn.RegisterFunc("auth_user_add", conn.authUserAdd, true); err != nil { return nil, err } + fmt.Println("+") // // Register: auth_user_change // auth_user_change can be used to change a users @@ -1391,6 +1399,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { if err := conn.RegisterFunc("auth_user_change", conn.authUserChange, true); err != nil { return nil, err } + fmt.Println("+") // // Register: auth_user_delete // auth_user_delete can be used (by an admin user only) @@ -1401,13 +1410,13 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { if err := conn.RegisterFunc("auth_user_delete", conn.authUserDelete, true); err != nil { return nil, err } - + fmt.Println("+") // Register: auth_enabled // auth_enabled can be used to check if user authentication is enabled if err := conn.RegisterFunc("auth_enabled", conn.authEnabled, true); err != nil { return nil, err } - + fmt.Println("+") // Auto Vacuum // Moved auto_vacuum command, the user preference for auto_vacuum needs to be implemented directly after // the authentication and before the sqlite_user table gets created if the user @@ -1420,7 +1429,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, err } } - + fmt.Println("+") // Check if user wants to activate User Authentication if authCreate { // Before going any further, we need to check that the user @@ -1441,7 +1450,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { } } } - + fmt.Println("+") // Case Sensitive LIKE if caseSensitiveLike > -1 { if err := exec(fmt.Sprintf("PRAGMA case_sensitive_like = %d;", caseSensitiveLike)); err != nil { @@ -1449,7 +1458,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, err } } - + fmt.Println("+") // Defer Foreign Keys if deferForeignKeys > -1 { if err := exec(fmt.Sprintf("PRAGMA defer_foreign_keys = %d;", deferForeignKeys)); err != nil { @@ -1465,7 +1474,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, err } } - + fmt.Println("+") // Ignore CHECK Constraints if ignoreCheckConstraints > -1 { if err := exec(fmt.Sprintf("PRAGMA ignore_check_constraints = %d;", ignoreCheckConstraints)); err != nil { @@ -1473,14 +1482,14 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, err } } - + fmt.Println("+") // Journal Mode // Because default Journal Mode is DELETE this PRAGMA can always be executed. if err := exec(fmt.Sprintf("PRAGMA journal_mode = %s;", journalMode)); err != nil { C.sqlite3_close_v2(db) return nil, err } - + fmt.Println("+") // Locking Mode // Because the default is NORMAL and this is not changed in this package // by using the compile time SQLITE_DEFAULT_LOCKING_MODE this PRAGMA can always be executed @@ -1488,7 +1497,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { C.sqlite3_close_v2(db) return nil, err } - + fmt.Println("+") // Query Only if queryOnly > -1 { if err := exec(fmt.Sprintf("PRAGMA query_only = %d;", queryOnly)); err != nil { @@ -1504,7 +1513,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, err } } - + fmt.Println("+") // Secure Delete // // Because this package can set the compile time flag SQLITE_SECURE_DELETE with a build tag @@ -1516,7 +1525,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, err } } - + fmt.Println("+") // Synchronous Mode // // Because default is NORMAL this statement is always executed @@ -1524,7 +1533,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { C.sqlite3_close_v2(db) return nil, err } - + fmt.Println("+") // Writable Schema if writableSchema > -1 { if err := exec(fmt.Sprintf("PRAGMA writable_schema = %d;", writableSchema)); err != nil { @@ -1532,14 +1541,16 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { return nil, err } } - + fmt.Println("+") if len(d.Extensions) > 0 { + fmt.Println("Loading Extensions") if err := conn.loadExtensions(d.Extensions); err != nil { + fmt.Println("Error while loading Extensions") conn.Close() return nil, err } } - + fmt.Println("+") if d.ConnectHook != nil { if err := d.ConnectHook(conn); err != nil { conn.Close() @@ -1547,6 +1558,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { } } runtime.SetFinalizer(conn, (*SQLiteConn).Close) + fmt.Println("< Open") return conn, nil } diff --git a/sqlite3_context.go b/_driver/sqlite3_context.go similarity index 100% rename from sqlite3_context.go rename to _driver/sqlite3_context.go diff --git a/sqlite3_load_extension.go b/_driver/sqlite3_load_extension.go similarity index 76% rename from sqlite3_load_extension.go rename to _driver/sqlite3_load_extension.go index e73982a..36e72b8 100644 --- a/sqlite3_load_extension.go +++ b/_driver/sqlite3_load_extension.go @@ -18,10 +18,12 @@ package sqlite3 import "C" import ( "errors" + "fmt" "unsafe" ) func (c *SQLiteConn) loadExtensions(extensions []string) error { + // Enable extension loading rv := C.sqlite3_enable_load_extension(c.db, 1) if rv != C.SQLITE_OK { return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) @@ -29,14 +31,26 @@ func (c *SQLiteConn) loadExtensions(extensions []string) error { for _, extension := range extensions { cext := C.CString(extension) + cerr := C.CString("") defer C.free(unsafe.Pointer(cext)) - rv = C.sqlite3_load_extension(c.db, cext, nil, nil) + defer C.free(unsafe.Pointer(cerr)) + rv = C.sqlite3_load_extension(c.db, cext, nil, &cerr) if rv != C.SQLITE_OK { - C.sqlite3_enable_load_extension(c.db, 0) + // Disable Extension Loading + rv = C.sqlite3_enable_load_extension(c.db, 0) + fmt.Printf("%d\n", rv) + if rv != C.SQLITE_OK { + return errors.New("Failed to disable extension loading") + } + fmt.Println(">>>") + fmt.Println(*cerr) + fmt.Printf("%v\n", cerr) + fmt.Printf("%v\n", *cerr) return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) } } + // Disable extension loading rv = C.sqlite3_enable_load_extension(c.db, 0) if rv != C.SQLITE_OK { return errors.New(C.GoString(C.sqlite3_errmsg(c.db))) diff --git a/sqlite3_load_extension_omit.go b/_driver/sqlite3_load_extension_omit.go similarity index 100% rename from sqlite3_load_extension_omit.go rename to _driver/sqlite3_load_extension_omit.go diff --git a/sqlite3_opt_allow_uri_authority.go b/_driver/sqlite3_opt_allow_uri_authority.go similarity index 100% rename from sqlite3_opt_allow_uri_authority.go rename to _driver/sqlite3_opt_allow_uri_authority.go diff --git a/sqlite3_opt_app_armor.go b/_driver/sqlite3_opt_app_armor.go similarity index 100% rename from sqlite3_opt_app_armor.go rename to _driver/sqlite3_opt_app_armor.go diff --git a/sqlite3_opt_foreign_keys.go b/_driver/sqlite3_opt_foreign_keys.go similarity index 100% rename from sqlite3_opt_foreign_keys.go rename to _driver/sqlite3_opt_foreign_keys.go diff --git a/sqlite3_opt_fts3_test.go b/_driver/sqlite3_opt_fts3_test.go similarity index 100% rename from sqlite3_opt_fts3_test.go rename to _driver/sqlite3_opt_fts3_test.go diff --git a/sqlite3_opt_fts5.go b/_driver/sqlite3_opt_fts5.go similarity index 100% rename from sqlite3_opt_fts5.go rename to _driver/sqlite3_opt_fts5.go diff --git a/sqlite3_opt_icu.go b/_driver/sqlite3_opt_icu.go similarity index 100% rename from sqlite3_opt_icu.go rename to _driver/sqlite3_opt_icu.go diff --git a/sqlite3_opt_introspect.go b/_driver/sqlite3_opt_introspect.go similarity index 100% rename from sqlite3_opt_introspect.go rename to _driver/sqlite3_opt_introspect.go diff --git a/sqlite3_opt_introspect_test.go b/_driver/sqlite3_opt_introspect_test.go similarity index 100% rename from sqlite3_opt_introspect_test.go rename to _driver/sqlite3_opt_introspect_test.go diff --git a/sqlite3_opt_json1.go b/_driver/sqlite3_opt_json1.go similarity index 100% rename from sqlite3_opt_json1.go rename to _driver/sqlite3_opt_json1.go diff --git a/sqlite3_opt_secure_delete.go b/_driver/sqlite3_opt_secure_delete.go similarity index 100% rename from sqlite3_opt_secure_delete.go rename to _driver/sqlite3_opt_secure_delete.go diff --git a/sqlite3_opt_secure_delete_fast.go b/_driver/sqlite3_opt_secure_delete_fast.go similarity index 100% rename from sqlite3_opt_secure_delete_fast.go rename to _driver/sqlite3_opt_secure_delete_fast.go diff --git a/sqlite3_opt_stat4.go b/_driver/sqlite3_opt_stat4.go similarity index 100% rename from sqlite3_opt_stat4.go rename to _driver/sqlite3_opt_stat4.go diff --git a/sqlite3_opt_stat4_test.go b/_driver/sqlite3_opt_stat4_test.go similarity index 100% rename from sqlite3_opt_stat4_test.go rename to _driver/sqlite3_opt_stat4_test.go diff --git a/sqlite3_opt_userauth.go b/_driver/sqlite3_opt_userauth.go similarity index 100% rename from sqlite3_opt_userauth.go rename to _driver/sqlite3_opt_userauth.go diff --git a/sqlite3_opt_userauth_omit.go b/_driver/sqlite3_opt_userauth_omit.go similarity index 100% rename from sqlite3_opt_userauth_omit.go rename to _driver/sqlite3_opt_userauth_omit.go diff --git a/sqlite3_opt_userauth_omit_test.go b/_driver/sqlite3_opt_userauth_omit_test.go similarity index 100% rename from sqlite3_opt_userauth_omit_test.go rename to _driver/sqlite3_opt_userauth_omit_test.go diff --git a/sqlite3_opt_userauth_test.go b/_driver/sqlite3_opt_userauth_test.go similarity index 100% rename from sqlite3_opt_userauth_test.go rename to _driver/sqlite3_opt_userauth_test.go diff --git a/sqlite3_opt_vacuum_full.go b/_driver/sqlite3_opt_vacuum_full.go similarity index 100% rename from sqlite3_opt_vacuum_full.go rename to _driver/sqlite3_opt_vacuum_full.go diff --git a/sqlite3_opt_vacuum_incr.go b/_driver/sqlite3_opt_vacuum_incr.go similarity index 100% rename from sqlite3_opt_vacuum_incr.go rename to _driver/sqlite3_opt_vacuum_incr.go diff --git a/sqlite3_opt_vtable.go b/_driver/sqlite3_opt_vtable.go similarity index 100% rename from sqlite3_opt_vtable.go rename to _driver/sqlite3_opt_vtable.go diff --git a/sqlite3_opt_vtable_test.go b/_driver/sqlite3_opt_vtable_test.go similarity index 100% rename from sqlite3_opt_vtable_test.go rename to _driver/sqlite3_opt_vtable_test.go diff --git a/sqlite3_test.go b/_driver/sqlite3_test.go similarity index 99% rename from sqlite3_test.go rename to _driver/sqlite3_test.go index 75d8f52..841683c 100644 --- a/sqlite3_test.go +++ b/_driver/sqlite3_test.go @@ -1508,6 +1508,7 @@ func TestPinger(t *testing.T) { } db.Close() err = db.Ping() + fmt.Println(err) if err == nil { t.Fatal("Should be closed") } diff --git a/sqlite3_trace.go b/_driver/sqlite3_trace.go similarity index 100% rename from sqlite3_trace.go rename to _driver/sqlite3_trace.go diff --git a/sqlite3_type.go b/_driver/sqlite3_type.go similarity index 100% rename from sqlite3_type.go rename to _driver/sqlite3_type.go diff --git a/_example/mod_vtable/Makefile b/_example/mod_vtable/Makefile index cdd4853..f5bf61d 100644 --- a/_example/mod_vtable/Makefile +++ b/_example/mod_vtable/Makefile @@ -1,3 +1,6 @@ +# Get Current Directory +CURDIR = $(shell pwd) + ifeq ($(OS),Windows_NT) EXE=extension.exe EXT=sqlite3_mod_vtable.dll @@ -12,13 +15,16 @@ LDFLAG=-fPIC LIBCURL=-lcurl endif -all : $(EXE) $(EXT) +# Include source from repository +CFLAGS=-I$(CURDIR)/../../ + +all : $(EXT) $(EXE) $(EXE) : extension.go - go build $< + go build -v -a -tags=sqlite_vtable $< $(EXT) : sqlite3_mod_vtable.cc - g++ $(LDFLAG) -shared -o $@ $< -lsqlite3 $(LIBCURL) + g++ $(LDFLAG) $(CFLAGS) -shared -o $@ $< $(LIBCURL) clean : @-$(RM) $(EXE) $(EXT) diff --git a/_example/mod_vtable/extension b/_example/mod_vtable/extension new file mode 100644 index 0000000..6e35c14 Binary files /dev/null and b/_example/mod_vtable/extension differ diff --git a/_example/mod_vtable/extension.go b/_example/mod_vtable/extension.go index f738af6..08f6953 100644 --- a/_example/mod_vtable/extension.go +++ b/_example/mod_vtable/extension.go @@ -4,6 +4,7 @@ import ( "database/sql" "fmt" "log" + "os" "github.com/mattn/go-sqlite3" ) @@ -21,17 +22,28 @@ func main() { log.Fatal(err) } defer db.Close() + fmt.Println(">") - db.Exec("create virtual table repo using github(id, full_name, description, html_url)") + _, err = db.Exec("create virtual table repo using github(id, full_name, description, html_url)") + if err != nil { + fmt.Println("-") + log.Fatal(err) + } + fmt.Println("-") + fmt.Println("-") rows, err := db.Query("select id, full_name, description, html_url from repo") if err != nil { log.Fatal(err) } defer rows.Close() + fmt.Println("-") for rows.Next() { var id, fullName, description, htmlURL string rows.Scan(&id, &fullName, &description, &htmlURL) fmt.Printf("%s: %s\n\t%s\n\t%s\n\n", id, fullName, description, htmlURL) } + + fmt.Println("Clean Exit") + os.Exit(0) } diff --git a/_example/mod_vtable/sqlite3_mod_vtable.so b/_example/mod_vtable/sqlite3_mod_vtable.so new file mode 100644 index 0000000..f419d07 Binary files /dev/null and b/_example/mod_vtable/sqlite3_mod_vtable.so differ diff --git a/cmd/upgrade/package.go b/cmd/upgrade/package.go new file mode 100644 index 0000000..aa3eec7 --- /dev/null +++ b/cmd/upgrade/package.go @@ -0,0 +1,11 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. +// +// Dummy to ensure package can be loaded +// +// This file is to avoid the following error: +// can't load package: package go-sqlite3/upgrade: build constraints exclude all Go files in tools/upgrade + +package main diff --git a/upgrade/upgrade.go b/cmd/upgrade/upgrade.go similarity index 93% rename from upgrade/upgrade.go rename to cmd/upgrade/upgrade.go index d800227..f20780d 100644 --- a/upgrade/upgrade.go +++ b/cmd/upgrade/upgrade.go @@ -1,3 +1,8 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + // +build !cgo // +build upgrade @@ -101,13 +106,13 @@ func main() { // Download Amalgamation _, amalgamation, err := download("sqlite-amalgamation-") if err != nil { - fmt.Println("Failed to download: sqlite-amalgamation; %s", err) + fmt.Printf("Failed to download: sqlite-amalgamation; %s\n", err) } // Download Source _, source, err := download("sqlite-src-") if err != nil { - fmt.Println("Failed to download: sqlite-src; %s", err) + fmt.Printf("Failed to download: sqlite-src; %s\n", err) } // Create Amalgamation Zip Reader diff --git a/driver/cgo_disabled.go b/driver/cgo_disabled.go new file mode 100644 index 0000000..91c7550 --- /dev/null +++ b/driver/cgo_disabled.go @@ -0,0 +1,31 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// +build !cgo + +package sqlite3 + +import ( + "database/sql" + "database/sql/driver" + "errors" +) + +// Implementation Enforcer +var ( + _ driver.Driver = (*SQLiteDriver)(nil) +) + +func init() { + sql.Register("sqlite3", &SQLiteDriver{}) +} + +type SQLiteDriver struct{} + +var errCgoDisabled = errors.New("Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to be enabled.") + +func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { + return nil, errCgoDisabled +} diff --git a/driver/cgo_disabled_go110.go b/driver/cgo_disabled_go110.go new file mode 100644 index 0000000..5bf2c09 --- /dev/null +++ b/driver/cgo_disabled_go110.go @@ -0,0 +1,22 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// +build !cgo +// +build go1.10 + +package sqlite3 + +import ( + "database/sql/driver" +) + +// Implementation Enforcer +var ( + _ driver.DriverContext = (*SQLiteDriver)(nil) +) + +func (d *SQLiteDriver) OpenConnector(name string) (driver.Connector, error) { + return nil, errCgoDisabled +} diff --git a/driver/connection.go b/driver/connection.go new file mode 100644 index 0000000..54c60c1 --- /dev/null +++ b/driver/connection.go @@ -0,0 +1,9 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package sqlite3 + +type SQLiteConn struct { +} diff --git a/driver/connection_go18.go b/driver/connection_go18.go new file mode 100644 index 0000000..c0f7f32 --- /dev/null +++ b/driver/connection_go18.go @@ -0,0 +1,8 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// +build go1.8 + +package sqlite3 diff --git a/driver/connector.go b/driver/connector.go new file mode 100644 index 0000000..ab22ad6 --- /dev/null +++ b/driver/connector.go @@ -0,0 +1,29 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// +build go1.10 + +package sqlite3 + +import ( + "context" + "database/sql/driver" +) + +// Connector is a driver in a fixed configuration. +type Connector struct { +} + +// Connect implements driver.Connector interface. +// Connect returns a connection to the database. +func (c Connector) Connect(ctx context.Context) (driver.Conn, error) { + return nil, nil +} + +// Driver implements driver.Connector interface. +// Driver returns &MySQLDriver{}. +func (c Connector) Driver() driver.Driver { + return nil +} diff --git a/driver/driver.go b/driver/driver.go new file mode 100644 index 0000000..03147b8 --- /dev/null +++ b/driver/driver.go @@ -0,0 +1,10 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package sqlite3 + +// SQLiteDriver is exported to make the driver directly accessible. +// In general the driver is used via the database/sql package. +type SQLiteDriver struct{} diff --git a/driver/driver_go110.go b/driver/driver_go110.go new file mode 100644 index 0000000..289a35c --- /dev/null +++ b/driver/driver_go110.go @@ -0,0 +1,8 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// +build go1.10 + +package sqlite3 diff --git a/sqlite3_libsqlite3.go b/driver/libsqlite3.go similarity index 84% rename from sqlite3_libsqlite3.go rename to driver/libsqlite3.go index 26af573..162d430 100644 --- a/sqlite3_libsqlite3.go +++ b/driver/libsqlite3.go @@ -1,4 +1,4 @@ -// Copyright (C) 2014 Yasuhiro Matsumoto . +// Copyright (C) 2018 The Go-SQLite3 Authors. // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. diff --git a/sqlite3_os_other.go b/driver/os_other.go similarity index 76% rename from sqlite3_os_other.go rename to driver/os_other.go index 086ed43..a8e38e9 100644 --- a/sqlite3_os_other.go +++ b/driver/os_other.go @@ -1,4 +1,4 @@ -// Copyright (C) 2014 Yasuhiro Matsumoto . +// Copyright (C) 2018 The Go-SQLite3 Authors. // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. diff --git a/sqlite3_os_solaris.go b/driver/os_solaris.go similarity index 77% rename from sqlite3_os_solaris.go rename to driver/os_solaris.go index 40b2b2f..a85211e 100644 --- a/sqlite3_os_solaris.go +++ b/driver/os_solaris.go @@ -1,4 +1,4 @@ -// Copyright (C) 2018 Yasuhiro Matsumoto . +// Copyright (C) 2018 The Go-SQLite3 Authors. // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. diff --git a/sqlite3_os_windows.go b/driver/os_windows.go similarity index 84% rename from sqlite3_os_windows.go rename to driver/os_windows.go index 4222e7f..8ba11fd 100644 --- a/sqlite3_os_windows.go +++ b/driver/os_windows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2014 Yasuhiro Matsumoto . +// Copyright (C) 2018 The Go-SQLite3 Authors. // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. @@ -12,7 +12,9 @@ package sqlite3 #cgo CFLAGS: -fno-stack-check #cgo CFLAGS: -fno-stack-protector #cgo CFLAGS: -mno-stack-arg-probe + #cgo LDFLAGS: -lmingwex -lmingw32 + #cgo windows,386 CFLAGS: -D_USE_32BIT_TIME_T */ import "C" diff --git a/sqlite3-binding.c b/driver/sqlite3-binding.c similarity index 100% rename from sqlite3-binding.c rename to driver/sqlite3-binding.c diff --git a/sqlite3-binding.h b/driver/sqlite3-binding.h similarity index 100% rename from sqlite3-binding.h rename to driver/sqlite3-binding.h diff --git a/driver/sqlite3.go b/driver/sqlite3.go new file mode 100644 index 0000000..08d47e4 --- /dev/null +++ b/driver/sqlite3.go @@ -0,0 +1,150 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// +build cgo + +package sqlite3 + +/* +#cgo CFLAGS: -DSQLITE_ENABLE_RTREE +#cgo CFLAGS: -DSQLITE_THREADSAFE=1 +#cgo CFLAGS: -DHAVE_USLEEP=1 +#cgo CFLAGS: -DSQLITE_ENABLE_FTS3 +#cgo CFLAGS: -DSQLITE_ENABLE_FTS3_PARENTHESIS +#cgo CFLAGS: -DSQLITE_ENABLE_FTS4_UNICODE61 +#cgo CFLAGS: -DSQLITE_TRACE_SIZE_LIMIT=15 +#cgo CFLAGS: -DSQLITE_OMIT_DEPRECATED +#cgo CFLAGS: -DSQLITE_DISABLE_INTRINSIC +#cgo CFLAGS: -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 +#cgo CFLAGS: -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT + +#cgo CFLAGS: -Wno-deprecated-declarations +#cgo CFLAGS: -std=gnu99 + +#cgo linux,!android CFLAGS: -DHAVE_PREAD64=1 -DHAVE_PWRITE64=1 + +#ifndef USE_LIBSQLITE3 +#include +#else +#include +#endif +#include +#include + +#ifdef __CYGWIN__ +# include +#endif + +#ifndef SQLITE_OPEN_READWRITE +# define SQLITE_OPEN_READWRITE 0 +#endif + +#ifndef SQLITE_OPEN_FULLMUTEX +# define SQLITE_OPEN_FULLMUTEX 0 +#endif + +#ifndef SQLITE_DETERMINISTIC +# define SQLITE_DETERMINISTIC 0 +#endif + +static int +_sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs) { +#ifdef SQLITE_OPEN_URI + return sqlite3_open_v2(filename, ppDb, flags | SQLITE_OPEN_URI, zVfs); +#else + return sqlite3_open_v2(filename, ppDb, flags, zVfs); +#endif +} + +static int +_sqlite3_bind_text(sqlite3_stmt *stmt, int n, char *p, int np) { + return sqlite3_bind_text(stmt, n, p, np, SQLITE_TRANSIENT); +} + +static int +_sqlite3_bind_blob(sqlite3_stmt *stmt, int n, void *p, int np) { + return sqlite3_bind_blob(stmt, n, p, np, SQLITE_TRANSIENT); +} + +#include +#include + +static int +_sqlite3_exec(sqlite3* db, const char* pcmd, long long* rowid, long long* changes) +{ + int rv = sqlite3_exec(db, pcmd, 0, 0, 0); + *rowid = (long long) sqlite3_last_insert_rowid(db); + *changes = (long long) sqlite3_changes(db); + return rv; +} + +static int +_sqlite3_step(sqlite3_stmt* stmt, long long* rowid, long long* changes) +{ + int rv = sqlite3_step(stmt); + sqlite3* db = sqlite3_db_handle(stmt); + *rowid = (long long) sqlite3_last_insert_rowid(db); + *changes = (long long) sqlite3_changes(db); + return rv; +} + +void _sqlite3_result_text(sqlite3_context* ctx, const char* s) { + sqlite3_result_text(ctx, s, -1, &free); +} + +void _sqlite3_result_blob(sqlite3_context* ctx, const void* b, int l) { + sqlite3_result_blob(ctx, b, l, SQLITE_TRANSIENT); +} + + +int _sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + uintptr_t pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +) { + return sqlite3_create_function(db, zFunctionName, nArg, eTextRep, (void*) pApp, xFunc, xStep, xFinal); +} + +void callbackTrampoline(sqlite3_context*, int, sqlite3_value**); +void stepTrampoline(sqlite3_context*, int, sqlite3_value**); +void doneTrampoline(sqlite3_context*); + +int compareTrampoline(void*, int, char*, int, char*); +int commitHookTrampoline(void*); +void rollbackHookTrampoline(void*); +void updateHookTrampoline(void*, int, char*, char*, sqlite3_int64); + +#ifdef SQLITE_LIMIT_WORKER_THREADS +# define _SQLITE_HAS_LIMIT +# define SQLITE_LIMIT_LENGTH 0 +# define SQLITE_LIMIT_SQL_LENGTH 1 +# define SQLITE_LIMIT_COLUMN 2 +# define SQLITE_LIMIT_EXPR_DEPTH 3 +# define SQLITE_LIMIT_COMPOUND_SELECT 4 +# define SQLITE_LIMIT_VDBE_OP 5 +# define SQLITE_LIMIT_FUNCTION_ARG 6 +# define SQLITE_LIMIT_ATTACHED 7 +# define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +# define SQLITE_LIMIT_VARIABLE_NUMBER 9 +# define SQLITE_LIMIT_TRIGGER_DEPTH 10 +# define SQLITE_LIMIT_WORKER_THREADS 11 +# else +# define SQLITE_LIMIT_WORKER_THREADS 11 +#endif + +static int _sqlite3_limit(sqlite3* db, int limitId, int newLimit) { +#ifndef _SQLITE_HAS_LIMIT + return -1; +#else + return sqlite3_limit(db, limitId, newLimit); +#endif +} +*/ +import "C" diff --git a/sqlite3ext.h b/driver/sqlite3ext.h similarity index 100% rename from sqlite3ext.h rename to driver/sqlite3ext.h diff --git a/sqlite3_usleep_windows.go b/driver/usleep_windows.go similarity index 94% rename from sqlite3_usleep_windows.go rename to driver/usleep_windows.go index 1971a48..171ebe2 100644 --- a/sqlite3_usleep_windows.go +++ b/driver/usleep_windows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2018 G.J.R. Timmer . +// Copyright (C) 2018 The Go-SQLite3 Authors. // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. diff --git a/pkg/crypt/crypt.go b/pkg/crypt/crypt.go new file mode 100644 index 0000000..36c3a87 --- /dev/null +++ b/pkg/crypt/crypt.go @@ -0,0 +1,20 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +// Encoder provides the interface for implementing +// a sqlite_crypt encoder. +type Encoder interface { + Encode(pass []byte, hash interface{}) []byte +} + +// Salter provides the interface for a encoder +// to return its configured salt. +type Salter interface { + Salt() string +} + +// EOF diff --git a/sqlite3_func_crypt_test.go b/pkg/crypt/crypt_test.go similarity index 74% rename from sqlite3_func_crypt_test.go rename to pkg/crypt/crypt_test.go index 0329ca8..8848faf 100644 --- a/sqlite3_func_crypt_test.go +++ b/pkg/crypt/crypt_test.go @@ -1,9 +1,9 @@ -// Copyright (C) 2018 G.J.R. Timmer . +// Copyright (C) 2018 The Go-SQLite3 Authors. // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. -package sqlite3 +package crypt import ( "fmt" @@ -12,7 +12,7 @@ import ( ) // TestCryptEncoders to increase coverage -func TestCryptEncoders(t *testing.T) { +func TestEncoders(t *testing.T) { tests := []struct { enc string salt string @@ -29,27 +29,33 @@ func TestCryptEncoders(t *testing.T) { } for _, e := range tests { - var fn func(pass []byte, hash interface{}) []byte + var enc Encoder switch e.enc { case "sha1": - fn = CryptEncoderSHA1 + enc = NewSHA1Encoder() case "ssha1": - fn = CryptEncoderSSHA1(e.salt) + enc = NewSSHA1Encoder(e.salt) case "sha256": - fn = CryptEncoderSHA256 + enc = NewSHA256Encoder() case "ssha256": - fn = CryptEncoderSSHA256(e.salt) + enc = NewSSHA256Encoder(e.salt) case "sha384": - fn = CryptEncoderSHA384 + enc = NewSHA384Encoder() case "ssha384": - fn = CryptEncoderSSHA384(e.salt) + enc = NewSSHA384Encoder(e.salt) case "sha512": - fn = CryptEncoderSHA512 + enc = NewSHA512Encoder() case "ssha512": - fn = CryptEncoderSSHA512(e.salt) + enc = NewSSHA512Encoder(e.salt) } - h := fn([]byte("admin"), nil) + if _, ok := enc.(Salter); ok { + if strings.Compare(enc.(Salter).Salt(), e.salt) != 0 { + t.Fatal("Salt Mismatch") + } + } + + h := enc.Encode([]byte("admin"), nil) if strings.Compare(fmt.Sprintf("%x", h), e.expected) != 0 { t.Fatalf("Invalid %s hash: expected: %s; got: %x", strings.ToUpper(e.enc), e.expected, h) } diff --git a/pkg/crypt/doc.go b/pkg/crypt/doc.go new file mode 100644 index 0000000..8fbaedd --- /dev/null +++ b/pkg/crypt/doc.go @@ -0,0 +1,43 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// package crypt provides several different implementations for the +// default embedded sqlite_crypt function. +// This function is uses a ceasar-cypher by default +// and is used within the UserAuthentication module to encode +// the password. +// +// The provided functions can be used as an overload to the sqlite_crypt +// function through the use of the RegisterFunc on the connection. +// +// Because the functions can serv a purpose to an end-user +// without using the UserAuthentication module +// the functions are default compiled in. +// +// From SQLITE3 - user-auth.txt +// The sqlite_user.pw field is encoded by a built-in SQL function +// "sqlite_crypt(X,Y)". The two arguments are both BLOBs. The first argument +// is the plaintext password supplied to the sqlite3_user_authenticate() +// interface. The second argument is the sqlite_user.pw value and is supplied +// so that the function can extract the "salt" used by the password encoder. +// The result of sqlite_crypt(X,Y) is another blob which is the value that +// ends up being stored in sqlite_user.pw. To verify credentials X supplied +// by the sqlite3_user_authenticate() routine, SQLite runs: +// +// sqlite_user.pw == sqlite_crypt(X, sqlite_user.pw) +// +// To compute an appropriate sqlite_user.pw value from a new or modified +// password X, sqlite_crypt(X,NULL) is run. A new random salt is selected +// when the second argument is NULL. +// +// The built-in version of of sqlite_crypt() uses a simple Ceasar-cypher +// which prevents passwords from being revealed by searching the raw database +// for ASCII text, but is otherwise trivally broken. For better password +// security, the database should be encrypted using the SQLite Encryption +// Extension or similar technology. Or, the application can use the +// sqlite3_create_function() interface to provide an alternative +// implementation of sqlite_crypt() that computes a stronger password hash, +// perhaps using a cryptographic hash function like SHA1. +package crypt diff --git a/pkg/crypt/sha1.go b/pkg/crypt/sha1.go new file mode 100644 index 0000000..7e756d9 --- /dev/null +++ b/pkg/crypt/sha1.go @@ -0,0 +1,25 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +import "crypto/sha1" + +// Implementation Enforcer +var ( + _ Encoder = (*sha1Encoder)(nil) +) + +type sha1Encoder struct{} + +func (e *sha1Encoder) Encode(pass []byte, hash interface{}) []byte { + h := sha1.Sum(pass) + return h[:] +} + +// NewSHA1Encoder returns a new SHA1 Encoder. +func NewSHA1Encoder() Encoder { + return &sha1Encoder{} +} diff --git a/pkg/crypt/sha256.go b/pkg/crypt/sha256.go new file mode 100644 index 0000000..b098870 --- /dev/null +++ b/pkg/crypt/sha256.go @@ -0,0 +1,25 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +import "crypto/sha256" + +// Implementation Enforcer +var ( + _ Encoder = (*sha256Encoder)(nil) +) + +type sha256Encoder struct{} + +func (e *sha256Encoder) Encode(pass []byte, hash interface{}) []byte { + h := sha256.Sum256(pass) + return h[:] +} + +// NewSHA256Encoder returns a new SHA256 Encoder. +func NewSHA256Encoder() Encoder { + return &sha256Encoder{} +} diff --git a/pkg/crypt/sha384.go b/pkg/crypt/sha384.go new file mode 100644 index 0000000..4aba9c9 --- /dev/null +++ b/pkg/crypt/sha384.go @@ -0,0 +1,25 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +import "crypto/sha512" + +// Implementation Enforcer +var ( + _ Encoder = (*sha384Encoder)(nil) +) + +type sha384Encoder struct{} + +func (e *sha384Encoder) Encode(pass []byte, hash interface{}) []byte { + h := sha512.Sum384(pass) + return h[:] +} + +// NewSHA384Encoder returns a new SHA384 Encoder. +func NewSHA384Encoder() Encoder { + return &sha384Encoder{} +} diff --git a/pkg/crypt/sha512.go b/pkg/crypt/sha512.go new file mode 100644 index 0000000..aca2a70 --- /dev/null +++ b/pkg/crypt/sha512.go @@ -0,0 +1,25 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +import "crypto/sha512" + +// Implementation Enforcer +var ( + _ Encoder = (*sha512Encoder)(nil) +) + +type sha512Encoder struct{} + +func (e *sha512Encoder) Encode(pass []byte, hash interface{}) []byte { + h := sha512.Sum512(pass) + return h[:] +} + +// NewSHA512Encoder returns a new SHA512 Encoder. +func NewSHA512Encoder() Encoder { + return &sha512Encoder{} +} diff --git a/pkg/crypt/ssha1.go b/pkg/crypt/ssha1.go new file mode 100644 index 0000000..e6dff8f --- /dev/null +++ b/pkg/crypt/ssha1.go @@ -0,0 +1,35 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +import "crypto/sha1" + +// Implementation Enforcer +var ( + _ Encoder = (*ssha1Encoder)(nil) +) + +type ssha1Encoder struct { + salt string +} + +func (e *ssha1Encoder) Encode(pass []byte, hash interface{}) []byte { + s := []byte(e.salt) + p := append(pass, s...) + h := sha1.Sum(p) + return h[:] +} + +func (e *ssha1Encoder) Salt() string { + return e.salt +} + +// NewSSHA1Encoder returns a new salted SHA1 Encoder. +func NewSSHA1Encoder(salt string) Encoder { + return &ssha1Encoder{ + salt: salt, + } +} diff --git a/pkg/crypt/ssha256.go b/pkg/crypt/ssha256.go new file mode 100644 index 0000000..5a86fee --- /dev/null +++ b/pkg/crypt/ssha256.go @@ -0,0 +1,35 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +import "crypto/sha256" + +// Implementation Enforcer +var ( + _ Encoder = (*ssha256Encoder)(nil) +) + +type ssha256Encoder struct { + salt string +} + +func (e *ssha256Encoder) Encode(pass []byte, hash interface{}) []byte { + s := []byte(e.salt) + p := append(pass, s...) + h := sha256.Sum256(p) + return h[:] +} + +func (e *ssha256Encoder) Salt() string { + return e.salt +} + +// NewSSHA256Encoder returns a new salted SHA256 Encoder. +func NewSSHA256Encoder(salt string) Encoder { + return &ssha256Encoder{ + salt: salt, + } +} diff --git a/pkg/crypt/ssha384.go b/pkg/crypt/ssha384.go new file mode 100644 index 0000000..41b4e84 --- /dev/null +++ b/pkg/crypt/ssha384.go @@ -0,0 +1,35 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +import "crypto/sha512" + +// Implementation Enforcer +var ( + _ Encoder = (*ssha384Encoder)(nil) +) + +type ssha384Encoder struct { + salt string +} + +func (e *ssha384Encoder) Encode(pass []byte, hash interface{}) []byte { + s := []byte(e.salt) + p := append(pass, s...) + h := sha512.Sum384(p) + return h[:] +} + +func (e *ssha384Encoder) Salt() string { + return e.salt +} + +// NewSSHA384Encoder returns a new salted SHA384 Encoder. +func NewSSHA384Encoder(salt string) Encoder { + return &ssha384Encoder{ + salt: salt, + } +} diff --git a/pkg/crypt/ssha512.go b/pkg/crypt/ssha512.go new file mode 100644 index 0000000..9328c11 --- /dev/null +++ b/pkg/crypt/ssha512.go @@ -0,0 +1,35 @@ +// Copyright (C) 2018 The Go-SQLite3 Authors. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package crypt + +import "crypto/sha512" + +// Implementation Enforcer +var ( + _ Encoder = (*ssha512Encoder)(nil) +) + +type ssha512Encoder struct { + salt string +} + +func (e *ssha512Encoder) Encode(pass []byte, hash interface{}) []byte { + s := []byte(e.salt) + p := append(pass, s...) + h := sha512.Sum512(p) + return h[:] +} + +func (e *ssha512Encoder) Salt() string { + return e.salt +} + +// NewSSHA384Encoder returns a new salted SHA512 Encoder. +func NewSSHA512Encoder(salt string) Encoder { + return &ssha512Encoder{ + salt: salt, + } +} diff --git a/sqlite3_func_crypt.go b/sqlite3_func_crypt.go deleted file mode 100644 index 3774a97..0000000 --- a/sqlite3_func_crypt.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (C) 2018 G.J.R. Timmer . -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file. - -package sqlite3 - -import ( - "crypto/sha1" - "crypto/sha256" - "crypto/sha512" -) - -// This file provides several different implementations for the -// default embedded sqlite_crypt function. -// This function is uses a ceasar-cypher by default -// and is used within the UserAuthentication module to encode -// the password. -// -// The provided functions can be used as an overload to the sqlite_crypt -// function through the use of the RegisterFunc on the connection. -// -// Because the functions can serv a purpose to an end-user -// without using the UserAuthentication module -// the functions are default compiled in. -// -// From SQLITE3 - user-auth.txt -// The sqlite_user.pw field is encoded by a built-in SQL function -// "sqlite_crypt(X,Y)". The two arguments are both BLOBs. The first argument -// is the plaintext password supplied to the sqlite3_user_authenticate() -// interface. The second argument is the sqlite_user.pw value and is supplied -// so that the function can extract the "salt" used by the password encoder. -// The result of sqlite_crypt(X,Y) is another blob which is the value that -// ends up being stored in sqlite_user.pw. To verify credentials X supplied -// by the sqlite3_user_authenticate() routine, SQLite runs: -// -// sqlite_user.pw == sqlite_crypt(X, sqlite_user.pw) -// -// To compute an appropriate sqlite_user.pw value from a new or modified -// password X, sqlite_crypt(X,NULL) is run. A new random salt is selected -// when the second argument is NULL. -// -// The built-in version of of sqlite_crypt() uses a simple Ceasar-cypher -// which prevents passwords from being revealed by searching the raw database -// for ASCII text, but is otherwise trivally broken. For better password -// security, the database should be encrypted using the SQLite Encryption -// Extension or similar technology. Or, the application can use the -// sqlite3_create_function() interface to provide an alternative -// implementation of sqlite_crypt() that computes a stronger password hash, -// perhaps using a cryptographic hash function like SHA1. - -// CryptEncoderSHA1 encodes a password with SHA1 -func CryptEncoderSHA1(pass []byte, hash interface{}) []byte { - h := sha1.Sum(pass) - return h[:] -} - -// CryptEncoderSSHA1 encodes a password with SHA1 with the -// configured salt. -func CryptEncoderSSHA1(salt string) func(pass []byte, hash interface{}) []byte { - return func(pass []byte, hash interface{}) []byte { - s := []byte(salt) - p := append(pass, s...) - h := sha1.Sum(p) - return h[:] - } -} - -// CryptEncoderSHA256 encodes a password with SHA256 -func CryptEncoderSHA256(pass []byte, hash interface{}) []byte { - h := sha256.Sum256(pass) - return h[:] -} - -// CryptEncoderSSHA256 encodes a password with SHA256 -// with the configured salt -func CryptEncoderSSHA256(salt string) func(pass []byte, hash interface{}) []byte { - return func(pass []byte, hash interface{}) []byte { - s := []byte(salt) - p := append(pass, s...) - h := sha256.Sum256(p) - return h[:] - } -} - -// CryptEncoderSHA384 encodes a password with SHA256 -func CryptEncoderSHA384(pass []byte, hash interface{}) []byte { - h := sha512.Sum384(pass) - return h[:] -} - -// CryptEncoderSSHA384 encodes a password with SHA256 -// with the configured salt -func CryptEncoderSSHA384(salt string) func(pass []byte, hash interface{}) []byte { - return func(pass []byte, hash interface{}) []byte { - s := []byte(salt) - p := append(pass, s...) - h := sha512.Sum384(p) - return h[:] - } -} - -// CryptEncoderSHA512 encodes a password with SHA256 -func CryptEncoderSHA512(pass []byte, hash interface{}) []byte { - h := sha512.Sum512(pass) - return h[:] -} - -// CryptEncoderSSHA512 encodes a password with SHA256 -// with the configured salt -func CryptEncoderSSHA512(salt string) func(pass []byte, hash interface{}) []byte { - return func(pass []byte, hash interface{}) []byte { - s := []byte(salt) - p := append(pass, s...) - h := sha512.Sum512(p) - return h[:] - } -} - -// EOF diff --git a/static_mock.go b/static_mock.go deleted file mode 100644 index 48629d1..0000000 --- a/static_mock.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build !cgo - -package sqlite3 - -import ( - "database/sql" - "database/sql/driver" - "errors" -) - -func init() { - sql.Register("sqlite3", &SQLiteDriverMock{}) -} - -type SQLiteDriverMock struct{} - -var errorMsg = errors.New("Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub") - -func (SQLiteDriverMock) Open(s string) (driver.Conn, error) { - return nil, errorMsg -} diff --git a/upgrade/package.go b/upgrade/package.go deleted file mode 100644 index 2b12a77..0000000 --- a/upgrade/package.go +++ /dev/null @@ -1,7 +0,0 @@ -// Package upgrade -// -// Dummy to ensure package can be loaded -// -// This file is to avoid the following error: -// can't load package: package go-sqlite3/upgrade: build constraints exclude all Go files in go-sqlite3\upgrade -package upgrade