gikoha’s blog

個人的メモがわり

Swift to oracle access

local:

宛名はoracleに保存した宛名データからcsvを経由してsqliteにコンバート可能、Core Dataのsqliteに直接変換できた (TablePlusを使った)

Core DataではSwiftUIを使うと一覧表示が簡単に作れた

こんなかんじのソース

struct MultiSelectRow : View {
    var atena: Atena
    @Binding var selectedItems: Set<ObjectIdentifier>
    
    var isSelected: Bool {
        selectedItems.contains(atena.id)
    }
    
    private func uketori(bit:Character) -> String {
        let bb : Int = Int(String(bit))!
        var v = ""
        if (bb & 1) != 0 {
            v +=  "受"
        }
        if (bb & 2) != 0 {
            v +=  "喪"
        }
        if (bb & 4) != 0 {
            v +=  "送"
        }
        if (bb & 8) != 0 {
            v +=  "喪"
        }
        return v
    }
    
    var body: some View {
        let item2: String = self.atena.lastName ?? ""
        let item3:String = self.atena.firstName ?? ""
        let item4:String = self.atena.addressCode ?? ""
        let item5:String = self.atena.fullAddress ?? ""

        let item6:String = self.atena.nyCard ?? ""

        let cIndex = item6.index(item6.endIndex, offsetBy: -8)
        let c = item6[cIndex]  // "c"
        let item7:String = uketori(bit: c)

        if self.isSelected {
            ZStack(alignment: .topLeading) {
                Color.red.ignoresSafeArea()
                HStack {
                    Text("\(item2) \(item3) \(item4) \(item5) \(item7)")
                }
            }
            .onTapGesture {
                self.selectedItems.remove(self.atena.id)
            }
        }
        else {
            ZStack(alignment: .topLeading) {
                Color.white.ignoresSafeArea()
                HStack {

                Text("\(item2) \(item3) \(item4) \(item5) \(item7)")
                }
            }
            .onTapGesture {
                self.selectedItems.insert(self.atena.id)
            }
        }
    }
}
struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @State var selectedRows = Set<ObjectIdentifier>()

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Atena.furiLastName,
                                           ascending: true)],
        animation: .default)
    private var items: FetchedResults<Atena>

    var body: some View {
        List {
            ForEach(items) { item in
                MultiSelectRow(atena: item, selectedItems: self.$selectedRows)
            }
            .onDelete(perform: deleteItems)
        }
        .toolbar {
            #if os(iOS)
            EditButton()
            #endif

            Button(action: addItem) {
                Label("Add Item", systemImage: "plus")
            }
        }
    }

network:

SwiftOracleAutonomousを使うと ocilib を経由して oracle access可能

Swift Package Managerに対応していないため直接プロジェクトに追加

ocilibのビルド方法

chmod +x 755 config/install-sh
./configure --with-oracle-headers-path=$PKG_CONFIG_PATH/sdk/include --with-oracle-lib-path=$PKG_CONFIG_PATH --disable-dependency-tracking
make
sudo make install

macOS appはコマンドラインツールとは違って、ディフォルトで環境変数を持っていないため、ocilibで使っているTNS_ADMINの取得に必ず失敗してしまう かといって

Macでの環境変数(environment variables)の設定方法 - Qiita

みたいな方法をとるわけにもいかない

 

しかたないのでアプリ内で setenv で直接環境変数を書き換える

 

        setenv("TNS_ADMIN", "/opt/oracle/network/admin", 1)
        setenv("NLS_LANG", "JAPANESE_JAPAN.AL32UTF8", 1)
        setenv("ORACLE_HOME", "/opt/oracle", 1)

        let b = Connection(connectString: "XXXXdb_tp", user:"admin", pwd: "passtoADW")
        try! b.open()
        let cursor = try! b.cursor()
        try! cursor.execute("select lastname from atena")
        var results = [String]()
        for r in cursor
        {
            results.append(r["LASTNAME"]!.string)
        }
        values = results

 GUI作るのでなければやっぱり Go が一番楽だな..