novi / mysql-swift

A type safe MySQL client for Swift
MIT License
163 stars 40 forks source link

segmentation fault #40

Closed rb-de0 closed 8 years ago

rb-de0 commented 8 years ago

環境

OS : Ubuntu 14.04 DB : 10.0.27-MariaDB-1~trusty コンパイラ : swift 3.0 release mysql-swift : 0.5.0

サンプル

struct Article: QueryRowResultType{
    var id: Int
    var title: String
    var content: String
    var isPublished: Bool
    var createdAt: SQLDate

    static func decodeRow(r: QueryRowResult) throws -> Article {
        return try Article(
            id: r <| "id",
            title: r <| "title",
            content: r <| "content",
            isPublished: r <| "is_published",
            createdAt: r <| "created_at"
        )
    }
}

class ArticleAccessor{
    class func loadPage(page: Int) -> [Article]{
        do{
            let articles: [Article] = try DB.connectionPool().execute { conn in
                try conn.query("SELECT * FROM articles LIMIT ?, ?", [10 * page, 10])
            }

            return articles
        }catch{
            return []
        }
    }
}

class DB{
    struct DataBaseOption: ConnectionOption{
        let host: String
        let port: Int
        let user: String
        let password: String
        let database: String
    }

    private static let options = DataBaseOption(host: "localhost", port: 3306, user: "root", password: "root", database: "hoge")

    class func connectionPool() -> ConnectionPool{
        return ConnectionPool(options: options)
    }
}

DB構成

+--------------+----------------+------+-----+-------------------+----------------+
| Field        | Type           | Null | Key | Default           | Extra          |
+--------------+----------------+------+-----+-------------------+----------------+
| id           | int(11)        | NO   | PRI | NULL              | auto_increment |
| title        | varchar(100)   | YES  |     | NULL              |                |
| content      | varchar(10000) | YES  |     | NULL              |                |
| is_published | tinyint(1)     | NO   |     | NULL              |                |
| created_at   | timestamp      | NO   |     | CURRENT_TIMESTAMP |                |
+--------------+----------------+------+-----+-------------------+----------------+

上記のようなコードをコンパイルし実行すると「segmentation fault」でアプリが落ちてしまいます。 試しにSQLDateプロパティを除いてコンパイル&実行すると正常に動作します。また、OSX(10.11.5)のMySQL 5.7.12で同じ構成をとるとSQLDateプロパティが含まれている状態でも正常に動作するようです。

mysql-swift 0.2.7を使用していた時は問題なかったようなのですが、こちら何か原因がわかりますでしょうか。

novi commented 8 years ago

報告ありがとうございます。 mysql-swift 0.5.0でFoundationのDateを使うように変更したのでそのためかもしれません。 3.0 Releaseだともしかするとその辺にまだバグがあるかもしれません。 現時点での最新のSnapshotで試してもらえますか? または Swift 3.0.1 Preview 1 など

rb-de0 commented 8 years ago

Swift 3.0.1 Preview 1 で 検証してみましたが結果は同じでした。 こちらの環境に問題があるかもしれないのでもう少し調べてみます。

rb-de0 commented 8 years ago

https://bugs.swift.org/browse/SR-2485 このバグと同じかもしれません。Date.swiftのCustomStringConvertibleでDate型のdescriptionにアクセスしているところで落ちているっぽいです。試しにてきとうな文字列を返却したところクラッシュしませんでした。

return String(describing: date())

としてもsegmentation faultになりますね。Linux版のFoundation怪しいですね・・・。

novi commented 8 years ago

報告ありがとうございます。Foundation.Date().descriptionに現状バグがあるようですね。別のプロジェクトもDate周りがおかしいという状況がありました。修正されるまではDate関係のオブジェクトに対してはdescriptionを使わないようにしていただくのがいいかと思います。

rb-de0 commented 8 years ago

確認ありがとうございます。こちらのライブラリには特に問題はないようなので一旦クローズします。