using System; using System.IO; using System.Text; using Npgsql; namespace pgcopyNamespace { class pgcopy { static bool verbose = false; public static void Main(string[] args) { if( args.Length < 1 ) { Console.Out.WriteLine("Usage: pgcopy [-v] [-c connString] {-i infile|-o outfile|SQL} ..."); Console.Out.WriteLine("Eg. 'CREATE TABLE t(t text)' -i pgcopy.cs 'COPY t FROM STDIN' 'COPY t TO STDOUT'"); return; } try { runCopy(args); } catch( Exception e ) { Console.Out.WriteLine("Copy failed: " + e); } } private static void runCopy(string[] args) { string connString = "Server=127.0.0.1;Port=5432;User Id=test;Password=password;Database=test;"; int i = 0; if(args.Length > 1 && args[0] == "-c") { connString = args[1]; i = 2; } if(verbose) Console.Out.WriteLine("Create connection: " + connString); Npgsql.NpgsqlConnection con = new Npgsql.NpgsqlConnection(connString); con.Open(); FileStream ifs = null, ofs = null; while( i < args.Length ) { if( args[i] == "-i" ) { ifs = args[++i] == "-" ? null : new FileStream( args[i], FileMode.Open, FileAccess.Read ); ++i; } else if( args[i] == "-o" ) { ofs = args[++i] == "-" ? null : new FileStream( args[i], FileMode.OpenOrCreate, FileAccess.Write ); ++i; } else { runCmd(args[i++], con, ifs, ofs); } } } private static void runCmd(string queryString, NpgsqlConnection con, FileStream ifs, FileStream ofs) { if(verbose) Console.Out.WriteLine("Create Command: " + queryString); NpgsqlCommand cmd = new NpgsqlCommand(queryString, con); if( cmd.CommandText.Contains(" FROM STDIN") ) { if(verbose) Console.Out.WriteLine("Copy In"); NpgsqlCopyIn copyIn = new NpgsqlCopyIn(cmd, con, ifs); copyIn.Start(); if( copyIn.IsActive ) // streaming, not single-pass { String row; System.Text.Encoding encoding = new System.Text.UTF8Encoding(); while( (row = Console.In.ReadLine()) != null ) { if(verbose) Console.Out.WriteLine("Sending row: '" + row + "'"); byte[] buf = encoding.GetBytes(row + '\n'); copyIn.CopyStream.Write(buf, 0, buf.Length); } copyIn.End(); } } else if( cmd.CommandText.Contains(" TO STDOUT") ) { if(verbose) Console.Out.WriteLine("Copy Out"); NpgsqlCopyOut copyOut = new NpgsqlCopyOut(cmd, con, ofs); copyOut.Start(); if( copyOut.IsActive ) // streaming, not single-pass { byte[] buf; while( (buf = copyOut.Read) != null ) { Console.Out.Write(System.Text.Encoding.ASCII.GetString(buf)); } copyOut.End(); } } else { if(verbose) Console.Out.WriteLine("Non-Copy query"); cmd.ExecuteNonQuery(); } if(verbose) Console.Out.WriteLine("Done " + queryString); } } }