wls2 Ubuntu postgresql gccで遊ぶ。
※セキュリティとか権限とか何も考えていません。
ハードコートするなよと言わないでね。
gccとpostgresqlを使って遊ぶだけです。
1.必要なものをインストール
>sudo apt update && sudo apt upgrade
>sudo apt install build-essential
>sudo apt install postgresql postgresql-contrib libpq-dev
2.Postgresql起動
# PostgreSQL の状態を確認する
>sudo service postgresql status
12/main (port 5432): down #止まってるね。
# PostgreSQL を開始する
>sudo service postgresql start
* Starting PostgreSQL 12 database server [ OK ]
# PostgreSQL の状態を確認する
>sudo service postgresql status
12/main (port 5432): online
3.postgreユーザになってしまう。
> sudo -i -u postgres
4.psqlでDB作成
demo1というDB作成
> psql
postgres=# create database demo1;
CREATE DATABASE
5.できたか確認
postgres=# select * from pg_database;
oid | datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace | datacl
-------+-----------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+------------+---------------+-------------------------------------
13427 | postgres | 10 | 6 | C.UTF-8 | C.UTF-8 | f | t | -1 | 13426 | 479 | 1 | 1663 |
1 | template1 | 10 | 6 | C.UTF-8 | C.UTF-8 | t | t | -1 | 13426 | 479 | 1 | 1663 | {=c/postgres,postgres=CTc/postgres}
13426 | template0 | 10 | 6 | C.UTF-8 | C.UTF-8 | t | f | -1 | 13426 | 479 | 1 | 1663 | {=c/postgres,postgres=CTc/postgres}
16385 | demo1 | 10 | 6 | C.UTF-8 | C.UTF-8 | f | t | -1 | 13426 | 479 | 1 | 1663 |
(4 rows)
6.demo1にテーブル作成
CREATE TABLE weather (
city varchar(80),
temp_lo int, -- 最低気温
temp_hi int, -- 最高気温
prcp real, -- 降水量
date date
);
7.データ挿入
INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
8.データ確認
demo1=# select * from weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
(1 row)
9.接続テストユーザ作成
demo1=# CREATE ROLE user01 LOGIN PASSWORD 'user01';
CREATE ROLE
demo1=#
demo1=# GRANT SELECT, UPDATE, INSERT ON weather TO user01;
GRANT
10.postgresユーザで入ってpsql動かして抜ける。
$ sudo -i -u postgres
postgres@MC0153A:~$ psql demo1
psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1))
Type "help" for help.
demo1=# \q
postgres@MC0153A:~$ exit
logout
11.Cソースを書く。
/*
*
*
* testprog1.c
*/
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
int
main(int argc, char **argv)
{
const char *conninfo;
PGconn *conn;
PGresult *res;
int nFields;
int i,
j;
conninfo = "host=localhost port=5432 dbname=demo1 user=user01 password=user01";
/* データベースとの接続を確立する */
conn = PQconnectdb(conninfo);
/* バックエンドとの接続確立に成功したかを確認する */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
/*
*
* 検索
*
*/
res = PQexec(conn, "select * from weather");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "SQL failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
/* まず属性名を表示する。 */
nFields = PQnfields(res);
for (i = 0; i < nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n\n");
/* そして行を表示する。 */
for (i = 0; i < PQntuples(res); i++)
{
for (j = 0; j < nFields; j++)
printf("%-15s", PQgetvalue(res, i, j));
printf("\n");
}
PQclear(res);
/* ポータルを閉ざす。ここではエラーチェックは省略した… */
res = PQexec(conn, "CLOSE myportal");
PQclear(res);
/* データベースとの接続を閉じ、後始末を行う。 */
PQfinish(conn);
return 0;
}
12.コンパイル
gcc -c -I/usr/include/postgresql testprog1.c
gcc -o testprog1 testprog1.o -lpq
13.実行してみる
$ ./testprog1
city temp_lo temp_hi prcp date
San Francisco 46 50 0.25 1994-11-27
データが表示された。
めでたし。めでたし。
ちゃんと「DECLARE 」使ったほうがいいかな?
サポートして頂くと頑張るかもしれません。