Ejemplo n.º 1
0
 def testDoubleConnect(self):
     cnn = amysql.Connection()
     cnn.connect(DB_HOST, DB_PORT, DB_USER, DB_PASSWD, DB_DB)
     time.sleep(11)
     cnn.close()
     time.sleep(1)
     cnn = amysql.Connection()
     cnn.connect(DB_HOST, DB_PORT, DB_USER, DB_PASSWD, DB_DB)
Ejemplo n.º 2
0
    def testMySQLClient(self):
        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        rs = cnn.query("select 1")
        self.assertEqual([(1, )], rs.rows)
        cnn.close()
Ejemplo n.º 3
0
    def testBigInt(self):
        #Tests the behaviour of insert/select with bigint/long.

        BIGNUM = 112233445566778899

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("drop table if exists tblbigint")
        cnn.query(
            "create table tblbigint (test_id int(11) DEFAULT NULL, test_bigint bigint DEFAULT NULL, test_bigint2 bigint DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1"
        )
        cnn.query(
            "insert into tblbigint (test_id, test_bigint, test_bigint2) values (%s, "
            + str(BIGNUM) + ", %s)", (1, BIGNUM))
        cnn.query(
            u"insert into tblbigint (test_id, test_bigint, test_bigint2) values (%s, "
            + str(BIGNUM) + ", %s)", (2, BIGNUM))

        # Make sure both our inserts where correct (ie, the big number was not truncated/modified on insert)
        rs = cnn.query(
            "select test_id from tblbigint where test_bigint = test_bigint2")
        result = rs.rows
        self.assertEquals([(1, ), (2, )], result)

        # Make sure select gets the right values (ie, the big number was not truncated/modified when retrieved)
        rs = cnn.query(
            "select test_id, test_bigint, test_bigint2 from tblbigint where test_bigint = test_bigint2"
        )
        result = rs.rows
        self.assertEquals([(1, BIGNUM, BIGNUM), (2, BIGNUM, BIGNUM)], result)
        cnn.close()
Ejemplo n.º 4
0
    def testDateTime(self):
        # Tests the behaviour of insert/select with mysql/DATETIME <-> python/datetime.datetime

        d_date = datetime.datetime(2010, 02, 11, 13, 37, 42)
        d_string = "2010-02-11 13:37:42"

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("drop table if exists tbldate")
        cnn.query(
            "create table tbldate (test_id int(11) DEFAULT NULL, test_date datetime DEFAULT NULL, test_date2 datetime DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1"
        )

        cnn.query(
            "insert into tbldate (test_id, test_date, test_date2) values (%s, '"
            + d_string + "', %s)", (1, d_date))

        # Make sure our insert was correct
        rs = cnn.query(
            "select test_id from tbldate where test_date = test_date2")
        result = rs.rows
        self.assertEquals([(1, )], result)

        # Make sure select gets the right value back
        rs = cnn.query(
            "select test_id, test_date, test_date2 from tbldate where test_date = test_date2"
        )
        result = rs.rows
        self.assertEquals([(1, d_date, d_date)], result)
        cnn.close()
Ejemplo n.º 5
0
    def testMySQLDBAPI(self):

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("truncate tbltest")

        for i in range(10):
            cnn.query(
                "insert into tbltest (test_id, test_string) values (%d, 'test%d')"
                % (i, i))

        rs = cnn.query("select test_id, test_string from tbltest")

        self.assertEquals((0, 'test0'), rs.rows[0])

        #check that fetchall gets the remainder
        self.assertEquals([(1, 'test1'), (2, 'test2'), (3, 'test3'),
                           (4, 'test4'), (5, 'test5'), (6, 'test6'),
                           (7, 'test7'), (8, 'test8'), (9, 'test9')],
                          rs.rows[1:])

        #another query on the same cursor should work
        rs = cnn.query("select test_id, test_string from tbltest")

        #fetch some but not all
        self.assertEquals((0, 'test0'), rs.rows[0])
        self.assertEquals((1, 'test1'), rs.rows[1])
        self.assertEquals((2, 'test2'), rs.rows[2])

        #this should not work, cursor was closed
        cnn.close()
Ejemplo n.º 6
0
    def testSelectUnicode(self):
        s = u'r\xc3\xa4ksm\xc3\xb6rg\xc3\xa5s'

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("truncate tbltest")
        cnn.query("insert into tbltest (test_id, test_string) values (%s, %s)",
                  (1, 'piet'))
        cnn.query("insert into tbltest (test_id, test_string) values (%s, %s)",
                  (2, s))
        cnn.query(
            u"insert into tbltest (test_id, test_string) values (%s, %s)",
            (3, s))

        rs = cnn.query("select test_id, test_string from tbltest")

        result = rs.rows
        self.assertEquals([(1, u'piet'), (2, s), (3, s)], result)

        #test that we can still cleanly roundtrip a blob, (it should not be encoded if we pass
        #it as 'str' argument), eventhough we pass the qry itself as unicode
        blob = ''.join([chr(i) for i in range(256)])

        cnn.query(u"insert into tbltest (test_id, test_blob) values (%s, %s)",
                  (4, blob))
        rs = cnn.query("select test_blob from tbltest where test_id = %s",
                       (4, ))
        b2 = rs.rows[0][0]
        self.assertEquals(str, type(b2))
        self.assertEquals(256, len(b2))
        self.assertEquals(blob, b2)
        cnn.close()
Ejemplo n.º 7
0
    def testLargePackets(self):
        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)
        cnn.query("truncate tbltest")

        c = 16 * 1024

        blob = '0123456789'
        while 1:
            cnn.query(
                "insert into tbltest (test_id, test_blob) values (%d, '%s')" %
                (len(blob), blob))
            if len(blob) > (c * 2): break
            blob = blob * 2

        rs = cnn.query("select test_id, test_blob from tbltest")
        for row in rs.rows:
            self.assertEquals(row[0], len(row[1]))
            #self.assertEquals(blob[:row[0]], row[1])

        #reread, second time, oversize packet is already present
        rs = cnn.query("select test_id, test_blob from tbltest")
        for row in rs.rows:
            self.assertEquals(row[0], len(row[1]))
            self.assertEquals(blob[:row[0]], row[1])

        cnn.close()
Ejemplo n.º 8
0
    def testConnectAutoCommitOff(self):
        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, "", False)

        rs = cnn.query("select 1")

        self.assertEqual([(1, )], rs.rows)
        cnn.close()
Ejemplo n.º 9
0
    def testConnectDNSFails(self):
        cnn = amysql.Connection()

        try:
            cnn.connect("thisplaceisnowere", 31337, DB_USER, DB_PASSWD, DB_DB)
            assert False, "Expected exception"
        except (gevent.socket.error):
            pass
        cnn.close()
Ejemplo n.º 10
0
    def testConnectFails(self):
        cnn = amysql.Connection()

        try:
            cnn.connect(DB_HOST, 31337, DB_USER, DB_PASSWD, DB_DB)
            assert False, "Expected exception"
        except (gevent.socket.error):
            pass
        cnn.close()
Ejemplo n.º 11
0
 def testConnectTwice(self):
     cnn = amysql.Connection()
     cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)
     try:
         cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)
         assert False, "Expected exception"
     except (amysql.Error):
         pass
     pass
     cnn.close()
Ejemplo n.º 12
0
    def testAutoInc(self):

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("truncate tblautoincint")

        cnn.query("ALTER TABLE tblautoincint AUTO_INCREMENT = 100")
        rowcount, lastrowid = cnn.query(
            "insert into tblautoincint (test_string) values (%s)", ('piet', ))
        self.assertEqual(1, rowcount)
        self.assertEqual(100, lastrowid)
        rowcount, lastrowid = cnn.query(
            "insert into tblautoincint (test_string) values (%s)", ('piet', ))
        self.assertEqual(1, rowcount)
        self.assertEqual(101, lastrowid)

        cnn.query("ALTER TABLE tblautoincint AUTO_INCREMENT = 4294967294")
        rowcount, lastrowid = cnn.query(
            "insert into tblautoincint (test_string) values (%s)", ('piet', ))
        self.assertEqual(1, rowcount)
        self.assertEqual(4294967294, lastrowid)
        rowcount, lastrowid = cnn.query(
            "insert into tblautoincint (test_string) values (%s)", ('piet', ))
        self.assertEqual(1, rowcount)
        self.assertEqual(4294967295, lastrowid)

        cnn.query("truncate tblautoincbigint")

        cnn.query("ALTER TABLE tblautoincbigint AUTO_INCREMENT = 100")
        rowcount, lastrowid = cnn.query(
            "insert into tblautoincbigint (test_string) values (%s)",
            ('piet', ))
        self.assertEqual(1, rowcount)
        self.assertEqual(100, lastrowid)
        rowcount, lastrowid = cnn.query(
            "insert into tblautoincbigint (test_string) values (%s)",
            ('piet', ))
        self.assertEqual(1, rowcount)
        self.assertEqual(101, lastrowid)

        cnn.query(
            "ALTER TABLE tblautoincbigint AUTO_INCREMENT = 18446744073709551614"
        )
        rowcount, lastrowid = cnn.query(
            "insert into tblautoincbigint (test_string) values (%s)",
            ('piet', ))
        self.assertEqual(1, rowcount)
        self.assertEqual(18446744073709551614, lastrowid)
        #this fails on mysql, but that is a mysql problem
        #cur.execute("insert into tblautoincbigint (test_string) values (%s)", ('piet',))
        #self.assertEqual(1, cur.rowcount)
        #self.assertEqual(18446744073709551615, cur.lastrowid)

        cnn.close()
Ejemplo n.º 13
0
    def testConnectCloseQuery(self):
        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)
        self.assertEquals(True, cnn.is_connected())
        cnn.close()
        self.assertEquals(False, cnn.is_connected())

        try:
            cnn.query("SELECT 1")
            assert False, "Expected exception"
        except (RuntimeError):
            pass
        cnn.close()
Ejemplo n.º 14
0
    def testEscapeArgs(self):
        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("truncate tbltest")

        cnn.query("insert into tbltest (test_id, test_string) values (%s, %s)",
                  (1, 'piet'))
        cnn.query("insert into tbltest (test_id, test_string) values (%s, %s)",
                  (2, 'klaas'))
        cnn.query("insert into tbltest (test_id, test_string) values (%s, %s)",
                  (3, "pi'et"))

        #classic sql injection, would return all rows if no proper escaping is done
        rs = cnn.query(
            "select test_id, test_string from tbltest where test_string = %s",
            ("piet' OR 'a' = 'a", ))
        self.assertEquals([], rs.rows)  #assert no rows are found

        #but we should still be able to find the piet with the apostrophe in its name
        rs = cnn.query(
            "select test_id, test_string from tbltest where test_string = %s",
            ("pi'et", ))
        self.assertEquals([(3, "pi'et")], rs.rows)

        #also we should be able to insert and retrieve blob/string with all possible bytes transparently
        chars = ''.join([chr(i) for i in range(256)])

        cnn.query(
            "insert into tbltest (test_id, test_string, test_blob) values (%s, %s, %s)",
            (4, chars[:80], chars))
        #cnn.query("insert into tbltest (test_id, test_blob) values (%s, %s)", (4, chars))

        rs = cnn.query(
            "select test_blob, test_string from tbltest where test_id = %s",
            (4, ))
        #self.assertEquals([(chars, chars)], cur.fetchall())
        b, s = rs.rows[0]

        #test blob
        self.assertEquals(256, len(b))
        self.assertEquals(chars, b)

        self.assertEquals(80, len(s))
        self.assertEquals(chars[:80], s)

        cnn.close()
Ejemplo n.º 15
0
    def testUnique(self):
        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("drop table if exists tblunique")
        cnn.query("create table tblunique (name VARCHAR(32) UNIQUE)")

        # We insert the same character using two different encodings
        cnn.query("insert into tblunique set name=\"kaka\"")

        count = 0

        try:
            cnn.query("insert into tblunique set name=\"kaka\"")
            self.fail('expected timeout')
        except amysql.SQLError, e:
            pass
Ejemplo n.º 16
0
    def testConcurrentConnectError(self):
        connection = amysql.Connection()
        errorCount = [0]

        def query(cnn):
            try:
                cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)
            except (amysql.Error):
                errorCount[0] = errorCount[0] + 1
                return

        ch1 = gevent.spawn(query, connection)
        ch2 = gevent.spawn(query, connection)
        ch3 = gevent.spawn(query, connection)
        gevent.joinall([ch1, ch2, ch3])

        self.assertTrue(errorCount[0] > 0)
        connection.close()
Ejemplo n.º 17
0
    def testConnectTimeout(self):
        cnn = amysql.Connection()
        cnn.settimeout(1)

        start = time.clock()
        try:
            cnn.connect(DB_HOST, 31481, DB_USER, DB_PASSWD, DB_DB)
            assert False, "Expected exception"
        except (gevent.socket.error):
            elapsed = time.clock() - start

            if (elapsed > 2):
                assert False, "Timeout isn't working"

        try:
            res = cnn.query("select * from kaka")
            assert False, "Expected exception"
        except (amysql.Error):
            pass
        cnn.close()
Ejemplo n.º 18
0
    def testMySQLClient2(self):
        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("truncate tbltest")

        for i in range(10):
            self.assertEquals(
                (1, 0),
                cnn.query(
                    "insert into tbltest (test_id, test_string) values (%d, 'test%d')"
                    % (i, i)))

        rs = cnn.query("select test_id, test_string from tbltest")

        #trying to close it now would give an error, e.g. we always need to read
        #the result from the database otherwise connection would be in wrong stat

        for i, row in enumerate(rs.rows):
            self.assertEquals((i, 'test%d' % i), row)

        cnn.close()
Ejemplo n.º 19
0
    def testMySQLTimeout(self):
        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        rs = cnn.query("select sleep(2)")
        list(rs.rows)

        from gevent import Timeout

        start = time.time()
        try:

            def delay():
                cnn.query("select sleep(4)")
                self.fail('expected timeout')

            gevent.with_timeout(2, delay)
        except Timeout:
            end = time.time()
            self.assertAlmostEqual(2.0, end - start, places=1)

        cnn.close()
Ejemplo n.º 20
0
    def testCharsets(self):
        aumlaut_unicode = u"\u00e4"
        aumlaut_utf8 = "\xc3\xa4"
        aumlaut_latin1 = "\xe4"

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("drop table if exists tblutf")
        cnn.query(
            "create table tblutf (test_mode VARCHAR(32) DEFAULT NULL, test_utf VARCHAR(32) DEFAULT NULL, test_latin1 VARCHAR(32)) ENGINE=MyISAM DEFAULT CHARSET=utf8"
        )

        # We insert the same character using two different encodings
        cnn.query("set names utf8")
        cnn.query(
            "insert into tblutf (test_mode, test_utf, test_latin1) values ('utf8', _utf8'"
            + aumlaut_utf8 + "', _latin1'" + aumlaut_latin1 + "')")

        cnn.query("set names latin1")
        cnn.query(
            "insert into tblutf (test_mode, test_utf, test_latin1) values ('latin1', _utf8'"
            + aumlaut_utf8 + "', _latin1'" + aumlaut_latin1 + "')")

        # We expect the driver to always give us unicode strings back
        expected = [(u"utf8", aumlaut_unicode, aumlaut_unicode),
                    (u"latin1", aumlaut_unicode, aumlaut_unicode)]

        # Fetch and test with different charsets
        for charset in ("latin1", "utf8", "cp1250"):
            cnn.query("set names " + charset)
            rs = cnn.query(
                "select test_mode, test_utf, test_latin1 from tblutf")
            result = rs.rows
            self.assertEquals(result, expected)

        cnn.close()
Ejemplo n.º 21
0
    def testBlob(self):
        peacesign_binary = "\xe2\x98\xae"
        peacesign_binary2 = "\xe2\x98\xae" * 1024

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("drop table if exists tblblob")
        cnn.query(
            "create table tblblob (test_id int(11) DEFAULT NULL, test_blob BLOB DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8"
        )

        cnn.query("insert into tblblob (test_id, test_blob) values (%s, %s)",
                  (1, peacesign_binary))
        cnn.query("insert into tblblob (test_id, test_blob) values (%s, %s)",
                  (2, peacesign_binary2))

        rs = cnn.query("select test_id, test_blob from tblblob")
        result = rs.rows

        # We expect binary strings back
        self.assertEquals([(1, peacesign_binary), (2, peacesign_binary2)],
                          result)
        cnn.close()
Ejemplo n.º 22
0
    def testUnicodeUTF8(self):
        peacesign_unicode = u"\u262e"
        peacesign_utf8 = "\xe2\x98\xae"

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("drop table if exists tblutf")
        cnn.query(
            "create table tblutf (test_id int(11) DEFAULT NULL, test_string VARCHAR(32) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8"
        )

        cnn.query("insert into tblutf (test_id, test_string) values (%s, %s)",
                  (1, peacesign_unicode))  # This should be encoded in utf8
        cnn.query("insert into tblutf (test_id, test_string) values (%s, %s)",
                  (2, peacesign_utf8))

        rs = cnn.query("select test_id, test_string from tblutf")
        result = rs.rows

        # We expect unicode strings back
        self.assertEquals([(1, peacesign_unicode), (2, peacesign_unicode)],
                          result)
        cnn.close()
Ejemplo n.º 23
0
    def testZeroDates(self):
        # Tests the behaviour of zero dates
        zero_datetime = "0000-00-00 00:00:00"
        zero_date = "0000-00-00"

        cnn = amysql.Connection()
        cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)

        cnn.query("drop table if exists tbldate")
        cnn.query(
            "create table tbldate (test_id int(11) DEFAULT NULL, test_date date DEFAULT NULL, test_datetime datetime DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1"
        )

        cnn.query(
            "insert into tbldate (test_id, test_date, test_datetime) values (%s, %s, %s)",
            (1, zero_date, zero_datetime))

        # Make sure we get None-values back
        rs = cnn.query(
            "select test_id, test_date, test_datetime from tbldate where test_id = 1"
        )
        result = rs.rows
        self.assertEquals([(1, None, None)], result)
        cnn.close()
Ejemplo n.º 24
0
 def run(self):
     cnn = amysql.Connection()
     cnn.connect (DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)
     cnn.query("select sleep(%d)" % self.s)
     cnn.close()
Ejemplo n.º 25
0
 def testConnectClosed(self):
     cnn = amysql.Connection()
     cnn.connect(DB_HOST, 3306, DB_USER, DB_PASSWD, DB_DB)
     self.assertEquals(True, cnn.is_connected())
     cnn.close()
     self.assertEquals(False, cnn.is_connected())