var DB *gorm.DB

时间: 2024-11-09 17:22:27 浏览: 25
`var DB *gorm.DB` 这段代码是用 Gorm,一个 Go 语言的 ORM (Object-Relational Mapping) 框架写的。它声明了一个名为 `DB` 的变量,并将其类型设置为 `*gorm.DB`,这意味着 `DB` 是一个指向 gorm 中 `gorm.DB` 结构体的指针。 `gorm.DB` 是 Gorm 中用于操作数据库的基本对象,通常在初始化应用程序时连接到数据库,然后可以用来执行查询、插入、更新和删除等数据库操作。通过这种方式,你可以以一种更面向对象的方式操作数据库,而不是直接编写 SQL 语句。 例如,你可以这样做: ```go // 初始化数据库连接 db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local") if err != nil { panic("failed to connect database") } DB = &db // 执行查询 rows := DB.Where("condition").Find(&models.MyModel{}) ```
相关问题

golang 不通过传参的方式,如何在controller的ThreeSence.go 使用main函数中的var db *gorm.DB

在Go语言中,可以使用全局变量的方式来访问main函数中定义的变量。可以在main函数中定义一个全局变量,然后在其他文件中通过引用该变量来访问。 假设在main函数中定义了一个名为db的全局变量: ``` var db *gorm.DB ``` 在ThreeSence.go文件中,可以通过导入main包来访问该全局变量。代码如下: ``` package controller import "your_project_path/main" func someFunc() { // 使用全局变量db main.db.DoSomething() } ``` 这样就可以在ThreeSence.go文件中访问并使用main函数中定义的db变量了。需要注意的是,使用全局变量可能会带来一些潜在的问题,如线程安全等。因此,请确保在多个地方使用同一个全局变量时,需要进行同步和保护。

type Virtual struct { Ts *gorm.DB } // VirtualWarehouseAdd 入库 func (vir *Virtual) VirtualWarehouseAdd(info *VirtualWarehouseInfo) error { var Vir VirtualWarehouse utils.Error(vir.Ts.Table("virtual_warehouse"). Select("total_num, ver, virid, bid, cid, shop_id, prodict_id, cbecskuid"). Scan(&Vir).Error) if Vir.Virid == info.Virid && Vir.Bid == info.Bid && Vir.Cid == info.Cid && Vir.Cbecskuid == info.Cbecskuid && Vir.ShopId == info.ShopId { utils.Error(vir.Ts.Table("virtual_warehouse"). Where("ver = ?", Vir.Ver). Updates(map[string]interface{}{ "ver": gorm.Expr("ver + ?", 1), "total_num": gorm.Expr("total_num + ?", info.Num), }).Error) InfoAdd(info, "1") } else if info.Virid > 0 && info.Bid > 0 && info.Cid != "" && info.Cbecskuid != "" && info.ShopId > 0 { InfoAdd(info, "1") f := model.TbVirtualWarehouse{ WarehouseStatus: model.Delete, Status: model.Normal, Ctime: time.Now().Unix(), Ver: 0, } utils.Error(vir.Ts.Table(model.TbSystemNotice{}.TableName()).Create(&f).Error) } else { return errors.New("参数错误") } return nil } // VirtualWarehouseDel 出库 func (vir *Virtual) VirtualWarehouseDel(info *VirtualWarehouseInfo) error { var Vir VirtualWarehouse utils.Error(vir.Ts.Table("virtual_warehouse"). Select("total_num, ver"). Scan(&Vir).Error) if Vir.TotalNum > info.Num { utils.Error(vir.Ts.Table("virtual_warehouse"). Where("ver = ?", Vir.Ver). Updates(map[string]interface{}{ "ver": gorm.Expr("ver + ?", 1), "total_num": gorm.Expr("total_num - ?", info.Num), }).Error) InfoAdd(info, "2") } else if Vir.TotalNum == info.Num { utils.Error(vir.Ts.Table("virtual_warehouse"). Where("ver = ?", Vir.Ver). Updates(map[string]interface{}{ "ver": gorm.Expr("ver + ?", 1), "warehouseStatus": 0, "total_num": gorm.Expr("total_num - ?", info.Num), }).Error) InfoAdd(info, "2") } else { return errors.New("仓库数量不足") } return nil } // 出入库列表添加 func InfoAdd(info *VirtualWarehouseInfo, Type string) { var a *gorm.DB var id string switch Type { case "1": id = "IN" + idGenerate.ID.Generate(idGenerate.Other) case "2": id = "OUT" + idGenerate.ID.Generate(idGenerate.Other) } f := model.TbVirtualWarehouseInfo{ InOutType: Type, //出入类型 1入库 2出库 InoutOrderNo: id, //出入库单号 InoutTime: time.Now().Unix(), //出入库时间 Status: "0", Ctime: time.Now().Unix(), Ver: 0, } utils.Error(copier.Copy(&f, info)) utils.Error(a.Table(model.TbSystemNotice{}.TableName()).Create(&f).Error) }

这段代码是关于虚拟仓库操作的函数。它定义了一个名为Virtual的结构体,并且有两个方法:VirtualWarehouseAdd和VirtualWarehouseDel,分别用于入库和出库操作。 在VirtualWarehouseAdd方法中,首先查询数据库中是否存在与传入参数相匹配的虚拟仓库记录。如果存在,则更新该记录的版本和总数量字段,并调用InfoAdd函数将相关信息添加到出入库列表中。如果不存在,则根据传入参数创建一个新的虚拟仓库记录,并将相关信息添加到出入库列表中。 在VirtualWarehouseDel方法中,首先查询数据库中是否存在与传入参数相匹配的虚拟仓库记录。如果存在,并且虚拟仓库的总数量大于要出库的数量,则更新该记录的版本和总数量字段,并调用InfoAdd函数将相关信息添加到出入库列表中。如果存在,并且虚拟仓库的总数量等于要出库的数量,则更新该记录的版本、仓库状态和总数量字段,并调用InfoAdd函数将相关信息添加到出入库列表中。如果不存在或者虚拟仓库的总数量小于要出库的数量,则返回一个错误。 InfoAdd函数用于将出入库相关信息添加到出入库列表中。根据传入的Type参数,生成一个唯一的出入库单号,并根据传入的info参数创建一个新的出入库记录,并将其保存到数据库中。 以上是关于虚拟仓库操作的一些代码逻辑。如果你有任何进一步的问题,请随时提出。
阅读全文

相关推荐

改进代码func TracingList(ctx *gin.Context) { resp := models.Response{ Code: 0, Msg: "success", } t, _ := strconv.Atoi(ctx.Query("t")) label, _ := strconv.Atoi(ctx.Query("label")) page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(ctx.DefaultQuery("pageSize", "10")) code := ctx.Query("code") //设施类型 if len(code) == 0 { resp.Code = 400 resp.Msg = "请输入code值" ctx.JSON(400, resp) return } type Total struct { gorm.Model Type int16 Source int16 Explanation string Label int16 FacilityID string } db := common.DB.Session(&gorm.Session{}) if t < 0 || t > 5 { var req interface{} switch t { case 0: req = []*Total{} case 1: req = []*models.Flaw{} case 2: req = []*models.Issue{} case 3: req = []*models.Record{} case 4: req = []*models.Quality{} case 5: req = []*models.Inspection{} } //查询并分页 if t < 1 || t > 5 { res := db.Scopes(models.Paginate(page, pageSize)).Where("facility_id=?", code).Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } } else { res := db.Scopes(models.Paginate(page, pageSize)).Raw("SELECT * FROM flaws WHERE facility_id = ? "+ "UNION SELECT * FROM issues WHERE facility_id = ? "+ "UNION SELECT * FROM records WHERE facility_id = ? "+ "UNION SELECT * FROM qualities WHERE facility_id = ? "+ "UNION SELECT * FROM inspections WHERE facility_id = ?", "code", "code", "code", "code", "code").Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } } resp.Data = req ctx.JSON(200, resp) } else if label < 1 || label > 4 { var req []*Total res := db.Scopes(models.Paginate(page, pageSize)).Raw("SELECT * FROM flaws WHERE label = ? "+ "UNION SELECT * FROM issues WHERE label = ? "+ "UNION SELECT * FROM records WHERE label = ? "+ "UNION SELECT * FROM qualities WHERE label = ? "+ "UNION SELECT * FROM inspections WHERE label = ?", "label", "label", "label", "label", "label").Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } resp.Data = req ctx.JSON(200, resp) } else { ctx.JSON(400, models.Response{ Code: 400, Msg: "参数有误", }) return } }

帮我写代码中文注释,并把写好注释的代码给我 package model import ( "database/sql/driver" "errors" "fmt" "math" "demo1/service/field/internal/pg" "encoding/json" "gorm.io/gorm" "gorm.io/gorm/schema" ) type Field struct { gorm.Model Uid uint gorm:"column:uid" json:"uid" Data JSONB gorm:"column:data" json:"data" } type JSONB json.RawMessage func (JSONB) GormDataType() string { return "jsonb" } func (JSONB) GormDBDataType(db *gorm.DB, field *schema.Field) string { switch db.Dialector.Name() { case "mysql": return "JSON" case "postgres": return "JSONB" } return "" } func (j JSONB) Value() (driver.Value, error) { if len(j) == 0 { return nil, nil } return string(j), nil } func (j *JSONB) Scan(value interface{}) error { if value == nil { *j = JSONB("null") return nil } var bytes []byte switch v := value.(type) { case []byte: if len(v) > 0 { bytes = make([]byte, len(v)) copy(bytes, v) } case string: bytes = []byte(v) default: return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) } result := json.RawMessage(bytes) *j = JSONB(result) return nil } func AddField(f *Field) error { if len(f.Data) == 0 { return errors.New("data is nil") } if err := checkUid(f.Uid); err != nil { return err } return pg.Client.Create(&f).Error } func Fields() ([]*Field, error) { fs := make([]*Field, 0) err := pg.Client.Find(&fs).Error return fs, err } func FieldsUid(uid uint) ([]*Field, error) { if err := checkUid(uid); err != nil { return nil, err } fs := make([]*Field, 0) err := pg.Client.Find(&fs, "uid = ?", uid).Error return fs, err } func FieldsLabel(label string) ([]*Field, error) { if err := checkLabel(label); err != nil { return nil, err } fs := make([]*Field, 0) err := pg.Client.Raw("select * from fields where data -> '__config__' ->> 'label' = ?; ", label).Scan(&fs).Error if err != nil { return nil, err } return fs, nil } func UpdateField(f *Field) error { if err := checkUid(f.Uid); err != nil { return err } newF := new(Field) if err := pg.Client.First(newF, "uid = ?", f.Uid).Error; err != nil { return errors.New("uid Data dont exist") } newF.Data = f.Data return pg.Client.Save(newF).Error } func DeleteField(f *Field) error { if err := checkUid(f.Uid); err != nil { return err } return pg.Client.Delete(f, "uid = ?", f.Uid).Error } func checkUid(uid uint) error { if uid < 0 || uid > math.MaxUint32 { return errors.New("uid dont conform to the rules") } return nil } func checkLabel(la string) error { if la == "" { return errors.New("label cant be nil") } return nil }

网站开发技术。 | | | type ExaReport struct { global.GVA_MODEL TableNames string json:"tableNames" form:"tableNames" gorm:"comment:报表类型" // 报表类型 Plate string json:"plate" form:"plate" gorm:"comment:所属板块" // 所属板块 StartTime *time.Time json:"startTime" form:"startTime" gorm:"comment:数据最早时间" // 数据最早时间 EndTime *time.Time json:"endTime" form:"endTime" gorm:"comment:数据最晚时间" // 数据最晚时间 UpdateAt *time.Time json:"updateAt" form:"updateAt" gorm:"comment:数据更新时间" UpdateOpinion string json:"updateOpinion" form:"updateOpinion" gorm:"comment:更新详细意见" StateCode string json:"stateCode" form:"stateCode" gorm:"comment:解析状态" SysUserID uint json:"sysUserId" form:"sysUserId" gorm:"comment:管理ID" // 管理ID SysUserAuthorityID uint json:"sysUserAuthorityID" form:"sysUserAuthorityID" gorm:"comment:管理角色ID" // 管理角色ID SysUser system.SysUser json:"sysUser" form:"sysUser" gorm:"comment:管理详情" // 管理详情 } func (exa *ReportService) DeleteReport(e example.ExaReport) (err error) { // 删除对应的用户意见数据 var tableName string err = global.GVA_DB.Model(&example.ExaReport{}).Where("id = ?", e.ID).Pluck("table_names", &tableName).Error if err != nil { return err } err = global.GVA_DB.Where("data_source = ?", tableName).Delete(&example.ExaUserOpinion{}).Error if err != nil { return err } // 删除报表数据 err = global.GVA_DB.Delete(&e).Error if err != nil { return err } return nil } 先通过id查询table_names以及plate的值,然后判断plate=用户意见板块或者质量测试板块 当plate=用户意见板块时,在表&example.ExaUserOpinion{}内删除data_source = tableName的数据, 当plate=质量测试板块时,在表&example.ExaUserOpinion{}内删除data_source = tableName的数据请帮我修改代码

最新推荐

recommend-type

utlog.sqlite

utlog.sqlite
recommend-type

钢结构原理课程设计:露顶式平面钢闸门设计任务及指南

内容概要:本文档为《钢结构原理》课程设计任务及指导书,主要面向水利水电工程专业的学生。详细介绍了课程设计的目的,旨在帮助学生掌握钢结构基本理论以及相关规范的使用方法,培养独立分析和解决实际工程问题的能力。提供了设计所需的背景资料,如提升式平面钢闸门的相关参数及其启动装置、选用材料等。具体的设计内容包括但不限于了解任务要求,确定结构形式,设计面板及各类梁的设计计算。同时提出了明确的设计要求和成果形式。 适合人群:水利水电工程专业的本科生或研究生,尤其是已学习过《钢结构原理》课程的学生。 使用场景及目标:通过本任务的学习和实践,学生能加深对钢结构设计理念的理解,在实际操作过程中学会应用国家最新规范进行结构设计计算,提升个人的专业能力和项目经验。 阅读建议:结合课本内容及相关行业规范认真阅读和准备设计方案,注意手绘图纸的质量和技术报告的撰写要求。
recommend-type

易语言例程:用易核心支持库打造功能丰富的IE浏览框

资源摘要信息:"易语言-易核心支持库实现功能完善的IE浏览框" 易语言是一种简单易学的编程语言,主要面向中文用户。它提供了大量的库和组件,使得开发者能够快速开发各种应用程序。在易语言中,通过调用易核心支持库,可以实现功能完善的IE浏览框。IE浏览框,顾名思义,就是能够在一个应用程序窗口内嵌入一个Internet Explorer浏览器控件,从而实现网页浏览的功能。 易核心支持库是易语言中的一个重要组件,它提供了对IE浏览器核心的调用接口,使得开发者能够在易语言环境下使用IE浏览器的功能。通过这种方式,开发者可以创建一个具有完整功能的IE浏览器实例,它不仅能够显示网页,还能够支持各种浏览器操作,如前进、后退、刷新、停止等,并且还能够响应各种事件,如页面加载完成、链接点击等。 在易语言中实现IE浏览框,通常需要以下几个步骤: 1. 引入易核心支持库:首先需要在易语言的开发环境中引入易核心支持库,这样才能在程序中使用库提供的功能。 2. 创建浏览器控件:使用易核心支持库提供的API,创建一个浏览器控件实例。在这个过程中,可以设置控件的初始大小、位置等属性。 3. 加载网页:将浏览器控件与一个网页地址关联起来,即可在控件中加载显示网页内容。 4. 控制浏览器行为:通过易核心支持库提供的接口,可以控制浏览器的行为,如前进、后退、刷新页面等。同时,也可以响应浏览器事件,实现自定义的交互逻辑。 5. 调试和优化:在开发完成后,需要对IE浏览框进行调试,确保其在不同的操作和网页内容下均能够正常工作。对于性能和兼容性的问题需要进行相应的优化处理。 易语言的易核心支持库使得在易语言环境下实现IE浏览框变得非常方便,它极大地降低了开发难度,并且提高了开发效率。由于易语言的易用性,即使是初学者也能够在短时间内学会如何创建和操作IE浏览框,实现网页浏览的功能。 需要注意的是,由于IE浏览器已经逐渐被微软边缘浏览器(Microsoft Edge)所替代,使用IE核心的技术未来可能面临兼容性和安全性的挑战。因此,在实际开发中,开发者应考虑到这一点,并根据需求选择合适的浏览器控件实现技术。 此外,易语言虽然简化了编程过程,但其在功能上可能不如主流的编程语言(如C++, Java等)强大,且社区和技术支持相比其他语言可能较为有限,这些都是在选择易语言作为开发工具时需要考虑的因素。 文件名列表中的“IE类”可能是指包含实现IE浏览框功能的类库或者示例代码。在易语言中,类库是一组封装好的代码模块,其中包含了各种功能的实现。通过在易语言项目中引用这些类库,开发者可以简化开发过程,快速实现特定功能。而示例代码则为开发者提供了具体的实现参考,帮助理解和学习如何使用易核心支持库来创建IE浏览框。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

STM32F407ZG引脚功能深度剖析:掌握引脚分布与配置的秘密(全面解读)

![STM32F407ZG引脚功能深度剖析:掌握引脚分布与配置的秘密(全面解读)](https://tapit.vn/wp-content/uploads/2019/01/cubemx-peripheral-1024x545.png) # 摘要 本文全面介绍了STM32F407ZG微控制器的引脚特性、功能、配置和应用。首先概述了该芯片的引脚布局,然后详细探讨了标准外设、高级控制以及特殊功能引脚的不同配置和使用方法。在此基础上,文章深入分析了引脚模式配置、高级配置技巧,并提供了实际应用案例,如LED控制和串口通信。在设计方面,阐述了引脚布局策略、多层板设计及高密度引脚应用的解决方案。最后,介绍
recommend-type

给出文档中问题的答案代码

您提到的是需要编写MATLAB代码来实现文档中的实验任务。以下是根据文档内容编写的MATLAB代码示例: ```matlab % 上机2 实验代码 % 读取输入图像 inputImage = imread('your_face_image.jpg'); % 替换为您的图像文件路径 if size(inputImage, 1) < 1024 || size(inputImage, 2) < 1024 error('图像尺寸必须大于1024x1024'); end % 将彩色图像转换为灰度图像 grayImage = rgb2gray(inputImage); % 调整图像大小为5
recommend-type

Docker构建与运行Next.js应用的指南

资源摘要信息:"rivoltafilippo-next-main" 在探讨“rivoltafilippo-next-main”这一资源时,首先要从标题“rivoltafilippo-next”入手。这个标题可能是某一项目、代码库或应用的命名,结合描述中提到的Docker构建和运行命令,我们可以推断这是一个基于Docker的Node.js应用,特别是使用了Next.js框架的项目。Next.js是一个流行的React框架,用于服务器端渲染和静态网站生成。 描述部分提供了构建和运行基于Docker的Next.js应用的具体命令: 1. `docker build`命令用于创建一个新的Docker镜像。在构建镜像的过程中,开发者可以定义Dockerfile文件,该文件是一个文本文件,包含了创建Docker镜像所需的指令集。通过使用`-t`参数,用户可以为生成的镜像指定一个标签,这里的标签是`my-next-js-app`,意味着构建的镜像将被标记为`my-next-js-app`,方便后续的识别和引用。 2. `docker run`命令则用于运行一个Docker容器,即基于镜像启动一个实例。在这个命令中,`-p 3000:3000`参数指示Docker将容器内的3000端口映射到宿主机的3000端口,这样做通常是为了让宿主机能够访问容器内运行的应用。`my-next-js-app`是容器运行时使用的镜像名称,这个名称应该与构建时指定的标签一致。 最后,我们注意到资源包含了“TypeScript”这一标签,这表明项目可能使用了TypeScript语言。TypeScript是JavaScript的一个超集,它添加了静态类型定义的特性,能够帮助开发者更容易地维护和扩展代码,尤其是在大型项目中。 结合资源名称“rivoltafilippo-next-main”,我们可以推测这是项目的主目录或主仓库。通常情况下,开发者会将项目的源代码、配置文件、构建脚本等放在一个主要的目录中,这个目录通常命名为“main”或“src”等,以便于管理和维护。 综上所述,我们可以总结出以下几个重要的知识点: - Docker容器和镜像的概念以及它们之间的关系:Docker镜像是静态的只读模板,而Docker容器是从镜像实例化的动态运行环境。 - `docker build`命令的使用方法和作用:这个命令用于创建新的Docker镜像,通常需要一个Dockerfile来指定构建的指令和环境。 - `docker run`命令的使用方法和作用:该命令用于根据镜像启动一个或多个容器实例,并可指定端口映射等运行参数。 - Next.js框架的特点:Next.js是一个支持服务器端渲染和静态网站生成的React框架,适合构建现代的Web应用。 - TypeScript的作用和优势:TypeScript是JavaScript的一个超集,它提供了静态类型检查等特性,有助于提高代码质量和可维护性。 - 项目资源命名习惯:通常项目会有一个主目录,用来存放项目的源代码和核心配置文件,以便于项目的版本控制和团队协作。 以上内容基于给定的信息进行了深入的分析,为理解该项目的构建、运行方式以及技术栈提供了基础。在实际开发中,开发者应当参考更详细的文档和指南,以更高效地管理和部署基于Docker和TypeScript的Next.js项目。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

【热传递模型的终极指南】:掌握分类、仿真设计、优化与故障诊断的18大秘诀

![热传递模型](https://study.com/cimages/videopreview/radiation-heat-transfer-the-stefan-boltzmann-law_135679.png) # 摘要 热传递模型在工程和物理学中占有重要地位,对于提高热交换效率和散热设计至关重要。本文系统性地介绍了热传递模型的基础知识、分类以及在实际中的应用案例。文章详细阐述了导热、对流换热以及辐射传热的基本原理,并对不同类型的热传递模型进行了分类,包括稳态与非稳态模型、一维到三维模型和线性与非线性模型。通过仿真设计章节,文章展示了如何选择合适的仿真软件、构建几何模型、设置材料属性和
recommend-type

python经典题型和解题代码

Python的经典题型通常涵盖了基础语法、数据结构、算法、函数式编程、文件操作、异常处理以及网络爬虫等内容。以下是一些常见的题目及其简单示例: 1. **基础题**: - 示例:打印九九乘法表 ```python for i in range(1, 10): print(f"{i} * {i} = {i*i}") ``` 2. **数据结构**: - 示例:实现队列(使用列表) ```python class Queue: def __init__(self):