Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
Changelog
=========

v0.14.2
-------
* Updated dependency to allow more recent versions of crypto and mockito.
* Removed deprecated SHA1 class in auth_handler.dart: for crypto >=1.0.0.
* Fixed code warnings.

v0.14.1
-------
* Fix the changelog formatting, so you can actually see what changed in v0.14.0
Expand Down
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,26 @@ Development
To run the examples and tests, you'll need to create a 'connection.options' file by
copying 'connection.options.example' and modifying the settings.

Note: some of the tests will modify the database specified in the
connection options file. For example, creating tables in it.

From the command line, [run the tests using
pub](https://pub.dartlang.org/packages/test#running-tests). They can
be run individually:

```sh
$ pub run test test/unit_test.dart
$ pub run test test/interleave_test.dart
$ pub run test test/integration_test.dart
```

It should be possible to run all the tests, but this currently does
not work due to how the unit tests have been written.

```sh
$ pub run test # this does not work yet
```

Licence
-------

Expand Down
2 changes: 2 additions & 0 deletions lib/sqljocky.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import 'dart:io';
import 'dart:math' as math;

import 'package:crypto/crypto.dart';
import 'package:crypto/src/digest_sink.dart';

import 'package:logging/logging.dart';

import 'constants.dart';
Expand Down
18 changes: 8 additions & 10 deletions lib/src/auth/auth_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,16 @@ class _AuthHandler extends _Handler {
if (_password == null) {
hash = <int>[];
} else {
var hasher = new SHA1();
hasher.add(UTF8.encode(_password));
var hashedPassword = hasher.close();
var hashedPassword = sha1.convert(UTF8.encode(_password)).bytes;

hasher = new SHA1();
hasher.add(hashedPassword);
var doubleHashedPassword = hasher.close();
var doubleHashedPassword = sha1.convert(hashedPassword).bytes;

hasher = new SHA1();
hasher.add(_scrambleBuffer);
hasher.add(doubleHashedPassword);
var hashedSaltedPassword = hasher.close();
var sink = new DigestSink();
var s = sha1.startChunkedConversion(sink);
s.add(_scrambleBuffer);
s.add(doubleHashedPassword);
s.close();
var hashedSaltedPassword = sink.value.bytes;

hash = new List<int>(hashedSaltedPassword.length);
for (var i = 0; i < hash.length; i++) {
Expand Down
6 changes: 3 additions & 3 deletions lib/src/auth/handshake_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,14 @@ class _HandshakeHandler extends _Handler {
serverStatus = response.readUint16();
serverCapabilities += (response.readUint16() << 0x10);

var secure = serverCapabilities & CLIENT_SECURE_CONNECTION;
var plugin = serverCapabilities & CLIENT_PLUGIN_AUTH;
// var secure = serverCapabilities & CLIENT_SECURE_CONNECTION;
// var plugin = serverCapabilities & CLIENT_PLUGIN_AUTH;

scrambleLength = response.readByte();
response.skip(10);
if (serverCapabilities & CLIENT_SECURE_CONNECTION > 0) {
var scrambleBuffer2 = response.readList(math.max(13, scrambleLength - 8) - 1);
var nullTerminator = response.readByte();
var _ = response.readByte(); // nullTerminator: value ignored
scrambleBuffer = new List<int>(scrambleBuffer1.length + scrambleBuffer2.length);
scrambleBuffer.setRange(0, 8, scrambleBuffer1);
scrambleBuffer.setRange(8, 8 + scrambleBuffer2.length, scrambleBuffer2);
Expand Down
4 changes: 4 additions & 0 deletions lib/src/buffer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,9 @@ class Buffer {
return readUint24();
case 254:
return readUint64();
default:
// MySQL specification does not define 255
throw new RangeError('length coded binary: unexpected value 255');
}
}

Expand All @@ -214,6 +217,7 @@ class Buffer {
if (value < (2 << 63)) {
return 5;
}
throw new RangeError('measureLengthCodedBinary: unexpected value');
}

/**
Expand Down
2 changes: 2 additions & 0 deletions lib/src/buffered_socket.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ class BufferedSocket {
return bufferedSocket;
} catch (e) {
onError(e);
assert(false); // should never get here: onError should throw exception
return null; // to shut up warnings
}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/src/connection.dart
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ class _Connection {
_compressedHeaderBuffer.writeUint24(encodedHeader.length + encodedBuffer.length);
_compressedHeaderBuffer.writeByte(++_compressedPacketNumber);
_compressedHeaderBuffer.writeUint24(4 + buffer.length);
_socket.writeBuffer(_compressedHeaderBuffer);
return _socket.writeBuffer(_compressedHeaderBuffer);
} else {
log.fine("sendBuffer header");
return _sendBufferPart(buffer, 0);
Expand Down
4 changes: 4 additions & 0 deletions lib/src/connection_pool.dart
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,8 @@ class ConnectionPool extends Object with _ConnectionHelpers implements Queriable
return results;
} catch (e) {
_releaseReuseThrow(cnx, e);
assert(false); // should not get here: _releaseReuseThrow throws exception
return null; // to shut up warnings
}
}

Expand Down Expand Up @@ -313,6 +315,8 @@ class ConnectionPool extends Object with _ConnectionHelpers implements Queriable
return new _TransactionImpl._(cnx, this);
} catch (e) {
_releaseReuseThrow(cnx, e);
assert(false); // should not get to here: _releaseReuseThrow should throw
return null; // to shut up warnings
}
}

Expand Down
2 changes: 2 additions & 0 deletions lib/src/handlers/parameter_packet.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
part of sqljocky;

// not using this one yet
/*
class _ParameterPacket {
int _type;
int _flags;
Expand All @@ -19,3 +20,4 @@ class _ParameterPacket {
_length = buffer.readUint32();
}
}
*/
2 changes: 2 additions & 0 deletions lib/src/handlers/quit_handler.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
part of sqljocky;

/*
class _QuitHandler extends _Handler {
_QuitHandler() {
log = new Logger("QuitHandler");
Expand All @@ -15,3 +16,4 @@ class _QuitHandler extends _Handler {
throw new MySqlProtocolError._("Shouldn't have received a response after sending a QUIT message");
}
}
*/
2 changes: 2 additions & 0 deletions lib/src/query.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ class Query extends Object with _ConnectionHelpers {
return results;
} catch (e) {
_releaseReuseThrow(preparedQuery.cnx, e);
assert(false); // should not get to here: _releaseReuseThrow always throws
return null; // to shut up warnings
}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/src/retained_connection.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ abstract class RetainedConnection extends QueriableConnection {
class _RetainedConnectionImpl extends _RetainedConnectionBase implements RetainedConnection {
_RetainedConnectionImpl._(cnx, pool) : super._(cnx, pool);

Future release() {
Future release() async {
_checkReleased();
_released = true;

Expand Down
7 changes: 3 additions & 4 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
name: sqljocky
version: 0.14.1
version: 0.14.2
author: James Ots <code@jamesots.com>
description: A MySQL connector
homepage: https://github.com/jamesots/sqljocky
environment:
sdk: '>=1.11.0 <2.0.0'
documentation: http://jamesots.github.io/sqljocky/docs
dependencies:
crypto: '>=0.9.0 <0.10.0'
crypto: '>=0.9.2 <3.0.0'
logging: '>=0.11.1 <0.12.0'
options_file: '>=0.11.0 <0.12.0'
dev_dependencies:
test: '>=0.12.3+9 <0.13.0'
mockito: '>=0.10.1 <0.11.0'
args: any
mockito: '>=0.10.1 <3.0.0'
2 changes: 1 addition & 1 deletion test/integration/errors.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ void runErrorTests(String user, String password, String db, int port, String hos
// useCompression: false,
useSSL: true);
var cnx = await pool.getConnection();
print("Connection secure: ${cnx.usingSSL}");
// print("Connection secure: ${cnx.usingSSL}");
cnx.release();
return setup(pool, "stream", "create table stream (id integer, name text)");
});
Expand Down
38 changes: 31 additions & 7 deletions test/integration/execute_multi.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
part of integrationtests;

void runExecuteMultiTests(String user, String password, String db, int port, String host) {
void runExecuteMultiTests(
String user, String password, String db, int port, String host) {
ConnectionPool pool;
group('executeMulti tests:', () {
test('setup', () {
pool = new ConnectionPool(user: user, password: password, db: db, port: port, host: host, max: 2);
return setup(pool, "stream", "create table stream (id integer, name text)",
group('executeMulti', () {
setUp(() async {
pool = new ConnectionPool(
user: user,
password: password,
db: db,
port: port,
host: host,
max: 2);
expect(pool, isNotNull);
var result = await setup(
pool,
"stream",
"create table stream (id integer, name text)",
"insert into stream (id, name) values (1, 'A'), (2, 'B'), (3, 'C')");
expect(result.affectedRows, equals(3),
reason: 'incorrect number of rows affected');
});

test('store data', () async {
test('select', () async {
var query = await pool.prepare('select * from stream where id = ?');
var values = await query.executeMulti([
[1],
Expand Down Expand Up @@ -38,11 +51,22 @@ void runExecuteMultiTests(String user, String password, String db, int port, Str

await result.first;

// TODO: library code or test needs fixing
//
// The following sometimes tries to call 'processResponse' on null
// in lib/src/results/connection.dart line 190.
//
// Or sometimes produces this error: "MySQL Client Error:
// Connection #1 cannot process a request for Instance of
// '_QueryStreamHandler' while a request is already in progress for
// Instance of '_ExecuteQueryHandler'"

await query.close();
await tran.rollback();
});

test('close connection', () {
tearDown(() {
expect(pool, isNotNull);
pool.closeConnectionsWhenNotInUse();
});
});
Expand Down
32 changes: 17 additions & 15 deletions test/integration/one.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
part of integrationtests;

void runIntTests(String user, String password, String db, int port, String host) {
var log = new Logger("integration.runIntTests");

ConnectionPool pool;
group('some tests:', () {
test('create pool', () {
Expand Down Expand Up @@ -32,9 +34,9 @@ void runIntTests(String user, String password, String db, int port, String host)
test('show tables', () async {
var c = new Completer();
var results = await pool.query("show tables");
print("tables");
log.fine("tables");
results.listen((row) {
print("table: $row");
log.fine("table: $row");
}, onDone: () {
c.complete();
});
Expand All @@ -43,8 +45,8 @@ void runIntTests(String user, String password, String db, int port, String host)

test('describe stuff', () async {
var results = await pool.query("describe test1");
print("table test1");
await showResults(results);
log.fine("table test1");
await showResults(results, log);
});

test('small blobs', () async {
Expand Down Expand Up @@ -82,7 +84,7 @@ void runIntTests(String user, String password, String db, int port, String host)
});

test('insert stuff', () async {
print("insert stuff test");
log.fine("insert stuff test");
var query = await pool.prepare("insert into test1 (atinyint, asmallint, amediumint, abigint, aint, "
"adecimal, afloat, adouble, areal, "
"aboolean, abit, aserial, "
Expand Down Expand Up @@ -136,10 +138,10 @@ void runIntTests(String user, String password, String db, int port, String host)
values.add("a");
values.add("a,b");

print("executing");
log.fine("executing");
expect(1, equals(1)); // put some real expectations here
var results = await query.execute(values);
print("updated ${results.affectedRows} ${results.insertId}");
log.fine("updated ${results.affectedRows} ${results.insertId}");
expect(results.affectedRows, equals(1));
});

Expand Down Expand Up @@ -178,19 +180,19 @@ void runIntTests(String user, String password, String db, int port, String host)

test('data types (prepared)', () async {
var results = await pool.prepareExecute('select * from test1', []);
print("----------- prepared results ---------------");
log.fine("----------- prepared results ---------------");
preparedFields = results.fields;
var list = await results.toList();
values = list[0];
for (var i = 0; i < results.fields.length; i++) {
var field = results.fields[i];
print("${field.name} ${fieldTypeToString(field.type)} ${typeof(values[i])}");
log.fine("${field.name} ${fieldTypeToString(field.type)} ${typeof(values[i])}");
}
});

test('data types (query)', () async {
var results = await pool.query('select * from test1');
print("----------- query results ---------------");
log.fine("----------- query results ---------------");
var list = await results.toList();
var row = list[0];
for (var i = 0; i < results.fields.length; i++) {
Expand All @@ -207,7 +209,7 @@ void runIntTests(String user, String password, String db, int port, String host)
} else {
expect(row[i], equals(values[i]));
}
print("${field.name} ${fieldTypeToString(field.type)} ${typeof(row[i])}");
log.fine("${field.name} ${fieldTypeToString(field.type)} ${typeof(row[i])}");
}
});

Expand All @@ -221,7 +223,7 @@ void runIntTests(String user, String password, String db, int port, String host)
}
var resultList = await query.executeMulti(params);
var end = new DateTime.now();
print(end.difference(start));
log.fine(end.difference(start));
expect(resultList.length, equals(50));
await trans.commit();
});
Expand Down Expand Up @@ -264,15 +266,15 @@ void runIntTests(String user, String password, String db, int port, String host)
});
}

Future showResults(Results results) {
Future showResults(Results results, Logger log) {
var c = new Completer();
var fieldNames = <String>[];
for (var field in results.fields) {
fieldNames.add("${field.name}:${field.type}");
}
print(fieldNames);
log.fine(fieldNames);
results.listen((row) {
print(row);
log.fine(row);
}, onDone: () {
c.complete(null);
});
Expand Down
Loading