Initial project import
This commit is contained in:
commit
23f2d29e32
11957 files changed
+1754577
No files matched your search
@@ -0,0 +1,17 @@
|
||||
// vtest build: !(macos || windows)
|
||||
import db.mysql
|
||||
|
||||
fn main() {
|
||||
mut conn := mysql.connect(
|
||||
host: 'localhost'
|
||||
port: 3306
|
||||
username: 'root'
|
||||
password: ''
|
||||
dbname: 'mysql'
|
||||
)!
|
||||
res := conn.query('show tables')!
|
||||
for row in res.rows() {
|
||||
println(row.vals.join(', '))
|
||||
}
|
||||
conn.close()!
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
// vtest build: !(macos || windows)
|
||||
import db.mysql
|
||||
import pool
|
||||
import time
|
||||
|
||||
// Define your connection factory function
|
||||
fn create_conn() !&pool.ConnectionPoolable {
|
||||
config := mysql.Config{
|
||||
host: '127.0.0.1'
|
||||
port: 3306
|
||||
username: 'root'
|
||||
password: '12345678'
|
||||
dbname: 'mysql'
|
||||
}
|
||||
db := mysql.connect(config)!
|
||||
return &db
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// Configure pool parameters
|
||||
config := pool.ConnectionPoolConfig{
|
||||
max_conns: 50
|
||||
min_idle_conns: 5
|
||||
max_lifetime: 2 * time.hour
|
||||
idle_timeout: 30 * time.minute
|
||||
get_timeout: 5 * time.second
|
||||
}
|
||||
|
||||
// Create connection pool
|
||||
mut my_pool := pool.new_connection_pool(create_conn, config)!
|
||||
defer {
|
||||
// When application exits
|
||||
my_pool.close()
|
||||
}
|
||||
|
||||
// Acquire connection
|
||||
mut conn := my_pool.get()!
|
||||
defer {
|
||||
// Return connection to pool
|
||||
my_pool.put(conn) or { println(err) }
|
||||
}
|
||||
|
||||
// Convert `conn` to a `mysql.DB` object
|
||||
mut db := conn as mysql.DB
|
||||
|
||||
assert db.validate()!
|
||||
|
||||
mut response := db.exec('drop table if exists users')!
|
||||
assert response == []mysql.Row{}
|
||||
|
||||
response = db.exec('create table if not exists users (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
username TEXT,
|
||||
last_name TEXT NULL DEFAULT NULL
|
||||
)')!
|
||||
assert response == []mysql.Row{}
|
||||
|
||||
mut result_code := db.exec_none('insert into users (username) values ("jackson")')
|
||||
assert result_code == 0
|
||||
result_code = db.exec_none('insert into users (username) values ("shannon")')
|
||||
assert result_code == 0
|
||||
result_code = db.exec_none('insert into users (username) values ("bailey")')
|
||||
assert result_code == 0
|
||||
result_code = db.exec_none('insert into users (username) values ("blaze")')
|
||||
assert result_code == 0
|
||||
rows := db.exec_param('insert into users (username) values (?)', 'Hi')!
|
||||
assert rows == []mysql.Row{}
|
||||
|
||||
// Regression testing to ensure the query and exec return the same values
|
||||
res := db.query('select * from users')!
|
||||
response = res.rows()
|
||||
assert response[0].vals[1] == 'jackson'
|
||||
response = db.exec('select * from users')!
|
||||
assert response[0].vals[1] == 'jackson'
|
||||
|
||||
response = db.exec('select * from users where id = 400')!
|
||||
assert response.len == 0
|
||||
|
||||
single_row := db.exec_one('select * from users')!
|
||||
assert single_row.vals[1] == 'jackson'
|
||||
|
||||
response = db.exec_param_many('select * from users where username = ?', [
|
||||
'jackson',
|
||||
])!
|
||||
assert response[0] == mysql.Row{
|
||||
vals: ['1', 'jackson', '']
|
||||
}
|
||||
|
||||
response = db.exec_param_many('select * from users where username = ? and id = ?', [
|
||||
'bailey',
|
||||
'3',
|
||||
])!
|
||||
assert response[0] == mysql.Row{
|
||||
vals: ['3', 'bailey', '']
|
||||
}
|
||||
|
||||
response = db.exec_param_many('select * from users', [''])!
|
||||
assert response == [
|
||||
mysql.Row{
|
||||
vals: ['1', 'jackson', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['2', 'shannon', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['3', 'bailey', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['4', 'blaze', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['5', 'Hi', '']
|
||||
},
|
||||
]
|
||||
|
||||
response = db.exec_param('select * from users where username = ?', 'blaze')!
|
||||
assert response[0] == mysql.Row{
|
||||
vals: ['4', 'blaze', '']
|
||||
}
|
||||
|
||||
// transaction test
|
||||
// turn off `autocommit` first
|
||||
db.autocommit(false)!
|
||||
// begin a new transaction
|
||||
db.begin()!
|
||||
result_code = db.exec_none('insert into users (username) values ("tom")')
|
||||
assert result_code == 0
|
||||
// make a savepoint
|
||||
db.savepoint('savepoint1')!
|
||||
result_code = db.exec_none('insert into users (username) values ("kitty")')
|
||||
assert result_code == 0
|
||||
// rollback to `savepoint1`
|
||||
db.rollback_to('savepoint1')!
|
||||
result_code = db.exec_none('insert into users (username) values ("mars")')
|
||||
assert result_code == 0
|
||||
db.commit()!
|
||||
response = db.exec_param_many('select * from users', [''])!
|
||||
assert response == [
|
||||
mysql.Row{
|
||||
vals: ['1', 'jackson', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['2', 'shannon', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['3', 'bailey', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['4', 'blaze', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['5', 'Hi', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['6', 'tom', '']
|
||||
},
|
||||
mysql.Row{
|
||||
vals: ['8', 'mars', '']
|
||||
},
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,293 @@
|
||||
// vtest build: !(macos || windows)
|
||||
import os
|
||||
import db.sqlite
|
||||
import db.mysql
|
||||
import db.pg
|
||||
|
||||
// The goal of this example, is to show how you can connect to
|
||||
// several different databases in the same program, and use both
|
||||
// the ORM and the native connection wrapper, that each DB driver
|
||||
// provides, if you need to execute more complex SQL queries.
|
||||
//
|
||||
// You can use environment variables to pass your local DB connection
|
||||
// settings, without editing the code, like this:
|
||||
//
|
||||
// MUSER='myuser' MPASS='abc' MDATABASE='vtestdb' PGUSER='postgres' PGPASS='password' PGDATABASE='postgres' ./v -g run examples/database/orm.v
|
||||
//
|
||||
// WARNING: this example will drop and re-create any tables named:
|
||||
// * modules
|
||||
// * User
|
||||
// * Parent
|
||||
// * Child
|
||||
// in the passed databases, so it is better to use empty DBs for it.
|
||||
|
||||
const mysql_host = os.getenv_opt('MHOST') or { 'localhost' }
|
||||
const mysql_port = os.getenv_opt('MPORT') or { '3306' }.u32()
|
||||
const mysql_user = os.getenv_opt('MUSER') or { 'myuser' }
|
||||
const mysql_pass = os.getenv_opt('MPASS') or { 'abc' }
|
||||
const mysql_db = os.getenv_opt('MDATABASE') or { 'test' }
|
||||
|
||||
const pg_host = os.getenv_opt('PGHOST') or { 'localhost' }
|
||||
const pg_user = os.getenv_opt('PGUSER') or { 'test' }
|
||||
const pg_pass = os.getenv_opt('PGPASS') or { 'abc' }
|
||||
const pg_db = os.getenv_opt('PGDATABASE') or { 'test' }
|
||||
|
||||
@[table: 'modules']
|
||||
struct Module {
|
||||
id int @[primary; sql: serial]
|
||||
name string
|
||||
nr_downloads int @[sql: u64]
|
||||
creator User
|
||||
}
|
||||
|
||||
struct User {
|
||||
id int @[primary; sql: serial]
|
||||
age u32 @[unique: 'user']
|
||||
name string @[sql: 'username'; sql_type: 'VARCHAR(200)'; unique]
|
||||
is_customer bool @[sql: 'abc'; unique: 'user']
|
||||
skipped_string string @[skip]
|
||||
}
|
||||
|
||||
struct Parent {
|
||||
id int @[primary; sql: serial]
|
||||
name string
|
||||
children []Child @[fkey: 'parent_id']
|
||||
}
|
||||
|
||||
struct Child {
|
||||
id int @[primary; sql: serial]
|
||||
parent_id int
|
||||
name string
|
||||
}
|
||||
|
||||
fn sqlite3_array() ! {
|
||||
eprintln('------------ ${@METHOD} -----------------')
|
||||
mut db := sqlite.connect(':memory:')!
|
||||
defer {
|
||||
sql db {
|
||||
drop table Parent
|
||||
drop table Child
|
||||
} or {}
|
||||
db.close() or {}
|
||||
}
|
||||
|
||||
sql db {
|
||||
create table Parent
|
||||
}!
|
||||
sql db {
|
||||
create table Child
|
||||
}!
|
||||
par := Parent{
|
||||
name: 'test'
|
||||
children: [
|
||||
Child{
|
||||
name: 'abc'
|
||||
},
|
||||
Child{
|
||||
name: 'def'
|
||||
},
|
||||
]
|
||||
}
|
||||
sql db {
|
||||
insert par into Parent
|
||||
}!
|
||||
parent := sql db {
|
||||
select from Parent where id == 1
|
||||
}!
|
||||
eprintln(parent)
|
||||
}
|
||||
|
||||
fn msql_array() ! {
|
||||
eprintln('------------ ${@METHOD} -----------------')
|
||||
mut db := mysql.connect(
|
||||
host: mysql_host
|
||||
port: mysql_port
|
||||
username: mysql_user
|
||||
password: mysql_pass
|
||||
dbname: mysql_db
|
||||
)!
|
||||
defer {
|
||||
sql db {
|
||||
drop table Parent
|
||||
} or {}
|
||||
db.close() or {}
|
||||
}
|
||||
|
||||
db.query('drop table if exists Parent')!
|
||||
db.query('drop table if exists Child')!
|
||||
sql db {
|
||||
create table Parent
|
||||
create table Child
|
||||
}!
|
||||
par := Parent{
|
||||
name: 'test'
|
||||
children: [
|
||||
Child{
|
||||
name: 'abc'
|
||||
},
|
||||
Child{
|
||||
name: 'def'
|
||||
},
|
||||
]
|
||||
}
|
||||
sql db {
|
||||
insert par into Parent
|
||||
}!
|
||||
parent := sql db {
|
||||
select from Parent where id == 1
|
||||
}!
|
||||
eprintln(parent)
|
||||
}
|
||||
|
||||
fn psql_array() ! {
|
||||
eprintln('------------ ${@METHOD} -----------------')
|
||||
mut db := pg.connect(host: pg_host, user: pg_user, password: pg_pass, dbname: pg_db)!
|
||||
defer {
|
||||
db.exec_one('drop table if exists "Parent", "Child"') or { eprintln(err) }
|
||||
db.close() or {}
|
||||
}
|
||||
db.exec_one('drop table if exists "Parent", "Child"') or { eprintln(err) }
|
||||
|
||||
sql db {
|
||||
create table Parent
|
||||
create table Child
|
||||
}!
|
||||
par := Parent{
|
||||
name: 'test'
|
||||
children: [
|
||||
Child{
|
||||
name: 'abc'
|
||||
},
|
||||
Child{
|
||||
name: 'def'
|
||||
},
|
||||
]
|
||||
}
|
||||
sql db {
|
||||
insert par into Parent
|
||||
}!
|
||||
parent := sql db {
|
||||
select from Parent where id == 1
|
||||
}!
|
||||
eprintln(parent)
|
||||
}
|
||||
|
||||
fn sqlite3() ! {
|
||||
eprintln('------------ ${@METHOD} -----------------')
|
||||
mut db := sqlite.connect(':memory:')!
|
||||
defer {
|
||||
sql db {
|
||||
drop table Module
|
||||
drop table User
|
||||
} or {}
|
||||
db.close() or {}
|
||||
}
|
||||
|
||||
sql db {
|
||||
create table Module
|
||||
}!
|
||||
sql db {
|
||||
create table User
|
||||
}!
|
||||
mod := Module{
|
||||
name: 'test'
|
||||
nr_downloads: 10
|
||||
creator: User{
|
||||
age: 21
|
||||
name: 'VUser'
|
||||
is_customer: true
|
||||
}
|
||||
}
|
||||
sql db {
|
||||
insert mod into Module
|
||||
}!
|
||||
modul := sql db {
|
||||
select from Module where id == 1
|
||||
}!
|
||||
eprintln(modul)
|
||||
}
|
||||
|
||||
fn msql() ! {
|
||||
eprintln('------------ ${@METHOD} -----------------')
|
||||
mut conn := mysql.connect(
|
||||
host: mysql_host
|
||||
port: mysql_port
|
||||
username: mysql_user
|
||||
password: mysql_pass
|
||||
dbname: mysql_db
|
||||
)!
|
||||
defer {
|
||||
conn.query('DROP TABLE IF EXISTS Module') or { eprintln(err) }
|
||||
conn.query('DROP TABLE IF EXISTS User') or { eprintln(err) }
|
||||
conn.close() or {}
|
||||
}
|
||||
conn.query('DROP TABLE IF EXISTS Module') or { eprintln(err) }
|
||||
conn.query('DROP TABLE IF EXISTS User') or { eprintln(err) }
|
||||
|
||||
sql conn {
|
||||
create table Module
|
||||
}!
|
||||
sql conn {
|
||||
create table User
|
||||
}!
|
||||
mod := Module{
|
||||
name: 'test'
|
||||
nr_downloads: 10
|
||||
creator: User{
|
||||
age: 21
|
||||
name: 'VUser'
|
||||
is_customer: true
|
||||
}
|
||||
}
|
||||
sql conn {
|
||||
insert mod into Module
|
||||
}!
|
||||
m := sql conn {
|
||||
select from Module where id == 1
|
||||
}!
|
||||
eprintln(m)
|
||||
}
|
||||
|
||||
fn psql() ! {
|
||||
eprintln('------------ ${@METHOD} -----------------')
|
||||
mut db := pg.connect(host: pg_host, user: pg_user, password: pg_pass, dbname: pg_db)!
|
||||
defer {
|
||||
db.exec_one('drop table if exists "modules", "User"') or { eprintln(err) }
|
||||
db.close() or {}
|
||||
}
|
||||
db.exec_one('drop table if exists "modules", "User"') or { eprintln(err) }
|
||||
sql db {
|
||||
create table Module
|
||||
create table User
|
||||
}!
|
||||
mod := Module{
|
||||
name: 'test'
|
||||
nr_downloads: 10
|
||||
creator: User{
|
||||
age: 21
|
||||
name: 'VUser'
|
||||
is_customer: true
|
||||
}
|
||||
}
|
||||
sql db {
|
||||
insert mod into Module
|
||||
}!
|
||||
modul := sql db {
|
||||
select from Module where id == 1
|
||||
}!
|
||||
sql db {
|
||||
drop table Module
|
||||
}!
|
||||
eprintln(modul)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
eprintln('------------ ${@METHOD} -----------------')
|
||||
sqlite3_array()!
|
||||
msql_array()!
|
||||
psql_array()!
|
||||
|
||||
sqlite3()!
|
||||
msql()!
|
||||
psql()!
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
customer
|
||||
@@ -0,0 +1,71 @@
|
||||
// vtest build: linux
|
||||
module main
|
||||
|
||||
import db.pg
|
||||
|
||||
struct Customer {
|
||||
id int
|
||||
name string
|
||||
nr_orders int
|
||||
country string
|
||||
}
|
||||
|
||||
const dash = '----------------------------------------------------------------'
|
||||
|
||||
fn main() {
|
||||
db := pg.connect(
|
||||
host: 'localhost' // or '127.0.0.1'
|
||||
user: 'postgres'
|
||||
dbname: 'customerdb'
|
||||
) or {
|
||||
eprintln('failed to connect, error: ${err}')
|
||||
return
|
||||
}
|
||||
|
||||
nr_customers := sql db {
|
||||
select count from Customer
|
||||
}!
|
||||
println('Total customers: ${nr_customers}')
|
||||
|
||||
println(dash)
|
||||
bg_country := 'Bulgaria'
|
||||
// V syntax can be used to build queries
|
||||
bg_customers := sql db {
|
||||
select from Customer where country == bg_country && id != 2
|
||||
}!
|
||||
for customer in bg_customers {
|
||||
println('${customer.country} | ${customer.id} - ${customer.name}')
|
||||
}
|
||||
|
||||
println(dash)
|
||||
ru_customers := sql db {
|
||||
select from Customer where country == 'Russia'
|
||||
}!
|
||||
for customer in ru_customers {
|
||||
println('${customer.country} | ${customer.id} - ${customer.name}')
|
||||
}
|
||||
|
||||
// by adding `limit 1` we tell V that there will be only one object
|
||||
println(dash)
|
||||
existing := sql db {
|
||||
select from Customer where id == 1 limit 1
|
||||
}!
|
||||
println('Existing customer name: ${existing}[0].name')
|
||||
println('Existing customer full information:')
|
||||
println(existing)
|
||||
|
||||
println(dash)
|
||||
q := Customer{}
|
||||
// It's easy to handle queries that don't return any data
|
||||
_ := sql db {
|
||||
select from Customer where id == 12345 && name == q.name && nr_orders > q.nr_orders limit 1
|
||||
}!
|
||||
// Insert a new customer
|
||||
nc := Customer{
|
||||
name: 'John Doe'
|
||||
nr_orders: 10
|
||||
}
|
||||
sql db {
|
||||
insert nc into Customer
|
||||
}!
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
--
|
||||
-- PostgreSQL database dump
|
||||
--
|
||||
|
||||
-- Dumped from database version 9.5.19
|
||||
-- Dumped by pg_dump version 9.5.19
|
||||
|
||||
SET statement_timeout = 0;
|
||||
SET lock_timeout = 0;
|
||||
SET client_encoding = 'UTF8';
|
||||
SET standard_conforming_strings = on;
|
||||
SELECT pg_catalog.set_config('search_path', '', false);
|
||||
SET check_function_bodies = false;
|
||||
SET xmloption = content;
|
||||
SET client_min_messages = warning;
|
||||
SET row_security = off;
|
||||
|
||||
--
|
||||
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
|
||||
--
|
||||
|
||||
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
|
||||
|
||||
|
||||
--
|
||||
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
|
||||
--
|
||||
|
||||
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
|
||||
|
||||
|
||||
SET default_tablespace = '';
|
||||
|
||||
SET default_with_oids = false;
|
||||
|
||||
--
|
||||
-- Name: customers; Type: TABLE; Schema: public; Owner: myuser
|
||||
--
|
||||
|
||||
CREATE TABLE public.customers (
|
||||
id integer NOT NULL,
|
||||
name text DEFAULT ''::text,
|
||||
nr_orders integer DEFAULT 0,
|
||||
country text DEFAULT 'England'::text,
|
||||
created_at timestamp without time zone DEFAULT now()
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.customers OWNER TO myuser;
|
||||
|
||||
--
|
||||
-- Name: customers_id_seq; Type: SEQUENCE; Schema: public; Owner: myuser
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.customers_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER TABLE public.customers_id_seq OWNER TO myuser;
|
||||
|
||||
--
|
||||
-- Name: customers_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: myuser
|
||||
--
|
||||
|
||||
ALTER SEQUENCE public.customers_id_seq OWNED BY public.customers.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: id; Type: DEFAULT; Schema: public; Owner: myuser
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.customers ALTER COLUMN id SET DEFAULT nextval('public.customers_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Data for Name: customers; Type: TABLE DATA; Schema: public; Owner: myuser
|
||||
--
|
||||
|
||||
COPY public.customers (id, name, nr_orders, country, created_at) FROM stdin;
|
||||
2 Pippi Långstrump 3 Bulgaria 2019-08-19 09:41:30.78888
|
||||
1 Bilbo Begins 11 Bulgaria 2019-08-19 09:40:31.396807
|
||||
3 Viktualia Rullgardina 0 Bulgaria 2019-08-19 09:42:52.723223
|
||||
4 Krusmynta Efraimsdotter 5 Bulgaria 2019-08-19 09:43:04.083209
|
||||
5 Ana Karenina 0 Russia 2019-08-20 15:41:50.244971
|
||||
7 Jiji Lolobridgida 0 Italy 2019-08-20 15:42:26.020113
|
||||
6 Viktor Savashkin 8 Russia 2019-08-20 15:42:07.213557
|
||||
\.
|
||||
|
||||
|
||||
--
|
||||
-- Name: customers_id_seq; Type: SEQUENCE SET; Schema: public; Owner: myuser
|
||||
--
|
||||
|
||||
SELECT pg_catalog.setval('public.customers_id_seq', 1, true);
|
||||
|
||||
|
||||
--
|
||||
-- Name: customers_pkey; Type: CONSTRAINT; Schema: public; Owner: myuser
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.customers
|
||||
ADD CONSTRAINT customers_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: postgres
|
||||
--
|
||||
|
||||
REVOKE ALL ON SCHEMA public FROM PUBLIC;
|
||||
REVOKE ALL ON SCHEMA public FROM postgres;
|
||||
GRANT ALL ON SCHEMA public TO postgres;
|
||||
GRANT ALL ON SCHEMA public TO PUBLIC;
|
||||
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump complete
|
||||
--
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import db.sqlite
|
||||
|
||||
fn main() {
|
||||
db := sqlite.connect(':memory:')!
|
||||
db.exec("create table users (id integer primary key, name text default '');") or { panic(err) }
|
||||
|
||||
db.exec("insert into users (name) values ('Sam')")!
|
||||
db.exec("insert into users (name) values ('Peter')")!
|
||||
db.exec("insert into users (name) values ('Kate')")!
|
||||
|
||||
nr_users := db.q_int('select count(*) from users')!
|
||||
println('nr users = ${nr_users}')
|
||||
|
||||
name := db.q_string('select name from users where id = 1')!
|
||||
assert name == 'Sam'
|
||||
|
||||
users := db.exec('select * from users')!
|
||||
for row in users {
|
||||
println(row.vals)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user