pg 0.11.0 → 0.12.0pre258

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,6 +2,11 @@ require 'pp'
2
2
  require 'mkmf'
3
3
 
4
4
 
5
+ if ENV['MAINTAINER_MODE']
6
+ $stderr.puts "Maintainer mode enabled."
7
+ $CFLAGS << ' -Wall' << ' -ggdb' << ' -DDEBUG'
8
+ end
9
+
5
10
  if pgdir = with_config( 'pg' )
6
11
  ENV['PATH'] = "#{pgdir}/bin" + File::PATH_SEPARATOR + ENV['PATH']
7
12
  end
@@ -21,8 +26,8 @@ dir_config 'pg'
21
26
 
22
27
  if pgconfig = ( with_config('pg-config') || with_config('pg_config') || find_executable('pg_config') )
23
28
  $stderr.puts "Using config values from %s" % [ pgconfig ]
24
- $CPPFLAGS << " -I%s" % [ `#{pgconfig} --includedir`.chomp ]
25
- $LDFLAGS << " -L%s" % [ `#{pgconfig} --libdir`.chomp ]
29
+ $CPPFLAGS << " -I%s" % [ `"#{pgconfig}" --includedir`.chomp ]
30
+ $LDFLAGS << " -L%s" % [ `"#{pgconfig}" --libdir`.chomp ]
26
31
  else
27
32
  $stderr.puts "No pg_config... trying anyway. If building fails, please try again with",
28
33
  " --with-pg-config=/path/to/pg_config"
data/ext/pg.c CHANGED
@@ -9,7 +9,7 @@
9
9
  modified at: Wed Jan 20 16:41:51 1999
10
10
 
11
11
  $Author: ged $
12
- $Date: 2011/04/18 23:51:05 $
12
+ $Date: 2011/10/07 20:24:14 $
13
13
  ************************************************/
14
14
 
15
15
  #include "pg.h"
@@ -28,7 +28,7 @@ static VALUE rb_cPGconn;
28
28
  static VALUE rb_cPGresult;
29
29
  static VALUE rb_ePGError;
30
30
 
31
- static const char *VERSION = "0.11.0";
31
+ static const char *VERSION = "0.12.0";
32
32
 
33
33
 
34
34
  /* The following functions are part of libpq, but not
@@ -293,7 +293,7 @@ pgconn_alloc(VALUE klass)
293
293
  * If the Ruby default internal encoding is set (i.e., Encoding.default_internal != nil), the
294
294
  * connection will have its +client_encoding+ set accordingly.
295
295
  *
296
- * @raises [PGError] if the connection fails.
296
+ * Raises a PGError if the connection fails.
297
297
  */
298
298
  static VALUE
299
299
  pgconn_init(int argc, VALUE *argv, VALUE self)
@@ -784,7 +784,7 @@ pgconn_server_version(VALUE self)
784
784
 
785
785
  /*
786
786
  * call-seq:
787
- * conn.error() -> String
787
+ * conn.error_message -> String
788
788
  *
789
789
  * Returns the error message about connection.
790
790
  */
@@ -1285,7 +1285,6 @@ pgconn_make_empty_pgresult(VALUE self, VALUE status)
1285
1285
  /*
1286
1286
  * call-seq:
1287
1287
  * conn.escape_string( str ) -> String
1288
- * PGconn.escape_string( str ) -> String # DEPRECATED
1289
1288
  *
1290
1289
  * Connection instance method for versions of 8.1 and higher of libpq
1291
1290
  * uses PQescapeStringConn, which is safer. Avoid calling as a class method,
@@ -1343,7 +1342,6 @@ pgconn_s_escape(VALUE self, VALUE string)
1343
1342
  /*
1344
1343
  * call-seq:
1345
1344
  * conn.escape_bytea( string ) -> String
1346
- * PGconn.escape_bytea( string ) -> String # DEPRECATED
1347
1345
  *
1348
1346
  * Connection instance method for versions of 8.1 and higher of libpq
1349
1347
  * uses PQescapeByteaConn, which is safer. Avoid calling as a class method,
@@ -2056,6 +2054,7 @@ void cleanup_crt_fd(fd_set *os_set, fd_set *crt_set)
2056
2054
  * call-seq:
2057
2055
  * conn.wait_for_notify( [ timeout ] ) -> String
2058
2056
  * conn.wait_for_notify( [ timeout ] ) { |event, pid| block }
2057
+ * conn.wait_for_notify( [ timeout ] ) { |event, pid, payload| block } # PostgreSQL 9.0
2059
2058
  *
2060
2059
  * Blocks while waiting for notification(s), or until the optional
2061
2060
  * _timeout_ is reached, whichever comes first. _timeout_ is
@@ -2065,6 +2064,10 @@ void cleanup_crt_fd(fd_set *os_set, fd_set *crt_set)
2065
2064
  * event otherwise. If used in block form, passes the name of the
2066
2065
  * NOTIFY +event+ and the generating +pid+ into the block.
2067
2066
  *
2067
+ * Under PostgreSQL 9.0 and later, if the notification is sent with
2068
+ * the optional +payload+ string, it will be given to the block as the
2069
+ * third argument.
2070
+ *
2068
2071
  */
2069
2072
  static VALUE
2070
2073
  pgconn_wait_for_notify(int argc, VALUE *argv, VALUE self)
@@ -2075,7 +2078,7 @@ pgconn_wait_for_notify(int argc, VALUE *argv, VALUE self)
2075
2078
  int ret;
2076
2079
  struct timeval timeout;
2077
2080
  struct timeval *ptimeout = NULL;
2078
- VALUE timeout_in, relname = Qnil, be_pid = Qnil, extra = Qnil;
2081
+ VALUE timeout_in = Qnil, relname = Qnil, be_pid = Qnil, extra = Qnil;
2079
2082
  double timeout_sec;
2080
2083
  fd_set sd_rset;
2081
2084
  #ifdef _WIN32
@@ -2085,7 +2088,9 @@ pgconn_wait_for_notify(int argc, VALUE *argv, VALUE self)
2085
2088
  if ( sd < 0 )
2086
2089
  rb_bug( "PQsocket(conn): couldn't fetch the connection's socket!" );
2087
2090
 
2088
- if ( rb_scan_args(argc, argv, "01", &timeout_in) == 1 ) {
2091
+ rb_scan_args( argc, argv, "01", &timeout_in );
2092
+
2093
+ if ( RTEST(timeout_in) ) {
2089
2094
  timeout_sec = NUM2DBL( timeout_in );
2090
2095
  timeout.tv_sec = (long)timeout_sec;
2091
2096
  timeout.tv_usec = (long)( (timeout_sec - (long)timeout_sec) * 1e6 );
@@ -2120,9 +2125,13 @@ pgconn_wait_for_notify(int argc, VALUE *argv, VALUE self)
2120
2125
  }
2121
2126
 
2122
2127
  relname = rb_tainted_str_new2( notification->relname );
2128
+ ASSOCIATE_INDEX( relname, self );
2123
2129
  be_pid = INT2NUM( notification->be_pid );
2124
2130
  #ifdef HAVE_ST_NOTIFY_EXTRA
2125
- extra = rb_str_new2( notification->extra );
2131
+ if ( *notification->extra ) {
2132
+ extra = rb_tainted_str_new2( notification->extra );
2133
+ ASSOCIATE_INDEX( extra, self );
2134
+ }
2126
2135
  #endif
2127
2136
  PQfreemem( notification );
2128
2137
 
@@ -2483,6 +2492,7 @@ pgconn_transaction(VALUE self)
2483
2492
  return Qnil;
2484
2493
  }
2485
2494
 
2495
+
2486
2496
  /*
2487
2497
  * call-seq:
2488
2498
  * PGconn.quote_ident( str ) -> String
@@ -2532,6 +2542,8 @@ pgconn_s_quote_ident(VALUE self, VALUE in_str)
2532
2542
  }
2533
2543
 
2534
2544
 
2545
+ #ifndef _WIN32
2546
+
2535
2547
  /*
2536
2548
  * call-seq:
2537
2549
  * conn.block( [ timeout ] ) -> Boolean
@@ -2547,27 +2559,152 @@ pgconn_s_quote_ident(VALUE self, VALUE in_str)
2547
2559
  */
2548
2560
  static VALUE
2549
2561
  pgconn_block( int argc, VALUE *argv, VALUE self ) {
2550
- PGconn *conn = get_pgconn(self);
2551
- int sd = PQsocket(conn);
2562
+ PGconn *conn = get_pgconn( self );
2563
+ int sd = PQsocket( conn );
2552
2564
  int ret;
2565
+
2566
+ /* If WIN32 and Ruby 1.9 do not use rb_thread_select() which sometimes hangs
2567
+ * and does not wait (nor sleep) any time even if timeout is given.
2568
+ * Instead use the Winsock events and rb_w32_wait_events(). */
2569
+
2553
2570
  struct timeval timeout;
2554
2571
  struct timeval *ptimeout = NULL;
2572
+ fd_set sd_rset;
2573
+ VALUE timeout_in;
2574
+ double timeout_sec;
2575
+
2576
+ if ( rb_scan_args(argc, argv, "01", &timeout_in) == 1 ) {
2577
+ timeout_sec = NUM2DBL( timeout_in );
2578
+ timeout.tv_sec = (long)timeout_sec;
2579
+ timeout.tv_usec = (long)((timeout_sec - (long)timeout_sec) * 1e6);
2580
+ ptimeout = &timeout;
2581
+ }
2582
+
2583
+ /* Check for connection errors (PQisBusy is true on connection errors) */
2584
+ if ( PQconsumeInput(conn) == 0 )
2585
+ rb_raise( rb_ePGError, PQerrorMessage(conn) );
2586
+
2587
+ while ( PQisBusy(conn) ) {
2588
+ FD_ZERO( &sd_rset );
2589
+ FD_SET( sd, &sd_rset );
2590
+
2591
+ if ( (ret = rb_thread_select( sd+1, &sd_rset, NULL, NULL, ptimeout )) < 0 )
2592
+ rb_sys_fail( "rb_thread_select()" ); /* Raises */
2593
+
2594
+ /* Return false if there was a timeout argument and the select() timed out */
2595
+ if ( ret == 0 && argc )
2596
+ return Qfalse;
2597
+
2598
+ /* Check for connection errors (PQisBusy is true on connection errors) */
2599
+ if ( PQconsumeInput(conn) == 0 )
2600
+ rb_raise( rb_ePGError, PQerrorMessage(conn) );
2601
+ }
2602
+
2603
+ return Qtrue;
2604
+ }
2605
+
2606
+
2607
+ #else /* _WIN32 */
2608
+
2609
+ /*
2610
+ * Win32 PGconn#block -- on Windows, use platform-specific strategies to wait for the socket
2611
+ * instead of rb_thread_select().
2612
+ */
2613
+
2614
+ /* Win32 + Ruby 1.9+ */
2615
+ #ifdef HAVE_RUBY_VM_H
2616
+
2617
+ int rb_w32_wait_events( HANDLE *events, int num, DWORD timeout );
2618
+
2619
+ /* If WIN32 and Ruby 1.9 do not use rb_thread_select() which sometimes hangs
2620
+ * and does not wait (nor sleep) any time even if timeout is given.
2621
+ * Instead use the Winsock events and rb_w32_wait_events(). */
2622
+
2623
+ static VALUE
2624
+ pgconn_block( int argc, VALUE *argv, VALUE self ) {
2625
+ PGconn *conn = get_pgconn( self );
2626
+ int sd = PQsocket( conn );
2627
+ int ret;
2628
+
2629
+ DWORD timeout_milisec = INFINITY;
2630
+ DWORD wait_ret;
2631
+ WSAEVENT hEvent;
2555
2632
  VALUE timeout_in;
2556
2633
  double timeout_sec;
2634
+
2635
+ hEvent = WSACreateEvent();
2636
+
2637
+ if ( rb_scan_args(argc, argv, "01", &timeout_in) == 1 ) {
2638
+ timeout_sec = NUM2DBL( timeout_in );
2639
+ timeout_milisec = (DWORD)( (timeout_sec - (DWORD)timeout_sec) * 1e3 );
2640
+ }
2641
+
2642
+ /* Check for connection errors (PQisBusy is true on connection errors) */
2643
+ if( PQconsumeInput(conn) == 0 ) {
2644
+ WSACloseEvent( hEvent );
2645
+ rb_raise( rb_ePGError, PQerrorMessage(conn) );
2646
+ }
2647
+
2648
+ while ( PQisBusy(conn) ) {
2649
+ if ( WSAEventSelect(sd, hEvent, FD_READ|FD_CLOSE) == SOCKET_ERROR ) {
2650
+ WSACloseEvent( hEvent );
2651
+ rb_raise( rb_ePGError, "WSAEventSelect socket error: %d", WSAGetLastError() );
2652
+ }
2653
+
2654
+ wait_ret = rb_w32_wait_events( &hEvent, 1, 100 );
2655
+
2656
+ if ( wait_ret == WAIT_TIMEOUT ) {
2657
+ ret = 0;
2658
+ } else if ( wait_ret == WAIT_OBJECT_0 ) {
2659
+ ret = 1;
2660
+ } else if ( wait_ret == WAIT_FAILED ) {
2661
+ WSACloseEvent( hEvent );
2662
+ rb_raise( rb_ePGError, "Wait on socket error (WaitForMultipleObjects): %d", GetLastError() );
2663
+ } else {
2664
+ WSACloseEvent( hEvent );
2665
+ rb_raise( rb_ePGError, "Wait on socket abandoned (WaitForMultipleObjects)" );
2666
+ }
2667
+
2668
+ /* Return false if there was a timeout argument and the select() timed out */
2669
+ if ( ret == 0 && argc ) {
2670
+ WSACloseEvent( hEvent );
2671
+ return Qfalse;
2672
+ }
2673
+
2674
+ /* Check for connection errors (PQisBusy is true on connection errors) */
2675
+ if ( PQconsumeInput(conn) == 0 ) {
2676
+ WSACloseEvent( hEvent );
2677
+ rb_raise( rb_ePGError, PQerrorMessage(conn) );
2678
+ }
2679
+ }
2680
+
2681
+ WSACloseEvent( hEvent );
2682
+
2683
+ return Qtrue;
2684
+ }
2685
+
2686
+ #else /* Win32 + Ruby < 1.9 */
2687
+
2688
+ static VALUE
2689
+ pgconn_block( int argc, VALUE *argv, VALUE self ) {
2690
+ PGconn *conn = get_pgconn( self );
2691
+ int sd = PQsocket( conn );
2692
+ int ret;
2693
+
2694
+ struct timeval timeout;
2695
+ struct timeval *ptimeout = NULL;
2557
2696
  fd_set sd_rset;
2558
- #ifdef _WIN32
2559
2697
  fd_set crt_sd_rset;
2560
- #endif
2698
+ VALUE timeout_in;
2699
+ double timeout_sec;
2561
2700
 
2562
- /* Always set a timeout in WIN32, as rb_thread_select() sometimes
2701
+ /* Always set a timeout, as rb_thread_select() sometimes
2563
2702
  * doesn't return when a second ruby thread is running although data
2564
2703
  * could be read. So we use timeout-based polling instead.
2565
2704
  */
2566
- #if defined(_WIN32)
2567
2705
  timeout.tv_sec = 0;
2568
- timeout.tv_usec = 10000;
2706
+ timeout.tv_usec = 10000; // 10ms
2569
2707
  ptimeout = &timeout;
2570
- #endif
2571
2708
 
2572
2709
  if ( rb_scan_args(argc, argv, "01", &timeout_in) == 1 ) {
2573
2710
  timeout_sec = NUM2DBL( timeout_in );
@@ -2576,32 +2713,33 @@ pgconn_block( int argc, VALUE *argv, VALUE self ) {
2576
2713
  ptimeout = &timeout;
2577
2714
  }
2578
2715
 
2579
- PQconsumeInput( conn );
2716
+ /* Check for connection errors (PQisBusy is true on connection errors) */
2717
+ if( PQconsumeInput(conn) == 0 )
2718
+ rb_raise( rb_ePGError, PQerrorMessage(conn) );
2580
2719
 
2581
2720
  while ( PQisBusy(conn) ) {
2582
2721
  FD_ZERO( &sd_rset );
2583
2722
  FD_SET( sd, &sd_rset );
2584
2723
 
2585
- #ifdef _WIN32
2586
- create_crt_fd(&sd_rset, &crt_sd_rset);
2587
- #endif
2588
-
2589
- ret = rb_thread_select (sd+1, &sd_rset, NULL, NULL, ptimeout );
2590
-
2591
- #ifdef _WIN32
2592
- cleanup_crt_fd(&sd_rset, &crt_sd_rset);
2593
- #endif
2724
+ create_crt_fd( &sd_rset, &crt_sd_rset );
2725
+ ret = rb_thread_select( sd+1, &sd_rset, NULL, NULL, ptimeout );
2726
+ cleanup_crt_fd( &sd_rset, &crt_sd_rset );
2594
2727
 
2595
2728
  /* Return false if there was a timeout argument and the select() timed out */
2596
- if ( ret == 0 && argc )
2729
+ if ( ret == 0 && argc )
2597
2730
  return Qfalse;
2598
2731
 
2599
- PQconsumeInput( conn );
2600
- }
2732
+ /* Check for connection errors (PQisBusy is true on connection errors) */
2733
+ if ( PQconsumeInput(conn) == 0 )
2734
+ rb_raise( rb_ePGError, PQerrorMessage(conn) );
2735
+ }
2601
2736
 
2602
2737
  return Qtrue;
2603
2738
  }
2604
2739
 
2740
+ #endif /* Ruby 1.9 */
2741
+ #endif /* Win32 */
2742
+
2605
2743
 
2606
2744
  /*
2607
2745
  * call-seq:
@@ -2663,6 +2801,7 @@ pgconn_async_exec(int argc, VALUE *argv, VALUE self)
2663
2801
  VALUE rb_pgresult = Qnil;
2664
2802
 
2665
2803
  /* remove any remaining results from the queue */
2804
+ pgconn_block( 0, NULL, self ); /* wait for input (without blocking) before reading the last result */
2666
2805
  pgconn_get_last_result( self );
2667
2806
 
2668
2807
  pgconn_send_query( argc, argv, self );
@@ -3068,10 +3207,10 @@ pgresult_result_error_message(VALUE self)
3068
3207
  static VALUE
3069
3208
  pgresult_result_error_field(VALUE self, VALUE field)
3070
3209
  {
3071
- PGresult *result = get_pgresult(self);
3072
- int fieldcode = NUM2INT(field);
3073
- VALUE ret = rb_tainted_str_new2(PQresultErrorField(result,fieldcode));
3074
- ASSOCIATE_INDEX(ret, self);
3210
+ PGresult *result = get_pgresult( self );
3211
+ int fieldcode = NUM2INT( field );
3212
+ VALUE ret = rb_tainted_str_new2( PQresultErrorField(result, fieldcode) );
3213
+ ASSOCIATE_INDEX( ret, self );
3075
3214
  return ret;
3076
3215
  }
3077
3216
 
@@ -4004,7 +4143,6 @@ Init_pg_ext()
4004
4143
  rb_define_singleton_method(rb_cPGconn, "quote_ident", pgconn_s_quote_ident, 1);
4005
4144
  rb_define_singleton_method(rb_cPGconn, "connect_start", pgconn_s_connect_start, -1);
4006
4145
  rb_define_singleton_method(rb_cPGconn, "conndefaults", pgconn_s_conndefaults, 0);
4007
-
4008
4146
 
4009
4147
  /****** PGconn CLASS CONSTANTS: Connection Status ******/
4010
4148
 
@@ -0,0 +1,26 @@
1
+ 
2
+ Microsoft Visual Studio Solution File, Format Version 10.00
3
+ # Visual Studio 2008
4
+ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pg", "pg_18\pg.vcproj", "{9A8BF0C8-1D75-4DC0-8D84-BAEFD693795E}"
5
+ EndProject
6
+ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pg_19", "pg_19\pg_19.vcproj", "{2EE30C74-074F-4611-B39B-38D5F3C9B071}"
7
+ EndProject
8
+ Global
9
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
10
+ Debug|Win32 = Debug|Win32
11
+ Release|Win32 = Release|Win32
12
+ EndGlobalSection
13
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
14
+ {9A8BF0C8-1D75-4DC0-8D84-BAEFD693795E}.Debug|Win32.ActiveCfg = Debug|Win32
15
+ {9A8BF0C8-1D75-4DC0-8D84-BAEFD693795E}.Debug|Win32.Build.0 = Debug|Win32
16
+ {9A8BF0C8-1D75-4DC0-8D84-BAEFD693795E}.Release|Win32.ActiveCfg = Release|Win32
17
+ {9A8BF0C8-1D75-4DC0-8D84-BAEFD693795E}.Release|Win32.Build.0 = Release|Win32
18
+ {2EE30C74-074F-4611-B39B-38D5F3C9B071}.Debug|Win32.ActiveCfg = Debug|Win32
19
+ {2EE30C74-074F-4611-B39B-38D5F3C9B071}.Debug|Win32.Build.0 = Debug|Win32
20
+ {2EE30C74-074F-4611-B39B-38D5F3C9B071}.Release|Win32.ActiveCfg = Release|Win32
21
+ {2EE30C74-074F-4611-B39B-38D5F3C9B071}.Release|Win32.Build.0 = Release|Win32
22
+ EndGlobalSection
23
+ GlobalSection(SolutionProperties) = preSolution
24
+ HideSolutionNode = FALSE
25
+ EndGlobalSection
26
+ EndGlobal
@@ -0,0 +1,216 @@
1
+ <?xml version="1.0" encoding="Windows-1252"?>
2
+ <VisualStudioProject
3
+ ProjectType="Visual C++"
4
+ Version="9.00"
5
+ Name="pg"
6
+ ProjectGUID="{9A8BF0C8-1D75-4DC0-8D84-BAEFD693795E}"
7
+ RootNamespace="pg"
8
+ Keyword="Win32Proj"
9
+ TargetFrameworkVersion="196613"
10
+ >
11
+ <Platforms>
12
+ <Platform
13
+ Name="Win32"
14
+ />
15
+ </Platforms>
16
+ <ToolFiles>
17
+ </ToolFiles>
18
+ <Configurations>
19
+ <Configuration
20
+ Name="Debug|Win32"
21
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
22
+ IntermediateDirectory="$(ConfigurationName)"
23
+ ConfigurationType="2"
24
+ CharacterSet="1"
25
+ >
26
+ <Tool
27
+ Name="VCPreBuildEventTool"
28
+ />
29
+ <Tool
30
+ Name="VCCustomBuildTool"
31
+ />
32
+ <Tool
33
+ Name="VCXMLDataGeneratorTool"
34
+ />
35
+ <Tool
36
+ Name="VCWebServiceProxyGeneratorTool"
37
+ />
38
+ <Tool
39
+ Name="VCMIDLTool"
40
+ />
41
+ <Tool
42
+ Name="VCCLCompilerTool"
43
+ Optimization="0"
44
+ AdditionalIncludeDirectories="&quot;C:\Development\ruby\lib\ruby\1.8\i386-mswin32&quot;;C:\Development\msys\local\include"
45
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PG_EXPORTS;HAVE_LIBPQ_FE_H;HAVE_LIBPQ_LIBPQ_FS_H;HAVE_PQCONNECTIONUSEDPASSWORD;HAVE_PQISTHREADSAFE;HAVE_LO_CREATE;HAVE_PQPREPARE;HAVE_PQEXECPARAMS;HAVE_PQESCAPESTRING;HAVE_PQESCAPESTRINGCONN;HAVE_PG_ENCODING_TO_CHAR;HAVE_PQSETCLIENTENCODING"
46
+ MinimalRebuild="true"
47
+ BasicRuntimeChecks="3"
48
+ RuntimeLibrary="3"
49
+ UsePrecompiledHeader="0"
50
+ WarningLevel="3"
51
+ DebugInformationFormat="4"
52
+ DisableSpecificWarnings="4996"
53
+ />
54
+ <Tool
55
+ Name="VCManagedResourceCompilerTool"
56
+ />
57
+ <Tool
58
+ Name="VCResourceCompilerTool"
59
+ />
60
+ <Tool
61
+ Name="VCPreLinkEventTool"
62
+ />
63
+ <Tool
64
+ Name="VCLinkerTool"
65
+ AdditionalDependencies="libpq.lib msvcrt-ruby18.lib"
66
+ OutputFile="C:\Development\ruby\lib\ruby\gems\1.8\gems\pg-0.7.9.2009.03.14-x86-mswin32-60\lib\$(ProjectName).so"
67
+ LinkIncremental="2"
68
+ AdditionalLibraryDirectories="C:\Development\ruby\lib;C:\Development\msys\local\lib"
69
+ GenerateDebugInformation="true"
70
+ SubSystem="2"
71
+ TargetMachine="1"
72
+ />
73
+ <Tool
74
+ Name="VCALinkTool"
75
+ />
76
+ <Tool
77
+ Name="VCManifestTool"
78
+ />
79
+ <Tool
80
+ Name="VCXDCMakeTool"
81
+ />
82
+ <Tool
83
+ Name="VCBscMakeTool"
84
+ />
85
+ <Tool
86
+ Name="VCFxCopTool"
87
+ />
88
+ <Tool
89
+ Name="VCAppVerifierTool"
90
+ />
91
+ <Tool
92
+ Name="VCPostBuildEventTool"
93
+ />
94
+ </Configuration>
95
+ <Configuration
96
+ Name="Release|Win32"
97
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
98
+ IntermediateDirectory="$(ConfigurationName)"
99
+ ConfigurationType="2"
100
+ CharacterSet="1"
101
+ WholeProgramOptimization="1"
102
+ >
103
+ <Tool
104
+ Name="VCPreBuildEventTool"
105
+ />
106
+ <Tool
107
+ Name="VCCustomBuildTool"
108
+ />
109
+ <Tool
110
+ Name="VCXMLDataGeneratorTool"
111
+ />
112
+ <Tool
113
+ Name="VCWebServiceProxyGeneratorTool"
114
+ />
115
+ <Tool
116
+ Name="VCMIDLTool"
117
+ />
118
+ <Tool
119
+ Name="VCCLCompilerTool"
120
+ Optimization="2"
121
+ EnableIntrinsicFunctions="true"
122
+ AdditionalIncludeDirectories="C:\Development\msys\local\include;&quot;C:\Development\ruby\lib\ruby\1.8\i386-mswin32_90&quot;"
123
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PG_EXPORTS"
124
+ RuntimeLibrary="2"
125
+ EnableFunctionLevelLinking="true"
126
+ UsePrecompiledHeader="2"
127
+ WarningLevel="3"
128
+ DebugInformationFormat="3"
129
+ />
130
+ <Tool
131
+ Name="VCManagedResourceCompilerTool"
132
+ />
133
+ <Tool
134
+ Name="VCResourceCompilerTool"
135
+ />
136
+ <Tool
137
+ Name="VCPreLinkEventTool"
138
+ />
139
+ <Tool
140
+ Name="VCLinkerTool"
141
+ OutputFile="$(OutDir)\$(ProjectName).so"
142
+ LinkIncremental="1"
143
+ GenerateDebugInformation="true"
144
+ SubSystem="2"
145
+ OptimizeReferences="2"
146
+ EnableCOMDATFolding="2"
147
+ TargetMachine="1"
148
+ />
149
+ <Tool
150
+ Name="VCALinkTool"
151
+ />
152
+ <Tool
153
+ Name="VCManifestTool"
154
+ />
155
+ <Tool
156
+ Name="VCXDCMakeTool"
157
+ />
158
+ <Tool
159
+ Name="VCBscMakeTool"
160
+ />
161
+ <Tool
162
+ Name="VCFxCopTool"
163
+ />
164
+ <Tool
165
+ Name="VCAppVerifierTool"
166
+ />
167
+ <Tool
168
+ Name="VCPostBuildEventTool"
169
+ />
170
+ </Configuration>
171
+ </Configurations>
172
+ <References>
173
+ </References>
174
+ <Files>
175
+ <Filter
176
+ Name="Source Files"
177
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
178
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
179
+ >
180
+ <File
181
+ RelativePath="..\..\compat.c"
182
+ >
183
+ </File>
184
+ <File
185
+ RelativePath="..\..\pg.c"
186
+ >
187
+ </File>
188
+ </Filter>
189
+ <Filter
190
+ Name="Header Files"
191
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
192
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
193
+ >
194
+ <File
195
+ RelativePath="..\..\compat.h"
196
+ >
197
+ </File>
198
+ <File
199
+ RelativePath="..\..\pg.h"
200
+ >
201
+ </File>
202
+ </Filter>
203
+ <Filter
204
+ Name="Resource Files"
205
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
206
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
207
+ >
208
+ </Filter>
209
+ <File
210
+ RelativePath=".\ReadMe.txt"
211
+ >
212
+ </File>
213
+ </Files>
214
+ <Globals>
215
+ </Globals>
216
+ </VisualStudioProject>