ラベル C言語 の投稿を表示しています。 すべての投稿を表示
ラベル C言語 の投稿を表示しています。 すべての投稿を表示

2011年7月14日木曜日

PostgreSQLでpsql以外からCOPY FROM/TO を使う

PostgreSQLで便利なCOPY文。
でも、COPY FROM/TO 'ファイル名'を使うにはスーパーユーザ(superuser)権限が必要…。
ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
なんでもかんでもスーパーユーザにするのはよくないので、なにか方法はないかと調べてみた。

一つは\copyを使う方法。
C言語でlibpqを使って繋げているので、「単純にcopyを\copyにすればいいのか?」と思い試してみたが、やっぱりダメ。
そう簡単ではありません。
要は\copyはpsqlのコマンドであり、PostgreSQLに取っては分からないコマンドになってしまうから。

もう一つは、ヒントにも書かれているstdout, stdinを使う方法。
C言語からどうやればいいんだろう?
ということで、公式のドキュメントを参照。
http://www.postgresql.jp/document/9.0/html/libpq-copy.html

PQPutCopyData関数を使えばいいらしい。
ただいきなり発行できるわけではなく、まずCOPY_IN状態にしなくちゃならない。
COPY_IN状態にするにはどうしたらいいかというと、普通にPQExecで"COPY FROM STDIN..."を実行させればいいだけ。
こうなってからPQPutCopyData関数を使えばstdinから入れているように見せられる、とそういうわけか。

ここまで調べて、さあ実装しよう!と思ったら、上司から「そのユーザ、スーパーユーザにしちゃっていいよ」とのお言葉…。
まぁ、他にもいろいろあるユーザだし、プログラムの実行しかしないログインも出来ないユーザだからいいっちゃいいけどね。

ちょっと拍子抜けでした!

gdbの使い方

C言語での開発は好きじゃない…。
比べればまだいいけど、Javaもあんまり好きじゃない。
気楽なスクリプト言語が一番好み。

でも、仕事では既にC言語で書かれちゃってて、さらにメモリ破壊なんてことが起きたりするわけで。
動かすマシンを買えたらアーキテクチャの違いか何かで、今まで動いていたプログラムが急に動かなくなったりする。
まぁ、潜在的に抱えてたんだろうけど…。

そんな時に使えるのがgdb。
gdbはソースレベルのエントリを利用してデバッグを行うシンボリックデバッガ。
ソースがなく、プログラムしかない場合は機械語レベルでデバッグを行うアブソリュートデバッガを使うけど、ずっと大変そう…。
幸いソースはあるので、gdbを使う。
何ができるかって、プログラムを一行ずつ動かしたりして、その都度変数やスタックなんかを見ることが出来る。

まずは下準備。
-g オプションを付けてコンパイル。
要はこのオプションを付けることで、デバッグに必要な情報を実行ファイルにいれていると思われる。

で、gdbの起動。引数としてデバッグしたいプログラムを渡しちゃうと楽。
$ gdb sample
次はブレイクポイントの設定。
ソースコードを見ながら、挙動を監視したい辺りにブレイクポイントを設定
(gdb) break 5
※短縮してb 5 でも動く

で、いよいよプログラムの実行。
引数はrunコマンドに渡せばいい。
(gdb) run parameter1 parameter2

もちろんブレイクポイントまでで止まる。それ以前にエラーがあればそこで止まるけど。

お次は変数の確認。
(gdb) print hoge
※短縮して p hogeでも動く

次の行に進むには
(gdb) next
※短縮してnでも動く
まとめてN行進むには
(gdb) step N
※短縮してs Nでも動く。Nを省略すると1行進む

次のブレイクポイントまで一気に進むには
(gdb) continue
※短縮してcでも動く

やめたくなったら
(gdb) kill
あるいは一気に
(gdb) quit
で抜けてもいい。gdbが動かしていたプログラムはquitすれば止まる。

以上、簡単な使い方。
もっと詳しく知りたい人は以下で!
http://cl.is.kyushu-u.ac.jp/Literacy/PP/H14/adp/program/compile.html
http://uguisu.skr.jp/Windows/gdb.html