1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2016 Guilherme Mansur<guilhermerpmansur@gmail.com>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Services to manipulate a Postgres database
19 # For more information, refer to the documentation of http://www.postgresql.org/docs/manuals/
30 # var animals = new Array[Animal]
31 # var dog = new Animal("Lassy", "dog", 10)
32 # var cat = new Animal("Garfield", "cat", 3)
33 # var turtle = new Animal("George", "turtle", 123)
39 # var db = new Postgres.open("dbname=postgres")
41 # assert db_is_open: not db.is_closed
42 # assert create_table: db.create_table("IF NOT EXISTS animals (aname TEXT PRIMARY KEY, kind TEXT NOT NULL, age INT NOT NULL)") else print db.error
44 # for animal in animals do
45 # assert insert: db.insert("INTO animals VALUES('{animal.name}', '{animal.kind}', {animal.age})") else print db.error
48 # var result = db.raw_execute("SELECT * FROM animals")
50 # assert drop_table: db.execute("DROP TABLE animals")
52 # assert db_is_closed: db.is_closed
56 private import native_postgres
58 # A connection to a Postgres database
60 private var native_connection
: NativePostgres
62 # Is the connection closed?
65 # Open the connnection with the database using the `conninfo`
66 init open
(conninfo
: Text)
68 init(new NativePostgres.connectdb
(conninfo
))
69 if native_connection
.status
.is_ok
then is_closed
= false
72 # Close this connection with the database
75 if is_closed
then return
79 native_connection
.finish
82 # Prepares the statement `query` with `stmt_name` to be executed later
84 # `num_params` specifies the number of parameters expected at the statement
87 # See `exec_prepared` for execution.
88 fun prepare
(stmt_name
:String, query
:String, num_params
: Int):PGResult do return new PGResult(native_connection
.prepare
(stmt_name
, query
, num_params
))
90 # Execute prepared statement named `stmt_name` with `values`
92 # * `num_params` specifies the number of parameters given to the prepared statement
93 # * `param_lengths` specifies the length of each parameters
94 # * `param_formats` and `result_format` specifies the format used as input/output.
95 # Should be 0 for text results, 1 for binary.
98 fun exec_prepared
(stmt_name
: String, num_params
: Int, values
: Array[String], param_lengths
: Array[Int], param_formats
: Array[Int], result_format
: Int):PGResult do
99 return new PGResult(native_connection
.exec_prepared
(stmt_name
, num_params
, values
, param_lengths
, param_formats
, result_format
))
102 # Executes a `query` and returns the raw `PGResult`
103 fun raw_execute
(query
: Text): PGResult do return new PGResult(native_connection
.exec
(query
))
105 # Execute the `sql` statement and returns `true` on success
106 fun execute
(query
: Text): Bool do return native_connection
.exec
(query
).status
.is_ok
108 # Create a table on the DB with a statement beginning with "CREATE TABLE ", followed by `rest`
110 # This method does not escape special characters.
111 fun create_table
(rest
: Text): Bool do return execute
("CREATE TABLE " + rest
)
113 # Insert in the DB with a statement beginning with "INSERT ", followed by `rest`
115 # This method does not escape special characters.
116 fun insert
(rest
: Text): Bool do return execute
("INSERT " + rest
)
118 # Replace in the DB with a statement beginning with "REPLACE", followed by `rest`
120 # This method does not escape special characters.
121 fun replace
(rest
: Text): Bool do return execute
("REPLACE " + rest
)
123 # The latest error message on the connection an empty string if none
124 fun error
: String do return native_connection
.error
126 # The status of this connection
127 fun is_valid
: Bool do return native_connection
.status
.is_ok
129 # Resets the connection to the database
130 fun reset
do native_connection
.reset
133 # The result of a given query
135 private var pg_result
: NativePGResult
137 # Clears the result object and frees the memory allocated to the underlying C struct
138 fun clear
do pg_result
.clear
140 # Returns the number of rows in the query result
141 fun ntuples
:Int do return pg_result
.ntuples
143 # Returns the number of columns in each row of the query result
144 fun nfields
:Int do return pg_result
.nfields
146 # Returns the ExecStatusType of a result
147 fun is_ok
:Bool do return pg_result
.status
.is_ok
149 # Returns the field name of a given `column_number`
150 fun fname
(column_number
:Int):String do return pg_result
.fname
(column_number
)
152 # Returns the column number associated with the `column_name`
153 fun fnumber
(column_name
:String):Int do return pg_result
.fnumber
(column_name
)
155 # Returns a single field value of one row of the result at `row_number`, `column_number`
156 fun value
(row_number
:Int, column_number
:Int):String do return pg_result
.value
(row_number
, column_number
)
158 # Tests wether a field specified by the `row_number` and `column_number` is null.
159 fun is_null
(row_number
:Int, column_number
: Int): Bool do return pg_result
.is_null
(row_number
, column_number
)