find_or_create_by_XX

已存在的数据,执行更新,如果没有存在,则插入数据。

view:
<%=g.d f.select "#{d[:cityid]}-#{d[:device_manu]}",[["",""],["TL1","tl1"],["SNMP","snmp"]], {:selected =>d[:means] }%>

model:
def self.update_collect_means(collect_means)
collect_means.each_pair do |id,means|
update_all("id='#{id}'","means = '#{means}'")
end
end

controller:
def update_collect_means
params[:collect_means].each_pair do |id,means|
unless means.blank?
keys = id.split("-")
#collect_mean = CollectMean.new(:cityid => keys[0],:device_manu => keys[1],:means => "#{means}")
collect_mean = CollectMean.find_or_create_by_cityid_and_device_manu_and_means(:cityid => keys[0], :device_manu => keys[1],:means => "#{means}")
collect_mean.save
end
end
#CollectMean.update_collect_means(params[:collect_means])
flash[:notice] = "更新采集方式成功。"
redirect_to :action => :index
end
CREATE OR REPLACE FUNCTION "scope_fun"("in_scope_ids" _int8) RETURNS TABLE("chapter_id" numeric, "chapter_name" text, "p_id" numeric, "seq" numeric, "creator_id" numeric, "visible" numeric, "scope_id" numeric, "status_id" numeric, "update_time" timestamp, "create_time" timestamp, "is_valid" text, "mask_scope_id" numeric) AS $BODY$ BEGIN RETURN QUERY -- 字段一一映射 WITH RECURSIVE sp AS ( SELECT scope.scope_id AS root_id, scope.scope_id, scope.p_id, 1 AS deep FROM scope WHERE scope.scope_id = ANY (in_scope_ids) UNION SELECT sp.root_id, p.scope_id, p.p_id, (sp.deep + 1) AS deep FROM (scope p JOIN sp ON ((sp.p_id = p.scope_id))) ), cm AS ( SELECT sp.root_id, cap.chapter_id, cap.chapter_name, cap.p_id, cap.seq, cap.creator_id, cap.visible, cap.scope_id, cap.status_id, cap.update_time, cap.create_time, NULL :: CHARACTER VARYING AS is_valid, sp.deep FROM (sp JOIN chapter cap ON ((cap.scope_id = sp.scope_id))) UNION ALL SELECT sp.root_id, capm.chapter_id, capm.chapter_name, capm.p_id, capm.seq, capm.creator_id, capm.visible, capm.scope_id, capm.status_id, capm.update_time, capm.create_time, capm.is_valid, sp.deep FROM (sp JOIN chapter_mask capm ON ((capm.scope_id = sp.scope_id))) ), cmds AS ( SELECT cm.root_id, cm.chapter_id, cm.chapter_name, cm.p_id, cm.seq, cm.creator_id, cm.visible, cm.scope_id, cm.status_id, cm.update_time, cm.create_time, cm.is_valid, cm.deep FROM cm ORDER BY cm.deep DESC ) SELECT cmds.chapter_id :: NUMERIC, cover_v((cmds.chapter_name) :: TEXT) AS chapter_name, cover_n((cmds.p_id) :: NUMERIC) AS p_id, cover_n((cmds.seq) :: NUMERIC) AS seq, cover_n((cmds.creator_id) :: NUMERIC) AS creator_id, cover_n((cmds.visible) :: NUMERIC) AS visible, min(cmds.scope_id) :: NUMERIC AS scope_id, cover_n((cmds.status_id) :: NUMERIC) AS status_id, cover_t(cmds.update_time) AS update_time, cover_t(cmds.create_time) AS create_time, cover_v((cmds.is_valid) :: TEXT) AS is_valid, cmds.root_id :: NUMERIC AS mask_scope_id FROM cmds GROUP BY cmds.chapter_id, cmds.root_id; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000 这是我postgres的函数,修改这个函数让其能在神舟通用数据库中使用,我的神舟通用数据库是com.oscar.Driver,注意,cover_xx是我的函数
08-01
tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, 743 tBLE_ADDR_TYPE addr_type, 744 tBT_TRANSPORT transport) { 745 tBTM_SEC_DEV_REC* p_dev_rec; 746 tBTM_STATUS status; 747 log::info("Transport used {}, bd_addr={}", transport, bd_addr); 748 749 /* Other security process is in progress */ 750 if (btm_sec_cb.pairing_state != BTM_PAIR_STATE_IDLE) { 751 log::error("BTM_SecBond: already busy in state: {}", 752 tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state)); 753 //#ifdef OPLUS_BT_STACK_UNIFY 754 /* Fix pairing conflict */ 755 if (btm_sec_cb.pairing_bda == bd_addr) { 756 log::warn("same device pairing, return STARTED"); 757 return (BTM_CMD_STARTED); 758 } 759 //#endif /* OPLUS_BT_STACK_UNIFY */ 760 return (BTM_WRONG_MODE); 761 } 762 763 p_dev_rec = btm_find_or_alloc_dev(bd_addr); 764 if (p_dev_rec == NULL) { 765 log::error("No memory to allocate new p_dev_rec"); 766 return (BTM_NO_RESOURCES); 767 } 768 769 //#ifdef OPLUS_BT_STACK_UNIFY 770 /* By default, consider the peer device support SSP when initiating bond */ 771 oplus_smp_sec_bond_support_ssp_default(bd_addr, p_dev_rec); 772 //#endif /* OPLUS_BT_STACK_UNIFY */ 773 774 if (bluetooth::shim::GetController() == nullptr) { 775 log::error("controller module is not ready"); 776 return (BTM_NO_RESOURCES); 777 } 778 779 log::verbose("before update sec_flags=0x{:x}", p_dev_rec->sec_rec.sec_flags); 780 781 /* Finished if connection is active and already paired */ 782 if (((p_dev_rec->hci_handle != HCI_INVALID_HANDLE) && 783 transport == BT_TRANSPORT_BR_EDR && 784 (p_dev_rec->sec_rec.sec_flags & BTM_SEC_AUTHENTICATED)) || 785 ((p_dev_rec->ble_hci_handle != HCI_INVALID_HANDLE) && 786 transport == BT_TRANSPORT_LE && 787 (p_dev_rec->sec_rec.sec_flags & BTM_SEC_LE_AUTHENTICATED))) { 788 log::warn("BTM_SecBond -> Already Paired"); 789 return (BTM_SUCCESS); 790 } 791 792 /* Tell controller to get rid of the link key if it has one stored */ 793 if ((BTM_DeleteStoredLinkKey(&bd_addr, NULL)) != BTM_SUCCESS) { 794 log::error("Failed to delete stored link keys"); 795 return (BTM_NO_RESOURCES); 796 } 797 798 btm_sec_cb.pairing_bda = bd_addr; 799 800 btm_sec_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD; 801 802 p_dev_rec->sec_rec.security_required = BTM_SEC_OUT_AUTHENTICATE; 803 p_dev_rec->is_originator = true; 804 805 tL2C_LCB* p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, transport); 806 if (p_lcb) { 807 alarm_cancel(p_lcb->l2c_lcb_timer); 808 } 809 810 BTM_LogHistory(kBtmLogTag, bd_addr, "Bonding initiated", 811 bt_transport_text(transport)); 812 813 if (transport == BT_TRANSPORT_LE) { 814 btm_ble_init_pseudo_addr(p_dev_rec, bd_addr); 815 p_dev_rec->sec_rec.sec_flags &= ~BTM_SEC_LE_MASK; 816 817 if (SMP_Pair(bd_addr, addr_type) == SMP_STARTED) { 818 btm_sec_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; 819 p_dev_rec->sec_rec.sec_state = BTM_SEC_STATE_AUTHENTICATING; 820 btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 821 return BTM_CMD_STARTED; 822 } 823 824 btm_sec_cb.pairing_flags = 0; 825 return (BTM_NO_RESOURCES); 826 } 827 828 p_dev_rec->sec_rec.sec_flags &= 829 ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | 830 BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED); 831 832 log::verbose("after update sec_flags=0x{:x}", p_dev_rec->sec_rec.sec_flags); 833 if (!bluetooth::shim::GetController()->SupportsSimplePairing()) { 834 /* The special case when we authenticate keyboard. Set pin type to fixed */ 835 /* It would be probably better to do it from the application, but it is */ 836 /* complicated */ 837 if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == 838 BTM_COD_MAJOR_PERIPHERAL) && 839 (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) && 840 (btm_sec_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) { 841 btm_sec_cb.pin_type_changed = true; 842 btsnd_hcic_write_pin_type(HCI_PIN_TYPE_FIXED); 843 } 844 } 845 846 log::verbose("BTM_SecBond: Remote sm4: 0x{:x} HCI Handle: 0x{:04x}", 847 p_dev_rec->sm4, p_dev_rec->hci_handle); 848 849 /* If connection already exists... */ 850 if (BTM_IsAclConnectionUpAndHandleValid(bd_addr, transport)) { 851 log::debug("An ACL connection currently exists peer:{} transport:{}", 852 bd_addr, bt_transport_text(transport)); 853 btm_sec_wait_and_start_authentication(p_dev_rec); 854 855 btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); 856 857 /* Mark lcb as bonding */ 858 l2cu_update_lcb_4_bonding(bd_addr, true); 859 return (BTM_CMD_STARTED); 860 } 861 log::debug("An ACL connection does not currently exist peer:{} transport:{}", 862 bd_addr, bt_transport_text(transport)); 863 864 log::verbose("sec mode: {} sm4:x{:x}", btm_sec_cb.security_mode, 865 p_dev_rec->sm4); 866 if (!bluetooth::shim::GetController()->SupportsSimplePairing() || 867 (p_dev_rec->sm4 == BTM_SM4_KNOWN)) { 868 if (btm_sec_check_prefetch_pin(p_dev_rec)) { 869 log::debug("Class of device used to check for pin peer:{} transport:{}", 870 bd_addr, bt_transport_text(transport)); 871 return (BTM_CMD_STARTED); 872 } 873 } 874 if ((btm_sec_cb.security_mode == BTM_SEC_MODE_SP || 875 btm_sec_cb.security_mode == BTM_SEC_MODE_SC) && 876 BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { 877 /* local is 2.1 and peer is unknown */ 878 if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) { 879 #ifdef OPLUS_FEATURE_BT_HS_CONNECT 880 //lvshengyi@CONNECTIVITY.BT.Basic.ACL.1227086, 2021/03/12 881 //If the remote device uses version 2.1 or later, the RNR process will not be performed 882 if (oplus_support_acl_optimize(bd_addr)) { 883 status = btm_sec_dd_create_conn(p_dev_rec); 884 } else { 885 btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); 886 #ifdef OPLUS_FEATURE_BT_DCS 887 report_pair_do_rnr_flag(bd_addr,true); 888 #endif 889 status = BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); 890 } 891 #else /*OPLUS_FEATURE_BT_HS_CONNECT*/ 892 /* we are not accepting connection request from peer 893 * -> RNR (to learn if peer is 2.1) 894 * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 895 btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); 896 status = BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); 897 #endif /*OPLUS_FEATURE_BT_HS_CONNECT*/ 898 } else { 899 /* We are accepting connection request from peer */ 900 btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); 901 status = BTM_CMD_STARTED; 902 } 903 log::verbose("State:{} sm4: 0x{:x} sec_state:{}", 904 tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state), 905 p_dev_rec->sm4, p_dev_rec->sec_rec.sec_state); 906 } else { 907 /* both local and peer are 2.1 */ 908 //#ifdef OPLUS_BT_STACK_UNIFY 909 /* Enable authentication to avoid the peer device is before 2.1 */ 910 btm_sec_cb.security_mode_changed = true; 911 btsnd_hcic_write_auth_enable(true); 912 //#endif /* OPLUS_BT_STACK_UNIFY */ 913 status = btm_sec_dd_create_conn(p_dev_rec); 914 } 915 916 if (status != BTM_CMD_STARTED) { 917 log::error( 918 "BTM_ReadRemoteDeviceName or btm_sec_dd_create_conn error: 0x{:x}", 919 (int)status); 920 btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); 921 } 922 923 return status; 924 } 这个函数闯入的参数是(xx:xx:xx:xx:87:d9,public, BT_TRANSPORT_BR_EDR) 函数的流程会怎么走
最新发布
09-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值