示例#1
0
        // call PQexec
        internal ExecStatusType Exec(byte[] stmt, out IntPtr res)
        {
            if (mConnection == IntPtr.Zero)
            {
                res = IntPtr.Zero;
                return(ExecStatusType.PGRES_FATAL_ERROR);
            }

            unsafe
            {
                fixed(byte *st = stmt)
                {
                    res = PqsqlWrapper.PQexec(mConnection, st);
                }
            }

            ExecStatusType s = ExecStatusType.PGRES_FATAL_ERROR;

            if (res != IntPtr.Zero)
            {
                s = PqsqlWrapper.PQresultStatus(res);
            }

            return(s);
        }
示例#2
0
        private static bool DiscardConnection(IntPtr conn)
        {
            if (conn == IntPtr.Zero)
            {
                return(false);
            }

            bool rollback = false;

            ConnStatusType cs = PqsqlWrapper.PQstatus(conn);

            if (cs != ConnStatusType.CONNECTION_OK)
            {
                return(false);                // connection broken
            }
            PGTransactionStatusType ts = PqsqlWrapper.PQtransactionStatus(conn);

            switch (ts)
            {
            case PGTransactionStatusType.PQTRANS_INERROR:                     /* idle, within failed transaction */
            case PGTransactionStatusType.PQTRANS_INTRANS:                     /* idle, within transaction block */
                rollback = true;
                break;

            case PGTransactionStatusType.PQTRANS_IDLE:                     /* connection idle */
                // nothing to do
                break;

            // PGTransactionStatusType.PQTRANS_ACTIVE: /* command in progress */
            // PGTransactionStatusType.PQTRANS_UNKNOWN: /* cannot determine status */
            default:
                return(false);                        // connection broken
            }

            IntPtr         res;
            ExecStatusType s = ExecStatusType.PGRES_FATAL_ERROR;

            // we need to rollback before we can discard the connection
            if (rollback)
            {
                unsafe
                {
                    fixed(byte *st = PqsqlTransaction.RollbackStatement)
                    {
                        res = PqsqlWrapper.PQexec(conn, st);

                        if (res != IntPtr.Zero)
                        {
                            s = PqsqlWrapper.PQresultStatus(res);
                            PqsqlWrapper.PQclear(res);
                        }
                    }
                }

                if (s != ExecStatusType.PGRES_COMMAND_OK)
                {
                    return(false);                    // connection broken
                }

                s = ExecStatusType.PGRES_FATAL_ERROR;
            }

            // discard connection
            unsafe
            {
                fixed(byte *st = DiscardAllStatement)
                {
                    res = PqsqlWrapper.PQexec(conn, st);

                    if (res != IntPtr.Zero)
                    {
                        s = PqsqlWrapper.PQresultStatus(res);
                        PqsqlWrapper.PQclear(res);
                    }
                }
            }

            if (s != ExecStatusType.PGRES_COMMAND_OK)
            {
                return(false);                // connection broken
            }

            return(true);            // connection successfully resetted
        }